Сообщение Python Socket усекается
Я создал бота, который подключается к каналу через сокет, как это
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 ответа
Вот мое следующее предположение, теперь, когда вы дали нам немного больше информации:
Ваша строка выглядит так:
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 Формат сообщения в "псевдо" BNF и 4.4.1 Личные сообщения в RFC 1459.
Трудно сказать по твоему вопросу, но я думаю, что ты хотел отправить что-то вроде этого:
PRIVMSG #mychannel Link infos: Title of Page\r\n
... и на самом деле только отправил что-то вроде этого:
PRIVMSG #mychannel Link
Одним из возможных объяснений этого является то, что socket.send
и SSLSocket.send не обязательно отправляет всю строку, которую вы ей даете. Вот почему они возвращают количество отправленных байтов. Если вы хотите заблокировать, пока не сможете отправить всю строку, используйте sendall
вместо.