Python twisted irc - парола на сървъра при влизане

Опитвам се да създам прост IRC бот в Python, използвайки Twisted. Стигнах доста далеч, но срещнах проблем, когато трябва да предоставя паролата, за да вляза в сървъра.

Знам как да внедря парола за присъединяване към конкретен канал, но нямам представа как да предоставя потребителско име и парола при присъединяване към самия IRC сървър.

Причината, поради която трябва да предоставя парола, е, че искам ботът да е съвместим с bouncer (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()

Не мога да намеря нищо в документацията на Twisted относно пароли на сървъри, само пароли за канали. Всяка помощ е високо ценена!


person Em Bq    schedule 24.05.2014    source източник


Отговори (1)


Погледни

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

Забелязвам атрибута password с описанието:

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"

    ...

има ли смисъл И работи ли?

Всичко най-хубаво :)

person brunsgaard    schedule 24.05.2014
comment
Току що го пробвах и изглежда не работи. :( Не получавам никакво съобщение за грешка, връзката просто изтече или нещо подобно. - person Em Bq; 25.05.2014
comment
Би трябвало да работи! Току-що проверих изходния код на IRCClient github. com/twisted/twisted/blob/trunk/twisted/words/protocols/ Вижте функцията register и connectionMade. Както виждам, внедряването е в съответствие с rfc1459 (IRC, tools.ietf.org/html/ rfc1459.html) раздел 4.1, описващ регистрацията на връзката, така че мисля, че проблемът ви е някъде другаде. - person brunsgaard; 25.05.2014
comment
Какво пише в дневника на вашия IRC сървър? - person brunsgaard; 25.05.2014
comment
Нямам достъп до регистрационния файл на сървъра, така че не мога да проверя това... За съжаление не го разбрах :/ Не хвърля никакви изключения, просто получавам това: Екземпляр на грешка: Traceback (неуспех с без рамки): ‹class 'twisted.internet.error.ConnectionDone'›: Връзката беше затворена чисто. след около 5 минути - person Em Bq; 25.05.2014
comment
Трябва да добавя, че все още съм начинаещ в Python, това е един от първите ми по-големи проекти. - person Em Bq; 25.05.2014
comment
Току-що прочетох кода ви и някои неща се объркаха много, изглежда не разбирате връзката между протоколите и фабриките за протоколи. Имате чувството, че сте малко над главата си. Написах малък скрипт за вас, моля, коригирайте променливите с CAPITALS според вашите нужди и го стартирайте. Моля, публикувайте резултата. Тогава ще се опитам да ви помогна допълнително. gist.github.com/brunsgaard/6c9d3f2c6dd344180430 - person brunsgaard; 25.05.2014
comment
Нека продължим тази дискусия в чата. - person brunsgaard; 25.05.2014