&引用;注册超时“;关于非常基本的Python IRC bot

&引用;注册超时“;关于非常基本的Python IRC bot,python,python-3.x,irc,Python,Python 3.x,Irc,我正在用Python 3构建一个非常基本的Python机器人;因为我刚刚开始学习这门语言,所以主要依靠一些手册和教程。我现在的问题是连接到服务器,我只收到以下信息: :ircserver NOTICE * :*** Looking up your hostname... :ircserver NOTICE * :*** Couldn't resolve your hostname; using your IP address instead PING :CFC3BEE0 :ircserver 4

我正在用Python 3构建一个非常基本的Python机器人;因为我刚刚开始学习这门语言,所以主要依靠一些手册和教程。我现在的问题是连接到服务器,我只收到以下信息:

: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,因为它是不相关的

我在某个地方读到,“注册超时”是由于未能响应PING而导致的。我可以看到上面写着PING:CFC3BEE0

我这样回应

if ircmsg.find("PING :") != -1: 
    pongvalor = ircmsg[6:13]
    ping(pongvalor)
所以,我认为这应该做的是,如果它收到一条信息,上面写着PING:;它应该将字符6到13(在本例中为CFC3BEE0)放入变量pongvalor中,并将其发送到ping()中;而ping()是:

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

代码,如有必要:


谢谢你的时间。

你把这里的几件事弄糊涂了

首先,“注册超时”错误意味着您没有及时注册连接,服务器关闭了连接。其次,您不需要向服务器发送
PING
消息;服务器向您发送一个
PING
,您用匹配的
PONG
对其进行回复,但这不是连接注册的一部分(正常情况下,请参见结束)。这些消息用于测试连接另一端的存在性,这几乎总是用于确保连接仍处于活动状态

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

  • 可选
    传递
    包含服务器密码的消息
  • NICK
    信息
  • 用户
    消息
  • PASS
    消息是可选的,但如果需要,则必须在
    NICK
    USER
    消息之前发送

    在这一点上也会进行能力协商,但这超出了本回答的范围,事实上也超出了基本RFC 1459合规性的范围。现在不要担心

    一旦服务器收到
    NICK
    USER
    消息,连接注册将完成,服务器将继续执行常规例行程序
    RPL\u WELCOME
    RPL\u ISUPPORT
    、服务器信息、MOTD等。此时,您可以发送任何其他任意IRC消息,例如,像
    JOIN

    一些服务器在接收到
    尼克
    /
    用户
    配对后也会立即发送
    PING
    ,并在完成连接注册之前期待匹配的
    PONG
    ,因此请确保
    recv
    循环足够早地开始处理此问题

    总结 您需要在连接到服务器后立即注册连接。服务器可能发送或不发送
    PING
    ,并期望在该阶段的任何时候发出
    PONG
    。如果注册成功,服务器会向您打招呼,并发送通常的消息,如MOTD

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