Как стать автором
Обновить

Маленькая победа или история о том, как я обуздал «падения» pytelegrambotapi

Python *Алгоритмы *Занимательные задачки Программирование *
Ожидает приглашения
Сервера Telegram каждые 5 минут
Сервера Telegram каждые 5 минут

Всем привет, особенно python-разработчикам. Я занимаюсь разработкой чат-ботов для социальной сети Telegram 2 года. За это время научился многому в данной нише программирования. Однако сейчас речь даже не про это. Ничто в нашем мире не идеально, telebot не исключение.

Начиная писать ботов, мой код выглядел до жути страшным и банальным: не соблюдение стандартов PEP8, большие повторы кода и т.д. Но основная ошибка даже не появлялась. Первые клиенты перестали выходить на связи после завершения сделки. Казалось бы, что тут такого? Но несмотря на это, написанные мною чат-боты не работали. Я посчитал на тот момент, что дело в неоплаченных серверах. Такое часто бывает, что клиенты заказывают бота, а после забивают на свой проект. Поэтому я особо не обращал внимания на данные траблы. Время шло, появился новый клиент, с которым я работаю до сих пор, задача которого - чат-бот товаров для картинга, позже бот для подачи заявок на участие в конкурсах и чемпионатах. В процессе разработки бот падал по неизвестным мне причинам. Я долго ломал голову, а потом понял, что единственным решением здесь будет конструкция try-except. И вроде бы всё наладилось. Ошибки стали явными, код правился и совершенствовался в плане уязвимостей и функциональности.

Обработчик ошибок
Обработчик ошибок

Может это кому-то поможет, может нет, но большая часть ботов может отлететь во время банальной обработки сообщения в message_nandler. Если скрипт ожидает то или иное сообщение для его обработки, а пользователь прислал что-то иное (фото, видео и т.д.), то код выдаст ошибку, либо упадёт полностью, так как библиотека не проверяет объект на наличие параметров. То есть при отправке пользователем фотографии, объект message.text будет равен значению None. Это очень важно учитывать в тех или иных конструкциях, так как данная уязвимость может стать "кощеевой иглой" вашего проекта.

Проверка объекта на наличие
Проверка объекта на наличие

На дворе конец 2021 года, новый заказ. Чат-бот должен парсить информацию о товаре с Wildberries по артикулу, после чего постить в канал форматированную информацию через установленное время. Заказ был сделан, клиент остался доволен, однако появились траблы. Бот стал "умирать". Сначала мои подозрения пали на функцию проверки базы данных для публикации поста. Но нет, ошибка была не в этом, хоть и функция загружала сервер на все 100%. Позже я её переписал, нагрузка упала полностью. Я начал искать ошибку, после чего выяснил, что бот падал из-за ошибки соединения с серверами Telegram, который направлял запрос на перезапуск пиров. Данная ошибка мучала меня долгое время, так как чтобы я не делал для её решения - она не пропадала. Первым делом я решил поставить timeout=123, в вызове функции polling(). Первое время все работало, но позже падения начали продолжаться вновь. Следующим шагом было изменить функцию polling на infinity_polling(). Это помогло, но... Используя эту функцию, нет гарантии, что все сообщения будут доставлены до бота во время, либо доставлены полностью. Явно, что это траблы телеги. Может быть вы замечали, что иногда при общении с ботом, может пропасть любая активность приложения. Я предполагаю, что это тот самый момент, когда сервера запрашивают обновление пиров, хотя могу ошибаться. В любом случае данное решение мне не подходило, а сроки поджимали.

Та самая ошибка
Та самая ошибка

На тот момент я решил поступить самым лёгким способом, который не подводит меня до сих пор. Конструкция try-except обёрнутая while True.

if __name__ == '__main__':
  while True:
    try:
      bot.polling(none_stop=True)
    except:
      sleep(0.3)

То есть при падении чат-бота, скрипт ожидает некоторое кол-во времени, так как на возобновление пиров необходимо время, после чего поднимается вновь при помощи while True. То есть теперь даже если пропадёт интернет, бот не упадёт, а будет ждать соединения. Может данное решение является неправильным или перегруженным, однако это единственный рабочий для меня вариант на данный момент.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.