Python IRC bot不会加入

时间:2011-01-22 19:32:52

标签: python irc

我收到错误消息

  

:irc.evilzone.org通知AUTH: * 查找您的主机名......

     

:irc.evilzone.org通知AUTH: *   找到您的主机名(缓存)

     

PING:7091A8FB

     

:irc.evilzone.org 451加入:你有   未注册

     

: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 个答案:

答案 0 :(得分:6)

我认为有两个可能的原因:

  • 您要尽早发送命令。通常,您需要等待一段时间才能完全建立连接,并且服务器接受您的命令(尤其是JOIN)。因此,您需要先等待服务器响应(在发送NICK命令后,您会在某个时刻返回MODE命令;之后,您可以调用正常命令,包括JOIN)。
  • 另一种可能性,这可能不是真正的解决方案,但如果你想留在IRC服务器上仍然很重要的是PING。服务器随机发送PING命令。您通常需要 来响应PONG命令(参数与收到的PING相同)。否则服务器可能会踢你。

答案 1 :(得分:5)

我注意到您没有处理PING请求,在您回复PING请求(因此未注册)之前,某些服务器不接受任何其他命令。 你想要连接,然后NICK,检查PING,然后是USER,如果USER之前没有,则再次检查PING。

有些服务器喜欢在NICK之后发送,其他服务器则在USER之后发送。

PING :7091A8FB\r\n

要回复此PING,只需发送:

PONG :7091A8FB\r\n

:'\r\n之间将是一个随机字符串,您需要将其与PONG一起发回,如上所示。

答案 2 :(得分: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

答案 3 :(得分:1)

  

PING:7091A8FB

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

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

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

PONG :7091A8FB

每次收到PING时,字符串都应该更改。 稍后您还将获得PING请求以确保连接仍然存在,因此编写要回复的代码将确保服务器不会自动退出您(ping超时)

最后,在发送JOIN / PRIVMSG /其他命令之前,你应该等到你已经登录(你知道因为你会收到原始数字001)。

答案 4 :(得分:0)

这可能是您客户的问题。你可以仔细检查一下 通过telnet连接到服务器并发出类似的命令 这样:

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

(在发出&#39; NICK&#39;命令后,你应该得到一个&#39; PING&#39; 有号码的客户;这是您应该替换的数字 &#34;&#34;的上方。)

这个 应该连接你的服务器,你应该收到 此后立即发送MOTD和其他连接消息。从这里,你 可以试试&#34;加入#test-channel&#34;并确保您可以加入渠道。 假设所有这些都按照我的描述工作,那么你的问题就很可能发生了 与您的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