【问题标题】:IRC bot can't join channelIRC bot 无法加入频道
【发布时间】:2016-03-28 14:34:39
【问题描述】:
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 :你还没有注册"

【问题讨论】:

  • 'PING' in data 通常优于 data.find('PING') != -1

标签: python irc


【解决方案1】:

迈克·格雷厄姆错了。问题是您过早发送 JOIN 命令。服务器注册您的 NICK 和 USER 命令需要一段时间,因此出现错误“Nick not registered”。 请参阅此回复:Python IRC bot won't join

我还想鼓励您通过使用裸套接字制作机器人来继续学习和发现 IRC 协议。谁在乎你的代码并不完全符合 RFC 1459。几乎没有任何服务器、客户端或机器人 100% 符合标准。但如果它有效,它就有效!

与 Daenyth 所说的不同,使用裸套接字 IRC 机器人获得一些出色的结果并不难。只需阅读 RFC 并进行实验!

【讨论】:

  • +1 我同意动手/动手学习的方法。结果你会有更深的理解。还要记住,自从编写 RFC 以来,出于安全原因,已经修改了相当多的服务器命令。
  • 您通常需要等待422(错误MOTD 丢失)或376(MOTD 结束),然后发送加入。
【解决方案2】:

听起来您尚未注册,这是加入该频道的要求。您必须注册您的昵称,然后在加入之前进行识别。

另外,尝试用裸套接字制作一个 irc 机器人也不是一个好主意。此代码没有将 RFC 1459 实现到有用的级别,并且它将您的程序逻辑与您的网络混为一谈。考虑使用网络库(如Twistedtwisted.words 有一个很好的 IRC 协议实现)或编写与其等效的代码。 (提示,前者更容易、更快捷且不易出错。)

【讨论】:

  • @sourD:迈克是对的。我已经完成了 irc-bot-with-sockets 的事情,这非常痛苦。我把它作为一种学习经验,但即便如此,它也不是很有价值。坚持图书馆
【解决方案3】:

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

【讨论】:

  • 我阅读了 RFC,我明白了,因为客户端没有注册
【解决方案4】:

Python 扭曲的 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()

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2015-03-23
    • 2016-03-01
    • 2016-12-21
    • 2017-02-25
    • 2013-02-27
    相关资源
    最近更新 更多