You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Betfair API获取MATCH_ODDS、价格及Inplay数据?代码求助

解决Betfair API获取MATCH_ODDS、价格及盘中数据的问题

嘿,我看你现在的代码调用的是listMarketTypes方法,这就是问题所在啦——这个方法本来就只是返回符合过滤条件的市场类型列表(比如网球的MATCH_ODDS、SET_HANDICAP这类),不会给你具体的赛事赔率、价格或者盘中数据。要拿到你想要的信息,得分两步走:先获取目标赛事的市场ID,再用这个ID去拉取详细的赔率和实时数据。

第一步:获取目标赛事的市场ID(用listMarketCatalogue)

这个方法能帮你筛选出符合条件的赛事,并返回市场ID、赛事名称等基础信息。你可以指定过滤条件(比如只看网球、只看盘中赛事),以及需要返回的字段。

第二步:获取具体的赔率和盘中数据(用listMarketBook)

拿到市场ID后,用这个方法就能拉取对应市场的实时价格、赔率状态等详细数据了。

修改后的完整代码示例

import requests
import json

# 替换成你的APP_KEY和SESSION_TOKEN
header = {
    'X-Application': 'APP_KEY_HERE',
    'X-Authentication': 'SESSION_TOKEN',
    'content-type': 'application/json'
}
url = "https://api.betfair.com/exchange/betting/json-rpc/v1"

# 第一步:获取网球的盘中MATCH_ODDS市场ID列表
list_market_catalogue_req = {
    "jsonrpc": "2.0",
    "method": "SportsAPING/v1.0/listMarketCatalogue",
    "params": {
        "filter": {
            "textQuery": "Tennis",
            "inPlayOnly": True,  # 只获取盘中赛事
            "marketTypeCodes": ["MATCH_ODDS"]  # 指定只看胜负赔率市场
        },
        "maxResults": 10,  # 按需调整返回的赛事数量
        "sort": "FIRST_TO_START",
        "marketProjection": ["MARKET_START_TIME", "RUNNER_DESCRIPTION"]
    },
    "id": 1
}

response = requests.post(url, data=json.dumps(list_market_catalogue_req), headers=header)
market_catalogues = json.loads(response.text)["result"]

# 提取市场ID列表
market_ids = [catalogue["marketId"] for catalogue in market_catalogues]
if not market_ids:
    print("没有找到符合条件的赛事市场")
else:
    # 第二步:获取这些市场的详细赔率和价格数据
    list_market_book_req = {
        "jsonrpc": "2.0",
        "method": "SportsAPING/v1.0/listMarketBook",
        "params": {
            "marketIds": market_ids,
            "priceProjection": {
                "priceData": ["EX_BEST_OFFERS"]  # 获取最优买卖盘价格
            },
            "orderProjection": "NO_ROLLUP"
        },
        "id": 1
    }

    book_response = requests.post(url, data=json.dumps(list_market_book_req), headers=header)
    market_books = json.loads(book_response.text)["result"]

    # 解析并打印数据
    for idx, book in enumerate(market_books):
        catalogue = market_catalogues[idx]
        print(f"赛事名称: {catalogue['event']['name']}")
        print(f"开赛时间: {catalogue['marketStartTime']}")
        print("当前赔率:")
        for runner in book["runners"]:
            runner_name = next(r["runnerName"] for r in catalogue["runners"] if r["selectionId"] == runner["selectionId"])
            best_back_price = runner["ex"]["availableToBack"][0]["price"] if (runner.get("ex") and runner["ex"].get("availableToBack")) else "无数据"
            best_lay_price = runner["ex"]["availableToLay"][0]["price"] if (runner.get("ex") and runner["ex"].get("availableToLay")) else "无数据"
            print(f"  {runner_name}: 买盘最优价 {best_back_price}, 卖盘最优价 {best_lay_price}")
        print("---")

代码说明

  • listMarketCatalogue的filter里:
    • inPlayOnly: True 确保只拉取正在进行的盘中赛事
    • marketTypeCodes: ["MATCH_ODDS"] 限定只获取胜负赔率市场
  • listMarketBook的priceProjection里:
    • priceData: ["EX_BEST_OFFERS"] 获取当前最优的买卖盘价格,你也可以根据需要添加EX_ALL_OFFERS来获取所有档位的价格
  • 解析数据时,通过selectionId关联赛事名称和对应的赔率数据,这样就能清晰看到每个选手的实时价格了

内容的提问来源于stack exchange,提问作者ade desmond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:55:36