emr*_*esu 3 python irc python-3.x twitch
基本上我已经用 Python 制作了一个 IRC Twitch 机器人,它现在除了加入频道之外什么都不做。乒乓循环可以正常工作一段时间,但随后因标题中的错误而停止。我做错了什么?提前致谢。
import re
import socket
HOST = "irc.twitch.tv"
PORT = 6667
NICK = "asdsad"
PASS = "oauth:asdasdasdasd"
channel = "#coolperson"
def send_message(sock, msg):
sock.send("PRIVMSG #{} {}".format(channel, msg))
s = socket.socket()
s.connect((HOST, PORT))
s.send("PASS {}\r\n".format(PASS).encode("utf-8"))
s.send("NICK {}\r\n".format(NICK).encode("utf-8"))
s.send("JOIN {}\r\n".format(channel).encode("utf-8"))
while True:
response = s.recv(1024).decode("utf-8")
if response == "PING :tmi.twitch.tv\r\n":
s.send("PONG :tmi.twitch.tv\r\n".encode("utf-8"))
print("answered the call")
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以跳过该错误。而不是以下部分:
response = s.recv(1024).decode("utf-8")
Run Code Online (Sandbox Code Playgroud)
使用这个:
response = s.recv(1024).decode('utf-8', 'ignore')
Run Code Online (Sandbox Code Playgroud)
您正在从网络读取多字节字符的一部分。您的缓冲区为 1024 字节,您会在该缓冲区的末尾看到 0xe2,索引为 1023。代码点大于 127 的非 ASCII 字符在 UTF-8 中是多字节的,并且您无法控制分割的位置从网络读取内容,因此如果您不幸的话,您会看到一个字符在对recv(). 如果您设置“忽略”选项来解码,您将丢弃该字符,实际上是丢弃它。
如果您只是寻找“ping”,那么删除其他内容可能就可以了,因为您正在寻找的文本是纯 ASCII。如果您需要所有这些文本(例如,将其显示给用户),则必须在尝试解码来自网络的字节字符串之前检查未终止的字符。Python 的codecs模块为此提供了增量编码/解码器接口,您可以向增量解码器提供字节,它将输出它可以解码的任何字符,并通过保留调用之间的状态来处理它不能解码的字符。有关示例,请参阅https://docs.python.org/3/library/codecs.html#incremental-encoding-and-decoding文档和python 解码部分 utf-8 字节数组。
| 归档时间: |
|
| 查看次数: |
4147 次 |
| 最近记录: |