Twitch IRC集成:NAMES命令返回421错误,如何获取频道用户列表?
嘿,我帮你搞定这个Twitch IRC获取在线用户列表的问题!你遇到的421 Unknown Command错误其实是因为Twitch对NAMES命令的要求和标准IRC不太一样,加上几个小调整就能解决:
1. 修正NAMES命令的格式
Twitch IRC要求NAMES命令必须指定目标频道,不能直接发裸的NAMES。正确的格式是:
NAMES #你的频道名
你之前的names方法里只发了NAMES,没有带频道参数,所以服务器才返回未知命令错误。
2. 确保membership权限已生效
你已经在onOpen里发送了CAP REQ :twitch.tv/membership,这步是对的——这个权限是获取用户列表的前提。不过可以在onMessage里加个监听,确认Twitch已经确认了这个权限:
// 在onMessage的条件判断里加这个分支 else if(parsed.command === "CAP") { console.log('权限确认:', parsed.message); }
当Twitch返回CAP * ACK :twitch.tv/membership时,就说明权限生效了。
3. 修改你的names方法
把原来的names方法改成带频道参数的版本:
chatClient.prototype.names = function names(){ var socket = this.webSocket; if (socket !== null && socket.readyState === 1) { // 带上频道名发送NAMES命令 socket.send('NAMES ' + this.channel); } }
4. 处理NAMES的响应结果
当服务器收到正确的NAMES命令后,会返回两个关键响应:
353:包含当前频道的在线用户列表(可能分批返回)366:表示用户列表已经发送完毕
你需要在onMessage里添加这两个命令的处理逻辑,比如:
chatClient.prototype.onMessage = function onMessage(message){ if(message !== null){ var parsed = this.parseMessage(message.data); if(parsed !== null){ console.log(parsed) if(parsed.command === "PRIVMSG") { // 你的积分统计逻辑保持不变 userPoints = localStorage.getItem(parsed.username); if(userPoints === null){ localStorage.setItem(parsed.username, 10); } else { localStorage.setItem(parsed.username, parseFloat(userPoints) + 0.25); } } else if(parsed.command === "PING") { this.webSocket.send("PONG :" + parsed.message); } else if(parsed.command === "353") { // 解析用户列表,split后得到用户数组 var onlineUsers = parsed.message.trim().split(' '); console.log('当前在线用户:', onlineUsers); // 这里可以把用户列表渲染到你的UI里 } else if(parsed.command === "366") { console.log('用户列表已全部加载完成'); } } } };
小提示
- 你的
parseMessage方法已经能处理353这类命令的结构,但可以测试一下如果解析出问题的话,稍微调整一下切割逻辑。 - Twitch可能会把大量用户分成多个
353响应返回,所以一定要等366再确认列表完整。
内容的提问来源于stack exchange,提问作者Blake Yarbrough
相关产品推荐
相关产品推荐

