PyTelegramAPI автоматическая отправка сообщения

Необходимо в определенное время отправлять пользователю сообщение, разумеется без его участия. Сообщения отправляются в виде callback'ов, которые вызывают сами сообщения.

@bot.message_handler(regexp="Напоминания") # пользователь нажимает на клавиатуре кнопку и в базе меняется сего статус
def next_ticket(message): 
        bot.send_message(message.chat.id, "Хотите ключить напоминания? В этом случае я буду присылать вам по одному случайному вопросу раз в день.")

        keyboard = types.InlineKeyboardMarkup()
        button_1 = types.InlineKeyboardButton(text="Да", callback_data= "reminding_on") 
        button_2 = types.InlineKeyboardButton(text="Нет", callback_data= "reminding_off")

        keyboard.row(button_1, button_2)
        msg = bot.send_message(message.chat.id, "Включаем?", reply_markup=keyboard)
        bot.register_next_step_handler(msg, job)  # переходим к следующей функции

# И тут начинается проблема: 
def job():  
    сlass XClass(object):  # четыре следующие строки мне помогли написать и я не понимаю как они работают, но callback точно посылается.
        def __init__(self):
            self.message = message
            self.data = "ticket_1" # после отправки этого callback'а пользователю должно отправится сообщение
callback_inline(XClass())

    schedule.every(10).minutes.do(job) # задаем время для периодического вызова функции
    schedule.run_pending()
    time.sleep(1)

Как сделать так, чтобы функция job() работала и отправляла callback'и?

При этом если просто запустить такой код:

@bot.message_handler(regexp="Напоминания")
def job(message):  
    сlass XClass(object):
        def __init__(self):
            self.message = message
            self.data = "ticket_1" 
callback_inline(XClass())

То callback выдается , но только при отправке пользователем любого сообщения. Как сделать, чтобы функция job работала самостоятельно?


Ответы (1 шт):

Автор решения: Dmitry Artamonov

Итак, проблема решилась следующим образом:

Достаточно один раз получить соответствующий call.data
и запускается цикл.

    if call.data == "reminding_on":
        bot.send_message(call.message.chat.id, 'Ок. Каждый день в 17:20 по Московскому времени я буду присылать вам один случайный вопрос.')
        def job():
            randomnum = randrange(1, 20, 1)
            randomnum_2 = randrange(1, 10, 1)
            random_ticket = str(randomnum) +'.'+str(randomnum_2)
            date = datetime.datetime.today()
            nowtime = date.strftime('%H:%M')
            send_time = "17:20"
            
            while nowtime != send_time:
                # bot.send_message(call.message.chat.id, str(nowtime))
                # bot.send_message(call.message.chat.id, str(send_time))
                time.sleep(5)
                return job()
            else:
                class XClass(object):
                    def __init__(self):
                        self.message = call.message
                        self.data = "ticket_%s" % random_ticket
                callback_inline(XClass())
                time.sleep(60)
                return job()
        job()

Надеюсь это будет кому то полезно.

→ Ссылка