Python twisted irc - пароль сервера при входе в систему

Я пытаюсь создать простого IRC-бота на Python с помощью Twisted. Я зашел довольно далеко, но столкнулся с проблемой, когда мне нужно предоставить пароль для входа на сервер.

Я знаю, как реализовать пароль для присоединения к определенному каналу, но я понятия не имею, как предоставить имя пользователя и пароль при присоединении к самому серверу 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()

Я не могу найти в документации 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 /tocols / Ознакомьтесь с функциями 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
Я только что прочитал ваш код, и некоторые вещи идут совсем не так, вы, кажется, не понимаете отношения между протоколами и фабриками протоколов. Такое ощущение, что ты немного не в себе. Я написал для вас небольшой скрипт, пожалуйста, настройте переменные ЗАГЛАВНЫМИ буквами в соответствии с вашими потребностями и запустите его. Пожалуйста, опубликуйте вывод. Тогда я постараюсь вам помочь. gist.github.com/brunsgaard/6c9d3f2c6dd344180430 - person brunsgaard; 25.05.2014
comment
Позвольте нам продолжить это обсуждение в чате. - person brunsgaard; 25.05.2014