我正在尝试构建一个非常简单的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.
]
答案 0 :(得分:3)
您的代码存在的一个问题是,如果不调用connectionMade
实现,则覆盖IRCClient
。 IRCClient.connectionMade
执行几项重要任务,例如“注册”服务器(提供昵称等),这在服务器接受任何其他命令之前是必需的。事实上,在这种情况下永远不会召唤signedOn
;服务器可能正在等待您的机器人注册,然后在配置的超时后断开连接,此时注册永远不会发生。
(请注意,我在上面提到的“注册”不是NickServ式注册;这是指在连接到IRC服务器时发送USER
和NICK
命令的过程。(
此外,您的代码调用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)