@Kreichik

Как сделать так чтобы работа бота не прерывалась?

Пишу бота который должен напоминать пользователю в определённые дни о тренировке. Использую Shedule и вроде всё работает, но мне нужно чтобы помимо напоминания выполнялись и другие функции. А так как я использую цикл while True, то у меня не получается дальше выполнять действия. Код ниже
import telebot
import sqlite3
import schedule
import time

bot = telebot.TeleBot("TOKEN")

def reminder(message):
    people_id = message.chat.id
    connect = sqlite3.connect('users.db')
    cursor = connect.cursor()
    cursor.execute(f"SELECT time FROM info_user WHERE id = {people_id}")
    time_watch = str(cursor.fetchone()[0])
    def remind():
        bot.send_message(people_id, f'Напоминание!!!\nВремя {time_watch}')
    schedule.every().day.at(time_watch).do(remind)


    while True:
        schedule.run_pending()
        time.sleep(1)

bot.polling()
  • Вопрос задан
  • 398 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
У тебя два вечных цикла - один это bot.polling(), другой содержит schedule.run_pending(), и они обязательно будут конфликтовать.
Я не вполне понял почему твой бот вообще работает - он не должен бы, хотя бы потому что reminder() нигде не вызывается, и ничем не декорируется. Разве что ты чего-то не показываешь.

Есть два варианта их подружить по-человечески.
1. засунуть один из циклов (лучше schedule) в отдельный поток
2. использовать асинхронную библиотеку вроде pyrogram, и заменить time.sleep() на await asyncio.sleep().
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Я бы дописал
bot.polling(none_stop=True)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы