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, вы должны четко указать, какие изменения нужно внести в своего бота.