Таймер для телеграмм бота
Нужен таймер для телеграм-бота. Суть такова, что если пользователь не отправляет сообщение 1 час, то бот должен написать ему, в противном случае прервать цикл Код выглядит примерно так:
@bot.message_handler(content_typer=['text'])
def fio(message):
text = message.text
timing = time.time()
while True:
if message.text != text:
break
if time.time() - timing > 3600:
bot.send_message(message.chat.id,'ВНИМАНИЕ! Вы не ответили на вопросы!')
timing = time.time()
sleep(10)
Проблема в том, что message.text не изменяется, даже если написать что-то в бота. Поэтому я без понятия как выйти из этого цикла. Помогите кто-нибудь
python telegram-bot
Ответы (3 шт):
У тебя не стоит условие выхода из While(пока) поэтому он будет бесконечным
Задай условие для цикла в котором оно достигается ответом от пользователя или счетчиком который будет обновляться с каждым сообщением от пользователя цикл "While условие" логически выгляди так: "Пока условие не будет истино" В твоем случае условие истино всегда
Я бы предложил следующий подход для решения данной задачи.
Можно использовать библиотеку schedule. Документация находится здесь.
После того как бот получает сообщение от пользователя нужно создать job примерно так:
schedule.every(1).hours.do(send_warning).tag('CHAT-ID')
Где CHAT-ID — ид чата с пользователем. В функции send_warning нужно реализовать отправку сообщения с текстом предупреждения.
Если сообщение от пользователя все же пришло, то нужно отменить job по тегу так: schedule.clear('CHAT-ID')
Ну и нужно создать фоновый поток для schedule.
UPD: У меня получился такой код:
import schedule
import telebot
from threading import Thread
from time import sleep
TOKEN = "TOKEN"
bot = telebot.TeleBot(TOKEN)
def schedule_checker():
while True:
schedule.run_pending()
sleep(1)
@bot.message_handler(func=lambda message: True)
def fio(message):
text = message.text
if text and len(schedule.get_jobs(message.chat.id)) >= 1:
schedule.clear(message.chat.id)
bot.send_message(message.chat.id, "Ответ получен")
else:
schedule.every(3).seconds.do(get_sending_function(message.chat.id)).tag(message.chat.id)
def get_sending_function(chatId):
def send_function():
bot.send_message(chatId, "ВНИМАНИЕ! Вы не ответили на вопросы!")
return schedule.CancelJob
return send_function
if __name__ == "__main__":
scheduleThread = Thread(target=schedule_checker)
scheduleThread.daemon = True
scheduleThread.start()
bot.polling()
Думаю, дальше можно адаптировать этот пример под Вашу задачу.
У вас там в коде в message_handler написано content_typer а надо content_types, думаю как раз из-за этого message.text и не изменяется.