IRC机器人无法加入频道

3
import socket

irc = 'irc.hack3r.com'
port = 6667
channel = '#chat'
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((irc, port))
sck.send('NICK supaBOT\r\n')
sck.send('USER supaBOT supaBOT supaBOT :supaBOT Script\r\n')
sck.send('JOIN #chat' + '\r\n')
data = ''
while True:
     data = sck.recv(4096)
     if data.find('PING') != -1:
        sck.send('PONG ' + data.split() [1] + '\r\n')
        print data

print sck.recv(4096)

当我连接服务器时,无法加入频道,出现以下错误:

"451 JOIN :You have not registered"

您尚未注册,因此无法加入频道。


2
在编程中通常更喜欢使用'PING' in data,而不是data.find('PING') != -1 - Mike Graham
4个回答

11
Mike Graham错了。出错的原因是你发送JOIN命令太早了。服务器需要一段时间来注册你的NICK和USER命令,因此会出现“Nick not registered”错误。 请参考这个回答:Python IRC bot won't join
我还想鼓励你通过使用裸套接字制作机器人来继续学习和发现IRC协议。谁在乎你的代码不完全符合RFC 1459标准。几乎没有任何服务器、客户端或机器人100%符合标准。但如果它能工作,那就行!
与Daenyth所说的不同,使用裸套接字IRC机器人并不太难获得一些很棒的结果。只需稍微阅读一下RFC并进行实验即可!

+1 我同意实践/亲身体验学习的方法。这样你会有更深入的理解。此外,请记住,自RFC编写以来,相当多的服务器命令已经因安全原因而被修改。 - MattH
通常情况下,您需要等待422(错误MOTD丢失)或376(MOTD结束),然后发送加入请求。 - Johannes Kuhn

2
听起来你还没有注册,这是加入该频道的要求。您需要注册您的昵称,然后在加入之前进行身份验证。
另外,使用裸套接字来制作IRC机器人不是一个好主意。此代码未对RFC 1459进行有用级别的实现,并将程序逻辑与网络逻辑混淆。考虑使用网络库(例如Twistedtwisted.words 具有出色的IRC协议实现)或编写等效于网络库的代码。(提示:前者更容易、更快捷且更少出错。)

@sourD:Mike是对的。我曾经尝试过使用sockets来编写IRC机器人,但这非常痛苦。虽然我当时是为了学习而这么做,但即使是这样,它也没有太多价值。最好还是使用库。 - Daenyth

0

Python Twisted IRC客户端

安装

sudo yum install python-twisted-words

或者

sudo apt-get install python-twisted-words

API文档

http://twistedmatrix.com/documents/8.2.0/api/twisted.words.protocols.irc.IRCClient.html

例子

#!/usr/bin/env python2.7

from twisted.internet import reactor, protocol
from twisted.words.protocols import irc

class IRCLogger(irc.IRCClient):
    logfile = file('/tmp/freenode.txt', 'a+')

    nick = 'davey_jones_logger'

    def signedOn(self):
        self.join('#scala')

    def privmsg(self, user, channel, message):
        print "Got msg %s " % message
        self.logfile.write(" %s said %s \n" % ( user.split('!')[0], message ))
        self.logfile.flush()

def main():
    f = protocol.ReconnectingClientFactory()
    f.protocol = IRCLogger
    reactor.connectTCP('irc.freenode.net', 6667, f)
    reactor.run()

if __name__ == '__main__':
    main()

0

你想加入的特定频道要求你在该服务器上注册nickserv。尝试使用常规IRC客户端进入服务器并创建自己的频道,然后告诉机器人加入该频道。


我阅读了RFC,我明白这是因为客户端未注册。 - sourD

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