我创建了一个机器人,通过套接字连接到这个
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
。
但它只会返回
链接
在频道。是否存在某些限制?
答案 0 :(得分:1)
很难从你的问题中说出来,但我想你想发送这样的信息:
PRIVMSG #mychannel Link infos: Title of Page\r\n
......实际上只发送了这样的东西:
PRIVMSG #mychannel Link
对此的一种可能解释是socket.send
和SSLSocket.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' BNF和4.4.1 Private messages。