#python #telegram #telegram-bot #telethon
Вопрос:
Я пишу небольшой скрипт на python, используя библиотеку телемарафонов. Одна из функций, которую я пишу, возвращает частоту использования слов определенного пользователя. Частота использования слов содержится в строковом объекте, который возвращается пользователю в Telegram.
Код этой функции показан ниже.
@bot.on(events.NewMessage(pattern='/wordsUsage'))
async def start(event):
"""Returns the word usage frequency of a specific user."""
messagesHistory = await client.get_messages(chat_id, None, from_user=event.message.from_id.user_id)
messagesHistory = [i.message for i in messagesHistory if type(i.message) is str]
# I know this line is ugly, let me alone c:
listWords = ' '.join(messagesHistory).replace('n', ' ').split(' ')
countWord = dict()
for word in listWords:
if word not in countWord.keys():
countWord[word] = 1
else:
countWord[word] = 1
countWord = sorted(countWord.items(), key=lambda item: item[1])
await event.respond(pprint.pformat(countWord, indent=4))
raise events.StopPropagation
При вызове этой функции я получаю следующую ошибку :
telethon.errors.rpcerrorlist.MessageEmptyError: Empty or invalid UTF-8 message was sent (caused by SendMessageRequest)
Я не понимаю, где я ошибаюсь, так как строки Python3 являются строками UTF-8.
Комментарии:
1. Какую версию вы используете? Каков же результат
pprint.pformat
? Это непустая строка? Вы уверены, что ошибка исходит от этой функции?2. @Lonami Я использую версию 1.23.0. Это образец результата pprint.pformat :
('une', 31), ('ca', 33), ('̬̝̮̱̫̖̓͋͠Ⓘ̶̪̬͔̰̇̒Ⓝ̶̤͕̥͎͓̐ͩ͛̚☠️🔥🔥☠️Ⓓ̲̠̺͉̯͓͑ͧ̾͜Ⓤ͍̺̭̺̹̾̏̏͂́', 33), ('̜̲͍̼̭̈́̓̂̀ͅⓅ̶͚̖̘̫̖͙̮̏Ⓐͨ', 34), ('que', 35), ('et', 35),
3. Эмодзи кажутся сломанными, так что, вероятно, именно поэтому. Возможно, вам захочется удалить неверные символы из выходных данных перед их использованием
respond
(например, кодирование в ASCII и обратно).4. Да, я это видел, но поскольку строки Python3 являются строками UTF-8, я подумал, что все будет в порядке. Я санирую вывод :). Спасибо за вашу помощь.
5. Строки Python 3 являются UTF-8, но ничто не мешает им иметь недопустимый UTF-8 (в отличие, скажем, от Rust, который будет паниковать во время выполнения).