Node.js调用Twitch API检测直播状态返回400错误求助
Twitch直播间状态检测接口400错误修复
错误原因
- 你调用的
kraken是Twitch已经完全下线的旧版API,所有旧接口请求都会直接被拦截返回错误 fetch传参格式错误:你直接将headers对象作为fetch的第二个参数传入,实际上headers需要包裹在配置对象的headers字段下,当前请求根本没有带上你配置的Client-ID头- 旧版接口传频道名的规则在新版API中不再适用,新版Helix API查询直播状态需要使用用户ID而非频道名,且鉴权要求同时携带Client-ID和Bearer格式的授权Token
修复方案
- 调整授权Token格式:将你配置的OAUTH_TOKEN前缀从
oauth:替换为Bearer - 使用Twitch当前正式支持的Helix版API接口,先通过频道名获取对应用户ID,再查询用户的直播状态
- 修正fetch请求的参数结构,正确携带请求头
可直接运行的修复后代码
const CHANNEL_NAME = ["daXXXXXX", "gmXXXXXXX"]; const OAUTH_TOKEN = 'bn1rXXXXXXXXXXXXXXXXX'; // 去掉原有的oauth:前缀 const CLIENT_ID = 'bxqtXXXXXXXXXXXXXXXXX'; async function checkStreamStatus(channelName) { // 1. 先根据频道名获取用户ID const userRes = await fetch(`https://api.twitch.tv/helix/users?login=${channelName}`, { headers: { "Client-ID": CLIENT_ID, "Authorization": `Bearer ${OAUTH_TOKEN}` } }); const userData = await userRes.json(); if (!userData.data?.length) { throw new Error(`未找到频道:${channelName}`); } const userId = userData.data[0].id; // 2. 根据用户ID查询直播状态 const streamRes = await fetch(`https://api.twitch.tv/helix/streams?user_id=${userId}`, { headers: { "Client-ID": CLIENT_ID, "Authorization": `Bearer ${OAUTH_TOKEN}` } }); const streamData = await streamRes.json(); // 返回结果:isLive为true表示正在直播,false表示未开播 return { channelName, isLive: streamData.data?.length > 0, streamInfo: streamData.data?.[0] || null } } // 测试调用 async function test() { const status = await checkStreamStatus(CHANNEL_NAME[0]); console.log(status); } test()
返回结果说明
- 若
isLive为true,streamInfo中会包含直播标题、游戏分类、观众数、开播时间等信息 - 若
isLive为false,说明当前频道未处于直播状态
注意:如果调用接口返回401错误,检查你的Client-ID和OAuth Token是否匹配,Token是否有对应的接口权限。批量查询多个频道状态时,可以把多个user_id拼到请求参数里,减少接口请求次数。
内容的提问来源于stack exchange,提问作者gagore
相关产品推荐
相关产品推荐

