Python twisted irc-登录时的服务器密码

Python twisted irc-登录时的服务器密码,python,twisted,irc,Python,Twisted,Irc,我正在尝试使用Twisted在Python中创建一个简单的IRC bot。我已经做了很多,但是当我需要提供进入服务器的密码时遇到了一个问题 我知道如何实现加入特定频道的密码,但我不知道如何在加入IRC服务器时提供用户名和密码 我需要提供密码的原因是我希望bot与bouncer兼容(ZNC) (请原谅这个糟糕的压痕) 这是我到目前为止尝试过的 import re import urllib2 import random import time import sys from HTMLParser

我正在尝试使用Twisted在Python中创建一个简单的IRC bot。我已经做了很多,但是当我需要提供进入服务器的密码时遇到了一个问题

我知道如何实现加入特定频道的密码,但我不知道如何在加入IRC服务器时提供用户名和密码

我需要提供密码的原因是我希望bot与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文档中找不到任何关于服务器密码的信息,只有通道密码。非常感谢您的帮助

看一看

我注意到属性
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"

    ...
这有意义吗?它有效吗


祝您一切顺利:)

刚刚试过,但似乎不起作用(我没有收到任何错误消息,连接只是超时或其他什么。它应该可以工作!只需检查IRCClient的源代码,检查函数
register
connectionMade
。在我看来,实现符合rfc1459(IRC,)第4.1节描述了连接注册,所以我认为你的问题出在其他地方。你的IRC服务器日志怎么说?我没有访问服务器日志的权限,所以我无法检查…不幸的是,我没有弄明白:/它不会引发任何异常,我只得到以下信息:“故障实例:回溯(没有帧的故障)::连接已完全关闭。“大约5分钟后,我刚读了你的代码,有些东西出错了,你似乎不理解协议和协议工厂之间的关系。感觉你有点不知所措。我为你写了一个小脚本,请根据你的需要调整带有大写字母的变量并运行它。请发布输出。然后我会试着进一步帮助你。