为什么我的Python ircbot停止在NOTICE *:***查找您的主机名...并且不会加入频道?

时间:2012-03-04 01:07:17

标签: python irc bots

我的irc机器人挂在:calvino.freenode.net“NOTICE *: * 查找你的主机名......”在我向我的代码添加一些功能之前它正在工作。我已经对这些功能进行了评论,但它仍然没有用! 它停留在那条消息上,没有进展。我必须强迫它退出。

我是一个非常新手的编码员,我两周前才开始编码。所以我完全有可能在那里有一个非常愚蠢的错误。 作为参考,我用这篇文章来编写我的机器人的框架。 http://ubuntuforums.org/showpost.php?p=9363159&postcount=3 我没有发布我的其余代码,但我把它放在这个pastebin中,以防需要它! http://pastebin.com/kVF04UFr

    import socket
    import urllib2
    import httplib
    import mechanize

    channel = '#testbot'
    botnick = 'tastybot'
    network = 'irc.freenode.net'
    port = 6667
    irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
    irc.connect ( ( network, port ) )
    print irc.recv ( 4096 )
    irc.send ( 'NICK' + botnick + ':\r\n' )
    irc.send ( 'USER tastybot tastybot tastybot :Python IRC\r\n' )
    irc.send ( 'JOIN' + channel + ':\r\n' )
    irc.send ( 'PRIVMSG' + channel + ':What\'s up?\r\n' )
    running = True

    [various functions]

    while running:
        [rest of code]

3 个答案:

答案 0 :(得分:1)

不确定这是不是您的错误,但您的字符串似乎有问题:

irc.send ( 'PRIVMSG' + channel + ':What's up?\r\n' )

你的撇号是什么让程序认为它已退出字符串

答案 1 :(得分:1)

我的猜测是你要连接的IRC服务器要求提供身份:

  

Ident是一种旧协议,服务器用于识别共享系统上的哪个用户连接到它们。如今,它最常用于从受感染的计算机(通常没有安装identd [ident daemon])中清除克隆和floodbots。

来源:http://help.undernet.org/faq.php#19

最简单的解决方法是尝试连接到另一台IRC服务器,您可以尝试'holmes.freenode.net'作为您的服务器。我在该服务器上使用我的IRC bot没有任何问题。

编辑: 如果您想查看我用于连接服务器的代码:connection.py

答案 2 :(得分:0)

发送时忘记了空格。应该是这样的:

import socket
import urllib2
import httplib
import mechanize

channel = '#testbot'
botnick = 'tastybot'
botuser = 'tastybot'
network = 'irc.freenode.net'
port = 6667
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) )
print irc.recv ( 4096 )
irc.send ( 'NICK ' + botnick + '\r\n' )
irc.send ( 'USER ' + botuser + ' 0 * :Python IRC\r\n' ) # Read RFC next time, please
irc.send ( 'JOIN ' + channel + '\r\n' )
irc.send ( 'PRIVMSG ' + channel + ' :What\'s up?\r\n' )
running = True

[various functions]

while running:
    [rest of code]

如果帐户使用密码,只需发送PASS password作为FIRST消息 - 在发送用户名和昵称之前 - 立即建立连接。

同样在IRC中(由RFC定义),最大消息len为512字节。

顺便说一句,当收到的字符串中的最后2个符号为\r\n时,你应该真正停止阅读框架。我的机器人(hy-powered)中的样本:

  (defn read [self]
    (setv b 512)
    (setv on True)
    (setv c "")
    (while (and on (!= b 0))
      (setv x (self.sock.recv 1))
      (+= c (x.decode "UTF-8"))
      (-= b 1)
      (if (= "\r\n" (cut c -2))
        (do
          (if (= "" (cut c -2))
            (continue))
          (setv on False)
          (setv c (cut c 0 -2)))))
    c)