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

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');
  }
}); 

代码改动说明

  1. 新增了优先级频道常量、频道状态存储变量、当前激活频道变量,统一管理状态
  2. 新增了定时调用Twitch API查询频道直播状态的逻辑,自动更新激活频道
  3. 在消息处理逻辑最前面加了频道判断,非激活频道的消息直接跳过
  4. 依赖需要额外安装axios用于发送API请求,执行npm i axios即可安装

内容的提问来源于stack exchange,提问作者Cortex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:03