Запрос числа у пользователя Telegram-бот
Мне нужно сделать так, чтобы пока человек не ввёл число, телеграмм бот спрашивал у него это число.
Код:
def process_num1_step(message,user_resalt1 = None):
try:
global user_num1
if user_resalt1 == None:
user_num1 = int(message.text)
else:
user_num1 = user_result1
except Exception as e:
bot.reply_to(message, "Это не число, или что-то пошло не так,пожалуйста попробуйте снова")
bot.send_message(message.chat.id, "Сколько игр сыграла команда гостей?")
bot.register_next_step_handler(message, process_num2_step)
def process_num2_step(message, user_result1 = None):
try:
global user_num2
if user_result1 == None:
user_num2 = int(message.text)
else:
user_num2 =str(user_result1)
except Exception as e:
bot.reply_to(message, "Это не число, или что-то пошло не так,пожалуйста попробуйте снова")
bot.send_message(message.chat.id, "Сколько побед у домашней команды?")
bot.register_next_step_handler(message, process_num3_step)
Ответы (2 шт):
Чтобы реализовать ввод числа до тех пор, пока пользователь не введет правильное значение, вы можете использовать рекурсию в функциях process_num1_step, process_num2_step и т. д. Также, я заметил опечатку в вашем коде: user_resalt1 должно быть user_result1.
Для начала нужно понять, что регистрация ответов начинается только после запуска функции process_num1_step, следовательно проверку организовывать нужно только на втором шаге, после того как задали вопрос (если вы не использовали bot.register_next_step_handler ранее), на втором шаге вы уже регистрируете ответ от пользователя и начинаете работу с ним.
Используйте if и else для проверки, метод isdigit() проверяет все ли символы в строке цифры. Если условие не срабатывает функция process_num2_step запустится повторно из else.
Как пример:
def process_num1_step(message):
msg = bot.send_message(message.chat.id, "Сколько игр сыграла команда гостей?")
bot.register_next_step_handler(msg, process_num2_step)
def process_num2_step(message):
user_result1 = message.text # сохраняем ответ в переменную
if user_result1.isdigit(): # проверяет строку, если все цифры то True
msg = bot.send_message(message.chat.id, "Сколько побед у домашней команды?")
# передает ответ в следующий шаг
bot.register_next_step_handler(msg, process_num3_step, user_result1)
else:
msg = bot.send_message(message.chat.id, "Вводите только цифры")
# повторно запускает функцию process_num1_step если False
bot.register_next_step_handler(msg, process_num2_step)
А в except лучше выводить реальные ошибки в консоль, для примера:
except Exception as e:
print(f'Ошибка: {e}')