1

我现在正在尝试构建一个非常简单的 irc 机器人,但我的机器人似乎不会加入频道。有人可以指出以下代码有什么问题:

from twisted.internet import reactor, protocol
from twisted.words.protocols import irc

class IRCProtocol(irc.IRCClient):
    nickname = "botnick"

    def connectionMade(self):
        print 'connectionMade!'

    def signedOn(self):
        print 'Signed On to server'
        self.join(self.factory.channels)
        print 'Joined channel'
        self.say(self.factory.channels, "hello", 1024)


class IRCFactory(protocol.ClientFactory):
    protocol = IRCProtocol
    channels = "#testingircbot"

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed because of %s" % reason
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost: %s" % reason
        connector.connect()

if __name__ == "__main__":
    host, port = "irc.freenode.net", 6667
    fact = IRCFactory()
    reactor.connectTCP(host, port, fact)
    reactor.run()

这是我运行脚本时的输出:

connectionMade!
Connection lost: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]
connectionMade!
Connection lost: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]
connectionMade!
Connection lost: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]
4

3 回答 3

3

您的代码的问题之一是您在connectionMade不调用IRCClient实现的情况下进行了覆盖。IRCClient.connectionMade执行几项重要任务,例如向服务器“注册”(提供昵称等),这是服务器接受任何进一步命令之前所必需的。事实上,signedOn永远不会在这些情况下调用;服务器可能正在等待您的机器人注册,然后在配置超时后断开连接,而注册从未发生。

(注意,我上面所说的“注册”不是 NickServ 式的注册;这是指连接到 IRC 服务器时发送USER和命令的过程。(NICK

此外,您的代码调用self.join()加入频道,然后立即尝试向该频道发送消息。虽然这可能有效,但不能保证这样做;相反,您应该覆盖joined以便在机器人实际加入频道后运行您的代码。然后,您可以发送“你好”消息(或做其他事情)。

于 2010-08-04T06:09:23.777 回答
1

尝试启用日志记录。您的一种方法可能会引发异常。将记录异常,但如果不启用记录,您将永远看不到它:

from sys import stdout
from twisted.python.log import startLogging
startLogging(stdout)
于 2010-07-29T18:26:34.453 回答
0

正如@mithrandi 所提到的,你是压倒一切的connectionMade。应该这样做:

def connectionMade(self):
    print 'connectionMade!'
    irc.IRCClient.connectionMade(self)
于 2012-02-23T11:06:30.920 回答