如何通过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
相关产品推荐
相关产品推荐

