【问题标题】:Creating a simple IRC bot in python. Having trouble在 python 中创建一个简单的 IRC 机器人。遇到麻烦
【发布时间】:2015-01-25 12:21:42
【问题描述】:

所以几个小时前,我决定尝试使用 python 处理套接字并构建一个简单的 irc 机器人。到目前为止,我在将其连接到服务器时遇到了一些麻烦。我收到以下错误:

b":irc.ku.cx 439 * :Please wait while we process your connection.\r\n:irc.ku.cx NOTICE AUTH :*** Couldn't look up your hostname (cached)\r\n"
b':irc.ku.cx NOTICE AUTH :*** Checking Ident\r\n'
b':irc.ku.cx NOTICE AUTH :*** No Ident response\r\n'

之后它就停止了。但是在它运行大约一分钟后,我突然得到了无穷无尽的b"",每个都在一个新行中(可能与代码中的while循环有关)。这是我的代码:

import socket

server = 'irc.rizon.net'
channel = '#linux'
nick = 'MyBot'
port = 6667

ircsock = socket.socket()
ircsock.connect((server, port))

ircsock.send(bytes('"NICK " + nick', 'UTF-8'))
ircsock.send(bytes('"USER " + nick + " " + nick + " " + nick + " :" + nick', 'UTF-8'))

while True:
    data = ircsock.recv(2048)
    print (data)

    if data.find(b"PING") != -1:
        ircsock.send(b"PONG :" + data.split(':')[1])

感谢你们提供的任何帮助。

【问题讨论】:

标签: python python-3.x bots irc


【解决方案1】:

正如 icktoofay 所说,您的代码中有额外的引号。此外,在 IRC 中,您需要在每个命令的末尾添加一个换行符 (\r\n)。

替换这些行:

ircsock.send(bytes('"NICK " + nick', 'UTF-8'))
ircsock.send(bytes('"USER " + nick + " " + nick + " " + nick + " :" + nick', 'UTF-8'))

ircsock.send(bytes("NICK " + nick + "\r\n", 'UTF-8'))
ircsock.send(bytes("USER " + nick + " " + nick + " " + nick + " :" + nick + "\r\n", 'UTF-8'))

它应该可以工作。

顺便说一句,我建议改用socket.makefile(),它会为您处理缓冲和编码。这是您的代码修改为使用文件接口:

import socket

server = 'irc.rizon.net'
channel = '#linux'
nick = 'MyBot'
port = 6667

ircsock = socket.socket()
ircsock.connect((server, port))

handle = ircsock.makefile(mode='rw', buffering=1, encoding='utf-8', newline='\r\n')

print('NICK', nick, file=handle)
print('USER', nick, nick, nick, ':'+nick, file=handle)

for line in handle:
    line = line.strip()
    print(line)

    if "PING" in line:
        print("PONG :" + line.split(':')[1], file=handle)

这里,我使用print 自动插入空格和换行符的函数。

【讨论】:

  • 你是对的,我忘了在每个 send() 命令后添加一个换行符。它工作得很好。不幸的是,使用 makefile() 会导致相同的错误,因为它在No Ident response 处停止,然后因为Registration Timed Out 而自动关闭链接。我尝试逐字复制您的示例和相同的错误。
  • “没有识别响应”是正常的。这意味着您的机器上没有运行ident server,但您应该仍然能够在没有它的情况下进行连接。至于您的第二个问题,this question 可能会有所帮助。
  • 根据您发送的那个链接,问题已通过发送'\r\n' 解决。但是我不是已经默认通过print 发送了吗?
  • 我发现了问题。默认情况下,套接字使用块缓冲,并且由于我们从不排队足够的数据来填充缓冲区,因此永远不会发送消息。解决方案是将buffering=1 添加到makefile() 调用中,将其改为行缓冲。
  • 太棒了,成功了。非常感谢您的帮助。
猜你喜欢
  • 2011-06-16
  • 2011-02-27
  • 2022-01-03
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 2023-02-11
相关资源
最近更新 更多