0

我创建了一个通过这样的套接字连接到chan的机器人

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((network,port))
irc = ssl.wrap_socket(socket)

然后我在触发某些操作时发送一些消息,这工作得很好,但是有一条消息被截断,并且我的脚本不返回任何错误。这是此消息的代码:

def GimmeUrlInfos(channel,message):
  link = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', message)
  response = urllib2.urlopen(link[0])
  html = BeautifulSoup(response.read())
  urlTitle = html.find('title')
  irc.send("PRIVMSG %s Link infos:" % (channel) + urlTitle.contents[0] + "\r\n" )

脚本查看消息中是否有链接,如果有,beautifulSoup 获取 HTML 页面的标题。所以它返回类似:Link infos: THis is the Title of the Webpage you give in your message.

但它只会返回

关联

在频道。是否有一些限制或什么?

4

2 回答 2

1

从你的问题很难看出,但我认为你想发送这样的东西:

PRIVMSG #mychannel Link infos: Title of Page\r\n

......实际上只发送了这样的东西:

PRIVMSG #mychannel Link 

socket.send对此的一种可能解释是SSLSocket.send不一定会发送您提供的整个字符串。这就是为什么它们返回发送的多个字节的原因。如果您想阻止直到它能够发送整个字符串,请sendall改用。

于 2013-10-03T19:09:32.060 回答
1

这是我的下一个猜测,现在你已经给了我们更多信息:

您的字符串如下所示:

PRIVMSG #mychannel Link infos: Title of Page\r\n

在 IRC 中,参数以空格分隔,但以冒号开头的参数可以包含空格,并运行到行尾。因此,您的目标是#mychannel,您的消息是Link,并且该行的其余部分是一堆被忽略的额外参数。

要解决此问题,您要发送:

PRIVMSG #mychannel :Link infos: Title of Page\r\n

因此,像这样更改您的代码:

irc.send("PRIVMSG %s :Link infos:" % (channel) + urlTitle.contents[0] + "\r\n" )

有关如何在 RFC 和PRIVMSG命令中格式化消息的更多详细信息,请参阅2.3.1 'pseudo' BNF 中的消息格式和RFC 1459 中的4.4.1 私人消息

于 2013-10-03T19:30:57.170 回答