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

コードの問題の 1 つは、実装connectionMadeを呼び出さずにオーバーライドしていることです。サーバーへの「登録」(ニックネームの提供など)など、サーバーがそれ以上のコマンドを受け入れる前に必要ないくつかの重要なタスクを実行します。実際、これらの状況では呼び出されることはありません。サーバーはおそらくボットが登録されるのを待っており、登録が行われない場合、設定されたタイムアウトの後にサーバーを切断しています。IRCClientIRCClient.connectionMadesignedOn

(上記の「登録」は、NickServ スタイルの登録ではないことに注意してください。これは、IRC サーバーへの接続時にコマンドをUSER送信するプロセスを指します。(NICK

また、コードはself.join()チャネルへの参加を呼び出し、すぐにそのチャネルにメッセージを送信しようとします。これはうまくいくかもしれませんが、うまくいくとは限りません。joined代わりに、ボットが実際にチャネルに参加した後にコードを実行するには、オーバーライドする必要があります。その後、「こんにちは」メッセージを送信できます (または別のことを行います)。

于 2010-08-04T06:09:23.777 に答える
1

ロギングを有効にしてみてください。メソッドの1つは、おそらく例外を発生させることです。例外はログに記録されますが、ログを有効にしないと、例外は表示されません。

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