Python IRC机器人无法加入频道

5
我收到了错误消息。
: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 )

我可以成功连接到频道,有什么想法吗?


2
应该在 Stackoverflow 上... - TheLQ
1
嗯,频道或服务器完全肯定不需要任何先前的昵称注册吗? - 9000
@TheLQ:如果你花一秒钟看代码,你会发现没有框架... - poke
5个回答

7
我发现您没有处理PING请求,有些服务器在收到PING请求后,除非您回复该请求(因此未注册),否则不会接受任何其他命令。 您需要连接,然后NICK,检查PING,然后USER,在USER之前再次检查PING,如果之前没有PING的话。 有些服务器喜欢在NICK之后发送PING,而有些则喜欢在USER之后发送。
PING :7091A8FB\r\n

要响应此PING,请发送:

PONG :7091A8FB\r\n

:'\r\n之间将会是一个随机字符串,你需要在PONG中回传该字符串,如上所示。

7
我看到有两个可能的原因:
  • 你发送的命令太早了。通常在连接完全建立并且服务器接受你的命令之前需要等待相当长的时间(特别是JOIN命令)。所以你需要先等待服务器响应(发送NICK命令后,你会在某个时刻收到MODE命令;在此之后,你可以调用普通命令,包括JOIN)。
  • 另一个可能性是PING,这可能不是真正的解决方案,但如果你想留在IRC服务器上,它仍然很重要。服务器随机发送PING命令。你通常需要用PONG命令回复(参数与收到的PING相同)。否则服务器可能会踢你。

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

1

PING :7091A8FB

这是阻止您在IRC服务器上注册的问题。

虽然您在IRC上应该(技术上)能够使用NICK / USER组合进行注册,但您在登录时收到的PING是大多数IRC服务器现在采用的非常简单的DoS保护机制。

您需要按以下方式回复ping:

PONG :7091A8FB

每次收到PING时,字符串都应该更改。稍后您还将收到PING请求以确保连接仍然活动,因此编写回复代码将确保服务器不会自动QUIT(ping超时)。
最后,在发送JOIN / PRIVMSG /其他命令之前,您应该等待已登录(您将知道,因为您将收到原始数字001)。

0

这可能是您的客户端出现了问题。您可以通过使用telnet连接到服务器并发出类似以下命令来进行双重检查:

NICK aaron
USER aaron ignored ignored :Aaron
PONG <number>

(在发送“NICK”命令后,您应该从客户端收到一个带有数字的“PING”;这是您应该替换上面的“”的数字。)

这个应该连接您与服务器,并且您应该立即收到MOTD和其他连接消息。从这里开始,您可以尝试“JOIN#test-channel”,并确保您可以加入频道。假设所有这些都按照我描述的方式工作,则您的问题可能出在IRC客户端上。

 sec@irc:~/simple-irc-bot$ telnet 192.168.1.100 6667
 Trying 192.168.1.100...
 Connected to 192.168.1.100.
 Escape character is '^]'.
 NOTICE AUTH :*** Looking up your hostname
 NOTICE AUTH :*** Checking Ident
 NOTICE AUTH :*** Couldn't look up your hostname
 NICK TENOTICE AUTH :*** No ident response
 NICK testtest002
 PING :2153560274
 :loal.irc-server.com 461 TNICK USER :Not enough parameters
 USER test test 0 :sec
 PONG :2153560274
 :loal.irc-server.com 001 TNICK :Welcome IRC Network,
 :loal.irc-server.com 002 TNICK :Your host is loal.irc-server.com, running version u2.10.12.14

请在USER命令后尝试PONG:2153560274

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接