Телеграмм бот на telebot отключается сам без ошибок
Проблема
Добрый день! Я пишу бота на telebot, выкладываю на beget. Я уже выкладывал до этого бота на beget, он до сих пор работает (2-3 недели). Сбоев никаких с ним нет. Но теперь я сделал другого бота, он просто перестаёт работать в 3-5 часов ночи независимо от времени запуска. Запускаю через nohup, так как более простого и возможного способа не нашёл (deamon и .service не хватает прав) (как уже говорил проблема не в этом, прошлый бот работает). Проблема точно в добавленных напоминаниях (без них не отключается). Напоминания работают через scheduler вот так: пользователь открывает товар, если его нет ни на одном маркетплейсе (делаются запросы на сайт маркетплейса для получения товаров), то появляется возможность поставить напоминание. Напоминания записываются в SQLite вместе с айди чата пользователя, который ставил напоминание. Затем каждые n минут (сейчас n = 60) в отдельном потоке цикл проходится по напоминаниям, и если товар из напоминания появился на одном из маркетплейсов, то пользователю (по чат айди) отправляется соответствующее сообщение. Затем, если товар уже появился, напоминание удаляется из БД, чтобы не надоедать напоминаниями по одному товару каждому пользователю, потом ожидается 2 секунды между следующим напоминанием (так как я думал, что телеграмм апи блокирует из-за количества запросов), далее переход к следующему напоминанию. Перед циклом проверки напоминаний в лог пишется "The reminder check has started", а после окончания цикла "The reminder check has been played back". Как я говорил, бот перестаёт работать просто так, без ошибок. Логи заканчиваются вот так:
2024-09-07 00:33:58 - INFO - The reminder check has started
2024-09-07 00:34:19 - INFO - The reminder check has been played back
2024-09-07 01:34:20 - INFO - The reminder check has started
2024-09-07 01:34:41 - INFO - The reminder check has been played back
2024-09-07 02:34:41 - INFO - The reminder check has started
2024-09-07 02:35:02 - INFO - The reminder check has been played back
2024-09-07 03:35:03 - INFO - The reminder check has started
2024-09-07 03:35:24 - INFO - The reminder check has been played back
Вот запуск sheduler и запуск самого бота. Обратите внимание, что при падении бота в bot.polling() в логах должна появится ошибка, а бот перезапустится в бесконечном цикле:
def run_scheduler():
try:
while True:
schedule.run_pending()
time.sleep(600)
except Exception as e:
logging.error(f"Unexpected error in run_scheduler command: {e}")
with open('telegram_bot/admins/tech_admins.txt') as admins:
for id_admin in admins:
bot.send_message(id_admin, error_scheduler)
# Планируем задачу
schedule.every(minutes_reminds).minutes.do(remind_all)
# Запускаем планировщик в отдельном потоке
scheduler_thread = threading.Thread(target=run_scheduler)
scheduler_thread.start()
# Запуск бота
while True:
try:
register_next_step_for_all_users()
bot.polling(none_stop=True, timeout=60)
except requests.exceptions.ReadTimeout as e:
logging.error('START Read timeout error: ' + str(e))
time.sleep(60)
except requests.exceptions.ConnectionError as e:
logging.error('Connection error: ' + str(e))
time.sleep(60)
except telebot.apihelper.ApiException as e:
if '502' in str(e):
logging.error('502 Bad Gateway error: ' + str(e))
logging.info(f'Ожидание {1800 / 60} минут перед повторной попыткой.')
time.sleep(1800)
else:
logging.error('START Telegram API error: ' + str(e))
time.sleep(60)
except Exception as e:
logging.error('START Unexpected error: ' + str(e))
time.sleep(60)
В 'telegram_bot/admins/tech_admins.txt' лежат айди админов. Соответственно
with open('telegram_bot/admins/tech_admins.txt') as admins:
for id_admin in admins:
bot.send_message(id_admin, error_scheduler)
Будет отправлять админам сообщение об ошибке. Можете игнорировать этот код, так как главное, что ничего не появляется в логах.
Я попробовал
- Сделать большие временные промежутки между любыми запросами, так как раньше появлялась проблема с telegram api о количестве запросов. Теперь она пропала.
- Логировать любое действие скрипта, логи никак не помогают определить где именно проблема.
- Убрать код напоминаний. Работает без сбоев.
Можно попробовать
- Отслеживать и отчищать память. Где-то я прочитал, что проблема может быть с памятью, но не знаю как реализовать отчистку или хотя-бы проверить, что проблема действительно в этом.
- Использовать другую библиотеку. Возможно, sheduler не может работать с telebot, хотя нигде подобной информации нет, наоборот, это хорошая библиотека и реализация, которую я использовал, не должна нести в себе проблем.