"Registration timeout" 在非常基础的 Python IRC 机器人上

"Registration timeout" on very basic Python IRC bot

我正在 Python 3 中构建一个非常基础的 Python BOT;因为我只是在学习这门语言,所以主要依靠几本手册和教程。我现在的问题是连接到服务器,我收到的是以下内容:

:ircserver NOTICE * :*** Looking up your hostname...
:ircserver NOTICE * :*** Couldn't resolve your hostname; using your IP address instead
PING :CFC3BEE0
:ircserver 451 JOIN :You have not registered
ERROR :Closing Link: Botski[serverIPaddress] (Registration Timeout)

而ircserver是服务器的地址; serverIPaddress 是 IP,因为无关紧要而被省略

我在某处读到 "Registration Timeout" 是由于无法响应 PING 而导致的。我可以看到它说 PING :CFC3BEE0

我是这样回应的

if ircmsg.find("PING :") != -1: 
    pongvalor = ircmsg[6:13]
    ping(pongvalor)

所以,我认为它应该做的是,如果它收到一条消息,上面写着 PING : ;它应该使用字符 6 到 13(在本例中为 CFC3BEE0),将它们放入变量 pongvalor 并将它们发送到 ping() ;而 ping() 是:

def ping(pong):
    ircsock.send(bytes("PONG :" + pong + "\r\n", "UTF-8"))

所以,它应该响应 PONG :CFC3BEE0 ;我做错了什么吗?

代码,以备不时之需:https://pastebin.com/2HdgBF58

感谢您的宝贵时间。

你在这里混淆了几件事。

首先,“注册超时”错误是指您没有及时注册连接,服务器关闭了连接。其次,不需要向服务器发送PING消息; 服务器发送PINGyouyou用匹配的PONG,但这不是(通常;见结尾)连接注册的一部分。这些消息用于测试连接另一端是否存在,这几乎总是用于确保连接仍然存在。

Connection Registration指的是初始NICKUSER消息必须由连接客户端在发送前发送到IRC服务器任何其他消息。如 RFC 1459 中所述,基本连接注册是一个 2-3 步过程:

  1. 可选PASS包含服务器密码的消息
  2. NICK 留言
  3. USER 留言

PASS 消息是可选的,但如果需要,则 必须 NICKUSER 消息之前发送.

此时也会进行能力协商,但这超出了本答案的范围,实际上基本符合 RFC 1459。暂时不用担心。

服务器接收到NICKUSER消息后,连接注册将完成,然后服务器将继续RPL_WELCOMERPL_ISUPPORT、服务器信息、MOTD 等。此时您可以发送任何其他任意 IRC 消息,例如 JOIN

有些服务器还会在收到 NICK/USER 对后立即发送 PING,并在完成连接注册之前期望匹配 PONG,因此请确保您的 recv 循环启动足够早来处理这个问题。

总结

您需要在连接到服务器后立即注册您的连接。服务器可能会也可能不会发送 PING 并期望在此阶段的任何时候收到 PONG。如果注册成功,服务器会问候您并发送常规消息,例如 MOTD。