Запрос числа у пользователя 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 шт):

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

Чтобы реализовать ввод числа до тех пор, пока пользователь не введет правильное значение, вы можете использовать рекурсию в функциях process_num1_step, process_num2_step и т. д. Также, я заметил опечатку в вашем коде: user_resalt1 должно быть user_result1.

→ Ссылка
Автор решения: Medvedev

Для начала нужно понять, что регистрация ответов начинается только после запуска функции 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}')
→ Ссылка