2014-05-24 4 views
0

저는 Twisted를 사용하여 파이썬에서 간단한 IRC 봇을 만들려고합니다. 나는 꽤 멀리 왔지만 서버에 들어가기 위해 암호를 제공해야 할 때 문제가 발생했습니다.로그인시 파이썬 twisted irc - server 암호

특정 채널에 참여하기위한 암호를 구현하는 방법을 알고 있지만 IRC 서버에 가입 할 때 사용자 이름과 암호를 제공하는 방법을 알지 못합니다.

비밀번호를 제공해야하는 이유는 봇을 경비원 호환 (ZNC)으로 설정해야하기 때문입니다.

(비열한 들여 쓰기를 실례)

이것은 내가 지금까지 내가 서버 암호 만 채널 암호에 대한 트위스트 문서에서 아무것도 찾을 수 없습니다

import re 
import urllib2 
import random 
import time 
import sys 
from HTMLParser import HTMLParser 
from twisted.internet import reactor 
from twisted.words.protocols import irc 
from twisted.internet import protocol 

def is_valid_int(num): 
"""Check if input is valid integer""" 
    try: 
     int(num) 
     return True 
    except ValueError: 
     return False 

def isAdmin(user): 
    with open("admins.txt", "r") as adminfile: 
     lines = adminfile.readlines() 
     if not lines: 
      return False 

     if user in lines: 
      return True 
     else: 
      return False 

class Bot(irc.IRCClient): 
    def _get_nickname(self): 
     return self.factory.nickname 

    nickname = property(_get_nickname) 

    # @Event Signed on 
    def signedOn(self): 
     self.join(self.factory.channel) 
     print "Signed on as %s." % (self.nickname,) 

    # @Event Joined 
    def joined(self, channel): 
     print "Joined %s." % (channel,) 

    # @Event Privmsg 
    def privmsg(self, user, channel, msg): 
     if msg == "!time": 
      msg = time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()) 
      self.msg(channel, msg) 

     # Google searhc 
     elif msg.startswith("!google"): 
      msg = msg.split(" ", 2) 
      msg = "https://www.google.com/search?q=" + msg[1] 
      self.msg(channel, msg) 

     # Quit connection 
     elif msg.startswith("!quit"): 
     self.quit("byebye") 

     # Set nickname 
     elif msg.startswith("!nick"): 
     msg = msg.split(" ", 2) 
     newNick = msg[1] 
     self.setNick(newNick) 

     # Invite to channel 
     elif msg.startswith("!invite"): 
     msg = msg.split(" ", 2) 
     channel = msg[1] 
     self.join(channel) 
     print("Joined channel %s" % channel) 

     # Leave channel 
     elif msg.startswith("!leave"): 
     msg = msg.split(" ", 2) 
     channel = msg[1] 
     self.leave(channel) 
     print("Left channel %s" % (channel)) 

     # Dice roll 
     elif msg.startswith("!roll"): 
      user = user.split("!", 2) 
      nick = user[0] 
      self.msg(channel, nick + " rolled a " + str(random.randint(0,100))) 
      print("Rolled dice...") 

     # Op user 
     elif msg.startswith("!op") or msg.startswith("!+o"): 
      msg = msg.split(" ", 2) 
      nick = msg[1] 

      if isAdmin(nick) == True: 
       self.mode(channel, True, "o", user=nick) 
      else: 
       self.msg(channel, "Not registered as admin, contact bot owner.") 

     # Deop user 
     elif msg.startswith("!deop") or msg.startswith("!-o"): 
      msg = msg.split(" ", 2) 
      nick = msg[1] 

      if isAdmin(nick) == True: 
       self.mode(channel, False, "o", user=nick) 
      else: 
       self.msg(channel, "Not registered as admin, contact bot owner.") 

     # Voice user 
     elif msg.startswith("!voice") or msg.startswith("!+v"): 
      msg = msg.split(" ", 2) 
      nick = msg[1] 

      if isAdmin(nick) == True: 
       self.mode(channel, True, "v", user=nick) 
      else: 
       self.msg(channel, "Not registered as admin, contact bot owner.") 

     # Devoice user 
     elif msg.startswith("!devoice") or msg.startswith("!-v"): 
      msg = msg.split(" ", 2) 
      nick = msg[1] 

      if isAdmin(nick) == True: 
       self.mode(channel, False, "v", user=nick) 
      else: 
       self.msg(channel, "Not registered as admin, contact bot owner.") 



class BotFactory(protocol.ClientFactory): 
"""Factory for our bot""" 
protocol = Bot 

    def __init__(self, channel, nickname="IRCBot", username=None, password=None): 
     self.channel = channel 
     self.nickname = nickname 
     self.username = username 
     self.password = password 

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

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


if __name__ == "__main__": 
reactor.connectTCP("my.irc.server.com", 6667, BotFactory("Channel", "IRCBot", "Name", "Password")) 
reactor.run() 

시도했습니다 것입니다. 어떤 도움이라도 대단히 감사합니다!

답변

1

설명과 함께,

내가 속성 password을 알

http://twistedmatrix.com/documents/current/api/twisted.words.protocols.irc.IRCClient.html

를 살펴 보자 :

password = 
    Password used to log on to the server. May be None. 

그것은 나에게 보인다는 따라서, 귀하의 Bot 클래스

을 암호 속성을 설정할 수 있습니다
class Bot(irc.IRCClient): 
    def _get_nickname(self): 
     return self.factory.nickname 

    nickname = property(_get_nickname) 
    password = "PASSWORD" 

    ... 

그것은 의미가 있습니까? 그리고 그것은 효과가 있습니까?

모두 최고 :)

+0

그냥 시도해도 작동하지 않는 것 같습니다. :(오류 메시지가 나타나지 않고 연결 시간이 얼마 남지 않았습니다.) –

+0

IRCClient의 소스 코드를 확인했습니다. https://github.com/twisted/twisted/blob/trunk/ twisted/words/protocols/irc.py # L2414 함수'register'와'connectionMade'을 체크해라. 내가 본 것처럼 구현은 rfc1459 (IRC, http://tools.ietf.org/html/)와 일치한다. rfc1459.html) 섹션 4.1 연결 등록을 설명하므로 다른 곳에있는 것 같아요 – brunsgaard

+0

IRC 서버 로그 란 무엇입니까? – brunsgaard