Оптимизация кода Python (бот на PyTelegramBotAPI) и решение ошибки связанной с слишком большим сообщением
Вообщем - я делал телеграм бота на Python, который по названию (объекта, человека, предмета и тд.) вида будет отправлять информацию из википедии об этом. Решил использовать библиотеку PyTelegramBotAPI для создания самого каркаса бота, библиотеку wikipedia для извлечения информации о предмете и библиотеку translate для перевода информации (т.к. она извлекается на английском). Вот что в итоге у меня получилось:
import telebot
import wikipedia
from translate import Translator
bot = telebot.TeleBot("TOKEN")
@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
bot.reply_to(message, "Привет, это wiki-bot ???\nОтправь ему сообщение, начинающиеся\n с команды /wiki, и напиши мне название того,\nчто тебе нужно, через пробел, чтобы найти\n информацию об этом ?")
@bot.message_handler(content_types=['text'])
def send_adress(message):
if message.text.startswith('/wiki') == True:
translates = []
el_prepar = list(message.text)
del el_prepar[0:6]
el = ''.join(el_prepar)
wiki_prepar = wikipedia.page(el)
wiki = wiki_prepar.content
wiki_words = wiki.split()
for i in wiki_words:
translate_prepar = Translator(to_lang="Russian")
translate_i = translate_prepar.translate(i)
translates.append(translate_i)
translate = ' '.join(translates)
l = len(translate) + 1
part_1 = translate[0:l//2]
part_2 = translate[l//2:]
l2 = len(part_1) + 1
part_3 = part_1[0:l2//2]
part_4 = part_1[l2//2:]
l3 = len(part_2) + 1
part_5 = part_2[0:l3//2]
part_6 = part_2[l3//2:]
l4 = len(part_3) + 1
part_7 = part_3[0:l4//2]
part_8 = part_3[l4//2:]
bot.send_message(message.chat.id, part_3)
bot.send_message(message.chat.id, part_4)
bot.send_message(message.chat.id, part_5)
bot.send_message(message.chat.id, part_6)
bot.send_message(message.chat.id, part_7)
bot.send_message(message.chat.id, part_8)
bot.polling()
Есть 2 проблемы: первая - код выполняется очень медленно (Вселенная вступит в фазу Большого Сжатия пока этот код будет выполнятся), вторая - даже при том, что я разделил переведённый текст на 6 частей, он выдаёт вот такую оошибку:
2021-02-13 11:55:22,221 (__init__.py:515 MainThread) ERROR - TeleBot: "A request
to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request
: message is too long"
, которая означает то, что сообщения слишком большие. Помогите пожалуйста оптимизировать данный код и решить проблему с размером сообщений.
Ответы (1 шт):
для получения "аргумента" команды можно использовать split(maxsplit=1):
message.text.split(maxsplit=1)
[In]: /wiki тест
[Out]: ['wiki', 'тест']
message.text.split(maxsplit=1)[1]
>> тест
у модуля wikipedia есть метод set_lang позволяющий задать префикс языка:
wikipedia.set_lang('ru')
r = wikipedia.page(message.text.split(maxsplit=1)[1]).content
для того чтобы разбить отправляемое сообщение ботом на несколько, если оно превышает 4096 знаков:
if len(r) > 4096:
for x in range(0, len(r), 4096):
bot.send_message(message.chat.id, '{}'.format(r[x:x + 4096]))
print(x)
else:
bot.send_message(message.chat.id, '{}'.format(r))
Итогом получим:
import telebot
import wikipedia
bot = telebot.TeleBot('9:AAE')
print(bot.get_me())
@bot.message_handler(commands=['wiki'])
def wiki(message):
wikipedia.set_lang('ru')
r = wikipedia.page(message.text.split(maxsplit=1)[1]).content
if len(r) > 4096:
for x in range(0, len(r), 4096):
bot.send_message(message.chat.id, '{}'.format(r[x:x + 4096]))
print(x)
else:
bot.send_message(message.chat.id, '{}'.format(r))
bot.polling(none_stop=True, interval=0)
в результате отправив боту /wiki москва получим вывод https://ru.wikipedia.org/wiki/Москва в виде 23 сообщений.