Не работает команда в телеграмм боте
Задумка такая: после ввода команды, бот запрашивает время в минутах, после чего ставит таймер.
@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()