2012-12-01 2 views
1

로컬 서버에 IRC Bot을 구현하려고합니다. 내가 사용중인 봇은 Eric Florenzano's Blog에있는 봇과 동일합니다. 호스트 : 이것은 내가 그것을 도달하고 적절한 주소를 인쇄하는 클라이언트 공장에서 startedConnection 방법을 추가 (실행해야합니다) 단순화 된 코드Twisted 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() 

입니다. 그런 다음 연결이 끊어지고 clientConnectionLost를 입력하고 오류를 인쇄합니다

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

제대로 작동 그것은 (명령의 첫 번째 인수로 지정된 해당 채널에 로그인해야하는 경우 예를 들어 파이썬 module2.py botwar 채널 번호가 될 것입니다. botwar.). 채널에있는 사람이 아무 것도 보내면 "hello there"로 응답해야합니다.

나는 NGIRC을 서버에서 실행 중이며 mIRC 또는 다른 IRC 클라이언트에서 연결하면 작동합니다.

지속적으로 연결을 끊는 이유에 대한 해결책을 찾을 수 없습니다. 왜 도움을 많이 크게 감사하겠습니다. 고맙습니다!

+0

실행중인 IRC 서버는 무엇입니까? 오픈 소스입니까? – fmoo

+1

연결이 끊기는 이유가 * 있습니다. 그렇지 않으면 연결이 끊어지지 않습니다. 그러나 누군가가 그 이유를 추측 할 수있는 정보가 거의 없습니다. http://sscce.org/ 및 http://www.catb.org/esr/faqs/smart-questions.html –

+0

@ Jean-PaulCalderone을 참조하십시오. 해당 웹 사이트에 감사드립니다. 나는 더 많은 정보를 더했다. 그것은 "짧은"요구 사항에 속하지 않지만, 나는 다른 방법으로 그것을하는 방법을 모른다. 다행히도, 이것은 더 나은 단어 질문입니다. – RyGuy

답변

2

봇이 서버에 연결할 때 서버가 생성 한 오류 출력을 확인해야합니다. 내 직감은 문제가 인증과 관련이 있거나, 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가 보내는 다른 명령이 무엇이든 당신이 당신의 봇에 어떤 변화를 주어야하는지 분명히해야합니다.

+0

감사합니다! 이제 작동합니다. 구성에 문제가 있거나 설정에 대한 지식이 부족합니다. 그것이 반환 한 오류는 "상냥한 별명"이었습니다. conf 파일의 최대 닉네임 길이는 9 자이고 광산은 13 자입니다. – RyGuy