Python IRC 机器人不会加入

Posted

技术标签:

【中文标题】Python IRC 机器人不会加入【英文标题】:Python IRC bot won't join 【发布时间】:2011-01-22 19:32:51 【问题描述】:

我收到错误消息

: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 )

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

【问题讨论】:

应该在 *** 上... 嗯,频道或服务器是否完全不希望事先注册昵称? @TheLQ:如果你花一秒钟看代码,你会发现没有框架...... 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

PING :7091A8FB\r\n

要响应此 PING,只需发送:

PONG :7091A8FB\r\n

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

【讨论】:

【参考方案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

【讨论】:

【参考方案4】:

PING :7091A8FB

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

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

你需要回复一个ping如下:

PONG :7091A8FB

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

最后,您应该等到登录后(您会知道,因为您将收到原始数字 001),然后再发送 JOIN / PRIVMSG / 其他命令。

【讨论】:

【参考方案5】:

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

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

(发出“NICK”命令后,您应该从 有号码的客户;这是您应该替换的数字 上面的“”。)

应该将您连接到服务器,并且您应该收到 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

【讨论】:

以上是关于Python IRC 机器人不会加入的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 python 中编写一个简单的 IRC 机器人?

Python twisted irc - 登录时的服务器密码

当人加入昵称 IRC

如何使用 Bash 编写的 IRC 机器人从 IRC 频道读取消息?

在当前昵称下运行 IRC 机器人?

IRC 相关帮助