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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:21:21