Twisted IRC Bot соединение неоднократно теряется на локальный хост

Я пытаюсь реализовать IRC Bot на локальном сервере. Бот, который я использую, идентичен тому, который можно найти в блоге Эрика Флоренцано. Это упрощенный код (который должен работать)

import sys
import re
from twisted.internet import reactor
from twisted.words.protocols import irc
from twisted.internet import protocol

class MomBot(irc.IRCClient):
    def _get_nickname(self):
        return self.factory.nickname
    nickname = property(_get_nickname)

    def signedOn(self):
        print "attempting to sign on"
        self.join(self.factory.channel)
        print "Signed on as %s." % (self.nickname,)

    def joined(self, channel):
        print "attempting to join"
        print "Joined %s." % (channel,)

    def privmsg(self, user, channel, msg):
        if not user:
            return
        if self.nickname in msg:
            msg = re.compile(self.nickname + "[:,]* ?", re.I).sub('', msg)
            prefix = "%s: " % (user.split('!', 1)[0], )
        else:
            prefix = ''
        self.msg(self.factory.channel, prefix + "hello there")


class MomBotFactory(protocol.ClientFactory):
    protocol = MomBot

    def __init__(self, channel, nickname='YourMomDotCom', chain_length=3,
        chattiness=1.0, max_words=10000):
        self.channel = channel
        self.nickname = nickname
        self.chain_length = chain_length
        self.chattiness = chattiness
        self.max_words = max_words

    def startedConnecting(self, connector):
        print "started connecting on {0}:{1}" 
            .format(str(connector.host),str(connector.port))

    def clientConnectionLost(self, connector, reason):
        print "Lost connection (%s), reconnecting." % (reason,)
        connector.connect()

    def clientConnectionFailed(self, connector, reason):
        print "Could not connect: %s" % (reason,)

if __name__ == "__main__":
    chan = sys.argv[1]
    reactor.connectTCP("localhost", 6667, MomBotFactory('#' + chan,
        'YourMomDotCom', 2, chattiness=0.05))
    reactor.run()

Я добавил метод beginConnection в клиентскую фабрику, к которой он обращается, и распечатал правильный адрес: host. Затем он отключается и вводит clientConnectionLost и печатает ошибку:

Lost connection ([Failure instance: Traceback (failure with no frames):
    <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
    ]), reconnecting.

При правильной работе он должен войти в соответствующий канал, указанный в качестве первого аргумента в команде (например, python module2.py botwar. Будет являться каналом #botwar.). Он должен ответить "Привет!", Если кто-то в канале отправляет что-либо.

У меня работает NGIRC на сервере, и он работает, если я подключаюсь из mIRC или любого другого клиента IRC.

Я не могу найти решение относительно того, почему оно постоянно отключается. Любая помощь о том, почему будет принята с благодарностью. Спасибо!

1 ответ

Решение

Одна вещь, которую вы можете захотеть сделать, это убедиться, что вы увидите любую ошибку, выдаваемую сервером, когда ваш бот подключится к нему. Я догадываюсь, что проблема связана с аутентификацией или, возможно, с неожиданным различием в том, как ngirc обрабатывает одну из команд входа в систему / аутентификации, используемых IRCClient,

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

Другой подход, который вы можете попробовать, - включить ведение журнала внутри самого приложения Twisted. использование twisted.protocols.policies.TrafficLoggingFactory за это:

from twisted.protocols.policies import TrafficLoggingFactory
appFactory = MomBotFactory(...)
logFactory = TrafficLoggingFactory(appFactory, "irc-")
reactor.connectTCP(..., logFactory)

Это будет записывать вывод в файлы, начинающиеся с "irc-" (разные файлы для каждого соединения).

Вы также можете подключиться непосредственно к реализации протокола на любом из нескольких уровней. Например, для отображения всех полученных байтов:

class MomBot(irc.IRCClient):
    def dataReceived(self, bytes):
        print "Got", repr(bytes)
        # Make sure to up-call - otherwise all of the IRC logic is disabled!
        return irc.IRCClient.dataReceived(self, bytes)

С одним из этих подходов, мы надеемся, вы увидите что-то вроде:

:irc.example.net 451 * :Connection not registered

что я думаю означает... вам нужно аутентифицировать? Даже если вы видите что-то еще, надеюсь, это поможет вам более точно определить точную причину закрытия соединения.

Также вы можете использовать tcpdump или же wireshark захватить журнал трафика между ngirc и одним из работающих клиентов IRC (например, mIRC), а затем сравнить два журнала. Какие бы команды ни отправлял mIRC, вы должны четко указать, какие изменения нужно внести в своего бота.

Другие вопросы по тегам