Python开发Twitch私信机器人无法发送Whisper问题求助
Twitch私信机器人无法发送消息的问题解决
问题背景
我是Python新手,帮朋友开发Twitch私信机器人,代码能成功连接Twitch服务器(终端显示连接成功的欢迎信息),但目标用户收不到私信。尝试过移除缓冲区、更换账号昵称、修改主机和频道都没用,求解决。
原代码
HOST = 'irc.twitch.tv' PORT = 6667 USER = 'bot name' PASS = 'oauth:xxxxxxxxxx' CHAN = 'channel here' def abrirSocket(): s = socket.socket() s.connect((HOST, PORT)) message = "PASS " + PASS + "\r\n" s.send(message.encode('utf-8')) message = "NICK " + USER + "\r\n" s.send(message.encode('utf-8')) message = "JOIN #" + CHAN + "\r\n" s.send(message.encode('utf-8')) return s def fecharSocket(s): s.close() def entrar(s): readbuffer = "" Loading = True while Loading: readbuffer = readbuffer + s.recv(1024).decode() temp = readbuffer.split('\n') readbuffer = temp.pop() for line in temp: print(line) Loading = terminou(line) def terminou(line): if("End of /NAMES list" in line): return False else: return True def enviar_key(s, usuario, mensagem): entrar(s) montarMSG = f'PRIVMSG jtv :/w {usuario} {mensagem}' s.send(montarMSG.encode('utf-8')) fecharSocket(s) sys.exit() enviar_key(abrirSocket(), "margoni_", "aaaaa")
终端输出
:tmi.twitch.tv 001 previabot :Welcome, GLHF! :tmi.twitch.tv 002 previabot :Your host is tmi.twitch.tv :tmi.twitch.tv 003 previabot :This server is rather new :tmi.twitch.tv 004 previabot :- :tmi.twitch.tv 375 previabot :- :tmi.twitch.tv 372 previabot :You are in a maze of twisty passages, all alike. :tmi.twitch.tv 376 previabot :>
解决办法
1. 修复IRC消息格式
Twitch IRC要求每条命令必须以\r\n结尾,原代码中发送私信的消息缺少这个结尾,导致服务器无法解析。修改enviar_key函数:
def enviar_key(s, usuario, mensagem): entrar(s) # 添加\r\n结尾,符合IRC协议要求 montarMSG = f'PRIVMSG jtv :/w {usuario} {mensagem}\r\n' s.send(montarMSG.encode('utf-8')) fecharSocket(s) sys.exit()
2. 添加PING/PONG心跳处理
Twitch会定期发送PING指令检测连接状态,如果机器人不回复PONG,连接会被强制断开。在entrar函数中添加处理逻辑:
def entrar(s): readbuffer = "" Loading = True while Loading: readbuffer = readbuffer + s.recv(1024).decode() temp = readbuffer.split('\n') readbuffer = temp.pop() for line in temp: print(line) # 响应PING命令,维持连接 if line.strip().startswith('PING'): pong_msg = line.replace('PING', 'PONG') + '\r\n' s.send(pong_msg.encode('utf-8')) Loading = terminou(line)
3. 检查私信权限
Twitch默认限制陌生人发送私信,需满足以下任一条件:
- 目标用户已关注你的机器人账号
- 机器人曾在目标用户的频道中发送过公开消息
- 确保机器人账号未被目标用户拉黑或屏蔽
4. 验证账号信息准确性
- 确认
USER是机器人的准确昵称(建议小写,Twitch IRC对大小写不敏感但需保持一致) - 确认
PASS是有效的OAuth令牌,必须包含发送消息的权限
修改后的完整代码
import socket import sys HOST = 'irc.twitch.tv' PORT = 6667 USER = 'bot name' # 替换为机器人实际昵称 PASS = 'oauth:xxxxxxxxxx' # 替换为有效OAuth令牌 CHAN = 'channel here' # 替换为要加入的频道名称 def abrirSocket(): s = socket.socket() s.connect((HOST, PORT)) message = "PASS " + PASS + "\r\n" s.send(message.encode('utf-8')) message = "NICK " + USER + "\r\n" s.send(message.encode('utf-8')) message = "JOIN #" + CHAN + "\r\n" s.send(message.encode('utf-8')) return s def fecharSocket(s): s.close() def entrar(s): readbuffer = "" Loading = True while Loading: readbuffer = readbuffer + s.recv(1024).decode() temp = readbuffer.split('\n') readbuffer = temp.pop() for line in temp: print(line) if line.strip().startswith('PING'): pong_msg = line.replace('PING', 'PONG') + '\r\n' s.send(pong_msg.encode('utf-8')) Loading = terminou(line) def terminou(line): return not "End of /NAMES list" in line def enviar_key(s, usuario, mensagem): entrar(s) montarMSG = f'PRIVMSG jtv :/w {usuario} {mensagem}\r\n' s.send(montarMSG.encode('utf-8')) fecharSocket(s) sys.exit() enviar_key(abrirSocket(), "margoni_", "aaaaa")
内容的提问来源于stack exchange,提问作者Margoni
相关产品推荐
相关产品推荐

