Python IRC 机器人无法加入
我遇到了一个错误信息:
:irc.evilzone.org NOTICE AUTH :* 正在查找你的主机名...
:irc.evilzone.org NOTICE AUTH :* 找到了你的主机名(缓存中)
PING :7091A8FB
:irc.evilzone.org 451 JOIN :你还没有注册
:irc.evilzone.org 451 PRIVMSG :你还没有注册
server = "irc.evilzone.org" # Server
port = 6667 #port connect through IRC standard is :(6667 or 9999)
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( server, port ) )
print irc.recv ( 4096 )
nick = 'Piebot' #bots name
chan = 'test' #channel
version= "1.0" #current version
irc.send ( 'NICK Pizebot\r\n' )
irc.send ( 'USER Pizebot Pibot Pibot :Python IRC\r\n' )
irc.send ( 'JOIN #test\r\n' ) # YOU MUST CHANGE THE CHANNEL HERE AND BELOW!!
irc.send ( 'PRIVMSG #test :Hello World.\r\n' )
while True:
readbuffer= irc.recv(4096)
temp=string.split(readbuffer, "\n")
Check = readbuffer.split(':')
print readbuffer
需要注意的是,我用的一些命令需要代码中的 temp= string.split(readbuffer,"\n") 这一部分。但是像这样的代码:
network = 'irc.evilzone.org'
port = 6667
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) )
print irc.recv ( 4096 )
irc.send ( 'NICK ipbot\r\n' )
irc.send ( 'USER ipbot completely real :Jxxx\r\n' )
irc.send ( 'JOIN #test\r\n' )
irc.send ( 'PRIVMSG #test:Oh Hai.\r\n' )
while True:
data = irc.recv ( 4096 )
我可以成功连接到频道等等。有什么想法吗?
5 个回答
3
在发送 "USER ..." 和 "JOIN ..." 之间的时间需要增加。我在用 Bash 写同样的代码时遇到了这个问题。以下是我解决这个问题的方法:
#!/bin/bash
(
echo NICK bashscript
echo USER bashscript 8 \* : Centreon Notifier
sleep 2
# echo 'JOIN #netops'
echo 'PRIVMSG #netops' $1
echo QUIT
) | nc 127.0.0.1 6667
7
我注意到你没有处理 PING 请求,有些服务器在你回复 PING 请求之前,不接受其他任何命令(所以你还没有注册)。
你应该先连接,然后发送 NICK,检查是否有 PING 请求,如果没有,再发送 USER,之后再检查一次 PING。
有些服务器喜欢在 NICK 之后发送 PING,其他的则是在 USER 之后发送。
PING :7091A8FB\r\n
要回应这个 PING,只需发送:
PONG :7091A8FB\r\n
在 :
和 '\r\n
之间会有一个随机字符串,你需要把这个字符串和你的 PONG 一起发送回去,如上所示。
7
我看到可能有两个原因导致这个问题:
- 你发送命令的时机不对。通常在连接完全建立之前,你需要等一段时间,服务器才能接受你的命令(特别是JOIN命令)。所以你需要先等服务器的回应(比如在发送NICK命令后,过一会儿你会收到一个MODE命令;在那之后,你才能发送正常的命令,包括JOIN)。
- 另一个可能的原因,虽然不一定是解决方案,但如果你想继续留在IRC服务器上,这一点很重要,那就是PING。服务器会随机发送一个PING命令。你通常需要用PONG命令来回应(参数和收到的PING相同)。否则,服务器可能会把你踢掉。