【问题标题】:Python IRC bot won't joinPython IRC 机器人不会加入
【发布时间】: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 )

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

【问题讨论】:

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

标签: python irc


【解决方案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

          【讨论】:

            猜你喜欢
            • 2013-11-30
            • 2011-07-28
            • 2015-11-21
            • 2015-01-21
            • 2011-08-02
            • 1970-01-01
            • 2018-12-31
            • 2017-05-13
            • 1970-01-01
            相关资源
            最近更新 更多