Twitch bot多频道接入时仅在单个频道发消息的实现问题
Twitch Bot 频道优先级切换实现方案
核心逻辑
- 维持原有的3个频道连接,不需要频繁断开/重连频道
- 按
#Pok1>#Pok2>#Pok3的顺序设置频道优先级 - 定时拉取所有频道的直播在线状态,始终取优先级最高的在线频道作为激活工作频道
- 消息处理逻辑仅对激活工作频道的消息生效,其余频道的消息直接忽略
前置准备
提前准备Twitch开发者应用的Client ID、带user:read:broadcast权限的用户访问令牌,补充到settings.json中,settings.json参考结构如下:
{ "username": "你的bot用户名", "password": "你的bot OAuth密码", "twitchClientId": "你的Twitch开发者应用Client ID", "twitchAccessToken": "你的Twitch用户访问令牌" }
完整实现代码
const tmi = require('tmi.js'); const axios = require('axios'); const { username, password, twitchClientId, twitchAccessToken } = require('./settings.json'); // 按优先级排序的频道列表 const PRIORITY_CHANNELS = ['#Pok1', '#Pok2', '#Pok3']; // 存储频道在线状态,key为频道名,value为是否在线 let channelOnlineStatus = {}; // 当前激活的工作频道 let activeChannel = PRIORITY_CHANNELS[0]; const options = { options: { debug: true }, connection: { reconnect: true, secure: true }, identity: { username, password }, channels: PRIORITY_CHANNELS }; const client = new tmi.Client(options); client.connect().catch(console.error); // 定时刷新频道在线状态,每30秒检查一次,可自行调整间隔 setInterval(updateChannelOnlineStatus, 30 * 1000); // 启动时先执行一次状态检查 updateChannelOnlineStatus(); // 调用Twitch Helix API查询频道直播状态 async function updateChannelOnlineStatus() { try { // 提取频道名去掉#号,用于API查询 const userLogins = PRIORITY_CHANNELS.map(chan => chan.slice(1)); const res = await axios.get('https://api.twitch.tv/helix/streams', { params: { user_login: userLogins }, headers: { 'Client-ID': twitchClientId, 'Authorization': `Bearer ${twitchAccessToken}` } }); // 重置状态 PRIORITY_CHANNELS.forEach(chan => channelOnlineStatus[chan] = false); // 标记在线的频道 res.data.data.forEach(stream => { const chanName = `#${stream.user_login.toLowerCase()}`; channelOnlineStatus[chanName] = true; }); // 按优先级查找第一个在线的频道作为激活频道 for (const chan of PRIORITY_CHANNELS) { if (channelOnlineStatus[chan]) { activeChannel = chan; break; } } } catch (err) { console.error('频道状态查询失败:', err); } } client.on('connected', () => { console.log(`Bot已连接,当前激活频道: ${activeChannel}`); }); client.on('message', (channel, user, message, self) => { if(self) return; // 仅处理激活频道的消息 if (channel !== activeChannel) return; if(user.username === 'asd' && message === "zxc") { client.say(channel, 'abc'); } });
代码改动说明
- 新增了优先级频道常量、频道状态存储变量、当前激活频道变量,统一管理状态
- 新增了定时调用Twitch API查询频道直播状态的逻辑,自动更新激活频道
- 在消息处理逻辑最前面加了频道判断,非激活频道的消息直接跳过
- 依赖需要额外安装
axios用于发送API请求,执行npm i axios即可安装
内容的提问来源于stack exchange,提问作者Cortex
相关产品推荐
相关产品推荐

