Сообщение 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 вместо.

Другие вопросы по тегам