Python套接字消息被截断

时间:2013-10-03 18:56:36

标签: python sockets irc

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

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

但它只会返回

  

链接

在频道。是否存在某些限制?

2 个答案:

答案 0 :(得分:1)

很难从你的问题中说出来,但我想你想发送这样的信息:

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

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

PRIVMSG #mychannel Link 

对此的一种可能解释是socket.sendSSLSocket.send不必发送您提供的整个字符串。这就是他们返回发送的字节数的原因。如果您想要阻止它能够发送整个字符串,请改用sendall

答案 1 :(得分: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命令中格式化消息的详细信息,请参阅RFC 1459中的2.3.1 Message format in 'pseudo' BNF4.4.1 Private messages