IRC 机器人(Python)

2 投票
2 回答
4992 浏览
提问于 2025-04-16 15:22
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((irc, port))
sck.send('PRIVMSG ' + 'NICKSERV' + 'ghost' + 'supaBOT' + 'htown')
sck.send('NICK supaBOT\r\n')
sck.send('PRIVMSG ' + 'NICKSERV' + 'IDENTIFY' + 'password')
sck.send('USER supaBOT supaBOT supaBOT :supaBOT Script\r\n')
sck.send('JOIN ' + " " + chan + '\r\n')

当我尝试运行这个脚本时,我遇到了这个错误:

trix.gonullyourself.org 451 PRIVMSG  You have not registered
trix.gonullyourself.org 451 PRIVMSG  You have not registered
trix.gonullyourself.org 451 JOIN  You have not registered
: You

昵称supaBOT已经在服务器上注册了,但我不知道怎么向服务器进行身份识别,因为上面的代码没有起作用。

2 个回答

0

检查一下你的字符串,'PRIVMSG ' + 'NICKSERV' + 'IDENTIFY' + 'password' 这样拼接出来的结果是 PRIVMSG NICKSERVIDENTIFYpassword,显然这不是你想发送的内容。

顺便说一下,最好使用字符串替换或者 .format() 方法来处理字符串,因为这样拼接会增加额外的负担,每添加一个字母,Python 都要重新遍历一遍字符串。比如可以这样写:'PRIVMSG NICKSERV IDENTIFY %s' %(password) 或者 'PRIVMSG NICKSERV IDENTIFY {0}'.format(password)

另外,如果你想的话,已经有一个叫 irclib 的库可以使用(还有 supybot 这个纯 Python 的 IRC 机器人)。

5

就像Mike说的,你没有发送应该发送的数据。你需要在那儿加上空格,如果最后的命令参数里有空格,前面还需要加个:。还有一些行缺少'\r\n'

也就是说,PRIVMSG的格式是:'PRIVMSG nick :带空格的消息\r\n'

PRIVMSG只有两个参数,所以你需要加上:来表明后面的内容是一个值,这个值可能包含空格。

你收到"You have not registered"的原因是因为你必须先发送USERNICK命令,然后才能发送其他命令。如果NICK命令失败了(比如昵称冲突),你需要检测到这个错误并尝试另一个昵称。一旦你发送了有效的USERNICK命令,有些IRC网络还会给你发送一个PING,你必须用PONG来回应,服务器才会认为你“注册”成功。之后你就可以使用其他命令了。

撰写回答