Steam Web API IPlayerService约60次请求后返回空响应问题
问题现象
- 用于跟踪个人游戏时长的Python脚本,默认每30秒调用Steam Web API拉取数据,累计发起约60次接口调用后,接口返回完全为空的响应
- 已排除每日100000次全局调用上限的影响:将请求间隔先后调整为60秒、5分钟测试,依然会在累计约60次调用后返回空响应
- 异常仅出现在
IPlayerService分类下的接口,所用第三方steam库的HTTP调用逻辑和requests库逻辑基本一致,空响应会导致脚本触发KeyError异常中断
问题复现代码
from steam.webapi import WebAPI from time import sleep api = WebAPI(API_KEY, raw=False, format='json', https=True, http_timeout=10) def game_data(steamids): data = api.call('IPlayerService.GetOwnedGames', appids_filter=None, include_appinfo=True, include_free_sub=True, include_played_free_games=True, steamid=steamids) return data['response']['games'] while True: g_data = game_data(steamids) playtime = [] for i in g_data: playtime.append(i['playtime_forever']) print(playtime) sleep(30)
接口异常返回示例
{"response":{}}
修复方案
- 先补全基础容错逻辑:现有代码直接读取
data['response']['games']未做判空,遇到空响应必然抛出KeyError。先增加字段存在性校验,检测到返回结果中不存在games字段时,不要直接终止脚本,进入重试流程。 - 该问题触发原因是Steam针对
GetOwnedGames接口设置的未公开单接口粒度限流,和每日10万次的全局调用配额无关:连续请求全量已拥有游戏数据时,无论请求间隔设置多长,累计约60次请求后接口就会临时返回空响应,单次屏蔽时长通常为5-10分钟。 - 针对性优化请求逻辑,降低限流触发概率:
- 不需要每次请求都携带
include_appinfo=True参数:游戏名称、图标这类基础信息是固定不变的,首次拉取后缓存到本地即可,日常轮询游戏时长时将该参数设为False,既可以减小接口返回包体积,也能明显降低限流触发概率 - 加入指数退避重试机制:检测到空响应时,不要按照原有固定间隔继续发起请求,逐步拉长等待时长,比如第一次等待1分钟、第二次等待2分钟,最长等待10分钟,直到接口返回正常数据后再恢复常规轮询节奏
- 取消无意义的高频请求:个人游戏时长属于更新频率极低的数据,将轮询间隔从30秒调整为5-10分钟完全可以满足使用需求,同时能大幅减少累计请求次数
- 不需要每次请求都携带
- 兜底方案:如果调整参数后依然频繁触发限流,可以换用不需要API密钥的Steam公开社区接口拉取数据,或者直接读取本地Steam客户端存储的游戏时长缓存文件,完全绕过Web API限流规则。
内容的提问来源于stack exchange,提问作者Itsjul1an
相关产品推荐
相关产品推荐

