IRCBot不会加入频道

时间:2010-07-29 17:34:32

标签: python twisted irc

我正在尝试构建一个非常简单的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.
]

3 个答案:

答案 0 :(得分:3)

您的代码存在的一个问题是,如果不调用connectionMade实现,则覆盖IRCClientIRCClient.connectionMade执行几项重要任务,例如“注册”服务器(提供昵称等),这在服务器接受任何其他命令之前是必需的。事实上,在这种情况下永远不会召唤signedOn;服务器可能正在等待您的机器人注册,然后在配置的超时后断开连接,此时注册永远不会发生。

(请注意,我在上面提到的“注册”不是NickServ式注册;这是指在连接到IRC服务器时发送USERNICK命令的过程。(

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

答案 1 :(得分:1)

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

from sys import stdout
from twisted.python.log import startLogging
startLogging(stdout)

答案 2 :(得分:0)

如@mithrandi所述,你最重要的是connectionMade。这是应该如何做的:

def connectionMade(self):
    print 'connectionMade!'
    irc.IRCClient.connectionMade(self)