Python twisted irc-登录时的服务器密码
我正在尝试使用Twisted在Python中创建一个简单的IRC bot。我已经做了很多,但是当我需要提供进入服务器的密码时遇到了一个问题 我知道如何实现加入特定频道的密码,但我不知道如何在加入IRC服务器时提供用户名和密码 我需要提供密码的原因是我希望bot与bouncer兼容(ZNC) (请原谅这个糟糕的压痕) 这是我到目前为止尝试过的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
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分钟后,我刚读了你的代码,有些东西出错了,你似乎不理解协议和协议工厂之间的关系。感觉你有点不知所措。我为你写了一个小脚本,请根据你的需要调整带有大写字母的变量并运行它。请发布输出。然后我会试着进一步帮助你。