Не работает команда в телеграмм боте

Задумка такая: после ввода команды, бот запрашивает время в минутах, после чего ставит таймер.

@bot.message_handler(commands=['timer'])
def timer(message):
    bot.send_message(message.chat.id, 'Введите время в минутах')
    minutes = message.text
    seconds = minutes * 60
    bot.send_message(message.chat.id, 'Поставил таймер на %s минут' % minutes)
    time.sleep(seconds / 2)
    bot.send_message(message.chat.id, 'Половина времени уже прошла! Осталось %s минут!' % minutes / 2)
    time.sleep(seconds / 2)
    bot.send_message(message.chat.id, 'Время прошло!')

но вместо чисел, бот берёт в переменную minutes значение команды. Как исправить такое и почему такое случается?


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

Автор решения: Artesah

Если хотите что бы время спрашивалось после ввода команды /timer, то нужно использовать FSM (для этого есть встроенный функционал в aiogram), и принимать значение в отдельном хендлере.

Проще принимать вторым аргументом, например /timer 5.

@bot.message_handler(commands=['timer'])
def timer(message):
    seconds = int(message.text.split(" ")[1])*60

Но использовать sleep в боте - не лучшая практика. Лучше использовать aiogram c его asyncio.sleep(), или вот есть пример таймер бота на python-telegram-bot.

→ Ссылка
Автор решения: Max Gacrux
@bot.message_handler(func=lambda message: True, commands=['time'])
def task_time(message):
    time = message.text[len("time") + 1:]
    try:
        if int(time) > 0:
            bot.send_message(message.chat.id, f"Время = {time}")
        else:
            bot.send_message(message.chat.id, f"Сорри, время не может быть отрицательным")
    except ValueError:
        bot.send_message(message.chat.id, f"Нужно время!")


if __name__ == "__main__":
    bot.polling()

Запуск в боте: /time 60

→ Ссылка
Автор решения: Max Gacrux
import schedule
import telebot
import time
import threading


time_list = list()
id_user = list()

bot = telebot.TeleBot("AAAAAAAAAAAAAAAA")

def job():
    bot.send_message(id_user[0], "Время вышло!")


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


@bot.message_handler(func=lambda message: True, commands=['time'])
def task_time(message):
    time = message.text[len("time") + 2:]
    time_list.append(float(time))
    id_user.append(message.chat.id)
    schedule.every(time_list[0]).minutes.do(job)
    t = threading.Thread(target=go, name="тест")
    t.start()
    try:
        if float(time) > 0:
            bot.send_message(message.chat.id, f"Время = {time}")
        else:
            bot.send_message(message.chat.id, f"Сорри, время не может быть отрицательным")
    except ValueError:
        bot.send_message(message.chat.id, f"Нужно время!")


if __name__ == "__main__":
    bot.polling()
→ Ссылка