Twitch聊天机器人无法执行Timeout/Ban操作的技术求助
问题排查与解决方案
1. 确认机器人账号权限
Twitch的timeout/ban操作要求机器人账号必须是目标频道的主播或管理员(Moderator):
- 登录机器人账号进入目标频道,确认账号拥有管理员权限(可通过频道设置的用户管理查看);
- 若使用非主播账号作为机器人,需要主播手动给该账号授予管理员权限。
2. 修复未处理的Promise错误
client.timeout和client.say都是异步Promise方法,原代码未处理异步逻辑,导致未捕获的Promise拒绝错误。需添加await等待执行,并通过try/catch捕获异常:
修改后的消息监听代码:
client.on('message', async (channel, tags, message, self) => { if (self) return; console.log(`${tags['display-name']}: ${message}`); console.log(tags.username); const forbiddenWords = ['test1', 'test2', 'test3']; // 匹配包含违规词的消息,忽略大小写 const hasForbiddenWord = forbiddenWords.some(word => message.toLowerCase().includes(word.toLowerCase()) ); if (hasForbiddenWord) { const timeoutReason = `Explicit language: ${message}`; try { await client.timeout(channel, tags.username, 10, timeoutReason); await client.say(channel, `You got timed out for using explicit language! @${tags.username}`); console.log(`${tags.username} has been timed out for: "${message}"!`); } catch (err) { console.error('操作执行失败:', err); } } });
3. 优化违规词匹配逻辑
原代码仅匹配完全等于违规词的消息(比如用户只发test1才触发),实际场景应匹配包含违规词的内容。上述代码用some+includes实现了包含匹配,并添加大小写忽略,更符合需求。
4. 修正/timeout命令格式(若用client.say发送命令)
如果选择通过client.say发送Twitch原生命令,注意:
- 不需要加
@,直接使用用户名:/timeout ${tags.username} 10 - 确保频道参数是带
#的格式(比如#mychannel)
示例代码:
// 替代client.timeout的命令发送方式 await client.say(channel, `/timeout ${tags.username} 10 ${timeoutReason}`);
额外检查点
- 确认OAuth令牌权限:生成的令牌需包含
moderation:read和moderation:manage权限,若权限不足需重新生成; - 确认机器人连接频道正确:
client.join('#频道名')中的频道名需与目标频道一致,且为小写格式。
内容的提问来源于stack exchange,提问作者Anuin
相关产品推荐
相关产品推荐

