IRCBot не присоединится к каналу

Сейчас я пытаюсь создать очень простого 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.
]

person Mark Klein    schedule 29.07.2010    source источник


Ответы (3)


Одна из проблем с вашим кодом заключается в том, что вы переопределяете connectionMade без вызова реализации IRCClient. IRCClient.connectionMade выполняет несколько важных задач, таких как «регистрация» на сервере (предоставление псевдонима и т. д.), что необходимо, прежде чем сервер будет принимать какие-либо дальнейшие команды. На самом деле signedOn никогда не будет вызываться при таких обстоятельствах; сервер, вероятно, ждет, пока ваш бот зарегистрируется, а затем отключает его по истечении настроенного тайм-аута, когда регистрация так и не происходит.

(Обратите внимание, что «регистрация», о которой я говорил выше, не является регистрацией в стиле NickServ; это относится к процессу отправки команд USER и NICK при подключении к IRC-серверу.(

Кроме того, ваш код вызывает self.join() для присоединения к каналу, а затем немедленно пытается отправить сообщение на этот канал. Хотя это может сработать, это не гарантируется; вместо этого вы должны переопределить joined, чтобы ваш код запускался после того, как бот фактически присоединился к каналу. Затем вы можете отправить свое приветственное сообщение (или сделать что-то еще).

person mithrandi    schedule 04.08.2010

Попробуйте включить ведение журнала. Один из ваших методов, вероятно, вызывает исключение. Исключение будет зарегистрировано, но без включения ведения журнала вы никогда его не увидите:

from sys import stdout
from twisted.python.log import startLogging
startLogging(stdout)
person Jean-Paul Calderone    schedule 29.07.2010

Как уже упоминалось @mithrandi, вы переопределяете connectionMade. Вот как это должно быть сделано:

def connectionMade(self):
    print 'connectionMade!'
    irc.IRCClient.connectionMade(self)
person plaes    schedule 23.02.2012