使用MSXML.HTTP调用WebAPI时遇Error 429请求过多问题排查
MSXML调用Steam API返回429错误的问题解决
问题背景
使用MSXML2.XMLHTTP.6.0调用Steam库存API时,每次请求都会触发429(请求过多)错误,但将相同URL粘贴到浏览器中能立即获取正常响应。怀疑MSXML请求是从微软集中服务器发出,导致IP被封禁,想确认是否能指定请求IP,以及代理是否是唯一解决办法。已验证API密钥并非该请求必需项,添加后问题依旧。
核心分析
你的猜测错误:MSXML的HTTP请求是从本地机器的IP地址发出的,并非微软集中服务器。429错误的核心原因是MSXML默认请求头与浏览器差异过大,Steam API对非浏览器请求做了频率限制或拦截。
解决方法
1. 补全请求头,模拟浏览器请求
Steam API会校验请求头中的User-Agent、Accept等字段,MSXML默认请求头过于简单,容易被识别为非合法请求。在.send前添加以下请求头设置:
Dim urlAPISteam As String Dim parametersSteam As String Dim url As String Dim clientID As String clientID = 76561197960361544 urlAPISteam = "https://steamcommunity.com/inventory/" parametersSteam = clientID & "/730/2?l=english&count=1" url = urlAPISteam & parametersSteam With CreateObject("MSXML2.XMLHTTP.6.0") .Open "Get", url, False ' 添加浏览器风格请求头 .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" .setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" .setRequestHeader "Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" .send 'Error Handle If .Status <> 200 Then MsgBox "Statuscode: " & .Status & " Message: " & .responseText Exit Sub End If Dim response As Collection Set response = JsonConverter.ParseJson(.responseText) End With
2. 检查本地IP的请求频率限制
可能之前的测试请求已导致本地IP被Steam临时限制,而浏览器因缓存或已建立会话能正常返回结果。可暂停一段时间后再测试,或更换网络环境验证。
3. 关于指定请求IP
MSXML本身无直接指定请求IP的属性。若本地有多网卡/多IP,可通过系统路由配置或使用WinHTTP组件(支持绑定特定IP)实现,但操作复杂度较高,优先尝试前两种方法。
4. 代理并非唯一解决途径
补全请求头是最直接有效的解决方式,仅当前两种方法无效时,再考虑使用代理方案。
内容的提问来源于stack exchange,提问作者n3tw4rri0r
相关产品推荐
相关产品推荐

