使用IGDB API通过URL/Slug获取游戏信息时遇语法错误求助
通过IGDB URL或Slug查询游戏信息时触发400语法错误
我在使用Python调用IGDB API获取游戏信息时遇到问题:仅持有目标游戏的IGDB URL,没有对应ID,用ID查询能正常返回结果,但尝试用URL或Slug作为查询条件时,接口返回400状态码并提示语法错误。
我的代码如下:
token = get_token() client_id = "my id" headers = {"Client-ID":client_id, "Authorization":"Bearer " + token['access_token'], "Content-Type":"application/x-www-form-urlencoded"} # slug = url.split("/games/")[1] # data = "fields *, cover.url, videos.video_id, release_dates.human; where slug = '"+slug+"';" data = "fields *, cover.url, videos.video_id, release_dates.human; where url = '"+url+"';" response = requests.post("https://api.igdb.com/v4/games", headers=headers, data=data) game_info = json.loads(response.content.decode('utf-8'))
接口返回的错误信息:
[{'title': 'Syntax Error', 'status': 400, 'cause': "Expecting a STRING as input, surround your input with quotes starting at 'https' expecting {'{', 'f', '(', '[', 'true', 't', 'false', 'null', 'n'}"}]
问题根源
IGDB API的查询DSL要求字符串类型的查询值必须用双引号包裹,你用了单引号导致语法解析失败。
修正后的代码
方案1:用Slug查询(推荐,更稳定)
Slug是IGDB游戏的唯一标识字段,从URL中提取后用双引号包裹:
token = get_token() client_id = "my id" headers = { "Client-ID": client_id, "Authorization": f"Bearer {token['access_token']}", "Content-Type": "application/x-www-form-urlencoded" } # 示例URL:https://www.igdb.com/games/elden-ring url = "https://www.igdb.com/games/elden-ring" slug = url.split("/games/")[1] # 用双引号包裹slug值 data = f"fields *, cover.url, videos.video_id, release_dates.human; where slug = \"{slug}\";" response = requests.post("https://api.igdb.com/v4/games", headers=headers, data=data) game_info = json.loads(response.content.decode('utf-8'))
方案2:用URL查询
如果必须用URL查询,同样需要将URL用双引号包裹:
token = get_token() client_id = "my id" headers = { "Client-ID": client_id, "Authorization": f"Bearer {token['access_token']}", "Content-Type": "application/x-www-form-urlencoded" } url = "https://www.igdb.com/games/elden-ring" # 用双引号包裹URL值 data = f"fields *, cover.url, videos.video_id, release_dates.human; where url = \"{url}\";" response = requests.post("https://api.igdb.com/v4/games", headers=headers, data=data) game_info = json.loads(response.content.decode('utf-8'))
额外提示
- 优先使用slug查询:IGDB的URL可能包含额外跟踪参数,直接截取容易出错,而slug是游戏的固定标识字段,更可靠。
- 用f-string拼接查询语句:避免手动拼接字符串时的引号嵌套问题,代码更易维护。
内容的提问来源于stack exchange,提问作者TCombu
相关产品推荐
相关产品推荐

