调用Steam库存API持续返回429错误的问题求助
问题分析与解决方案
核心问题拆解
你遇到的429错误是Steam反爬机制拦截了请求,原因包括:
- 请求缺少浏览器环境的关键请求头(如
User-Agent),Steam识别为非合法浏览器请求并限制访问 - 自定义Hook
useAxios写法不规范,未返回Promise,导致组件内的异步逻辑完全失效 - 服务器端Axios请求的
withCredentials配置位置错误,无法正确传递必要的会话信息
分步修复
1. 修正useAxios.tsx的写法(若坚持前端直接请求)
自定义Hook需返回Promise,同时添加浏览器风格请求头模拟正常访问:
import axios from 'axios' const useAxios = (id: string) => { // 返回Promise以支持组件内的then/catch链式调用 return axios.get(`https://steamcommunity.com/inventory/${id}/730/2?l=english&count=2000`, { headers: { // 模拟Chrome浏览器的User-Agent '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' } }) } export default useAxios;
2. 修复服务器端server.ts的请求配置
服务器端请求必须模拟浏览器请求头,同时修正withCredentials的配置位置(它是Axios顶级配置项,不在headers内):
import { Request, Response } from "express"; import axios from 'axios'; import cors from 'cors'; import express from 'express'; const app = express() app.use(cors()) const PORT = 3001; app.listen(PORT, () => { console.log(`Server listening on ${PORT}`); app.get('/api/getGameInventory/', async (req: Request, res: Response) => { try { const result = await axios.get(`https://steamcommunity.com/inventory/${req.query['id']}/730/2?l=english&count=2000`, { withCredentials: true, headers: { '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', // 可选:添加Referer增强请求合法性 'Referer': `https://steamcommunity.com/profiles/${req.query['id']}/` } }); res.send(result.data); } catch (err: any) { const status = err.response?.status || 500; res.status(status).send({ message: err.message }); } }) });
3. 调整前端请求逻辑(推荐使用服务器代理)
直接从前端请求Steam接口易触发跨域和反爬,建议改为调用自身服务器的代理接口:
修改InputField.tsx的handleSubmit方法:
import axios from 'axios'; // ...其他代码保持不变 const handleSubmit = async (event: any) => { event.preventDefault(); if (!accountId) { setError('NO_INPUT'); return; } setIsLoading(true); try { // 调用自己的服务器代理接口 const result = await axios.get(`/api/getGameInventory/?id=${accountId}`); console.log(result); setIsLoading(false); } catch (err: any) { console.log(err); setErrorStatus(err.response?.status || 0); setError(err.response?.data?.message || err.code); setIsLoading(false); } }
同时移除对自定义useAxios的依赖。
额外注意事项
- Steam反爬会根据IP频率限制,测试时避免短时间内重复请求,必要时更换IP或延长间隔
- 若请求私人库存,需确保用户已登录Steam,且服务器端请求携带有效登录Cookie
- 严格遵守Steam服务条款,避免过度请求导致IP被永久封禁
内容的提问来源于stack exchange,提问作者Zaweb
相关产品推荐
相关产品推荐

