Как бот в телеграмме может подождать ввод числа пользователем?

Пишу бота для Телеграмм на telebot(pytelegrambotapi) и вообщем-то бот пишет человеку, чтобы он ввел длину паролей и человек не успевает ничего ввести как бот продолжает дальше выполнять код, который приведет к ошибке.

def next_step2(*args):
    if use_english == 'нет' and use_figures == 'нет' use_symbols == 'нет':
        error_settings()
    else:
        bot.send_message(message.chat.id, '''
            ❍ Напишите длину паролей \n  \n
            ➮ Макс. 150 символов, минимум 1''')

        length = message.text # Здесь необходима какая-то задержка, потому что человек не успевает ничего ввести как сразу же бот проверяет следущую строку.

        if length.isdigit() == True:
            bot.send_message(message.chat.id, 'Кол-во символов в паролях будет: ' +str(length))
        else:
            error001()

def error001(*args):
    bot.send_message(message.chat.id, '''
        ❍ Вы написали что-то другое.. 
        \n ➮ Напишите длину паролей, макс. 150 символов, минимум 1
        \n ➮ Или нажмите на кнопку, чтобы сгенерировать длину 
        ''' .format(name))

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

Автор решения: Roman Konoval

Нужно организовать взаимодействие таким образом:

  1. бот получает команду
  2. бот посылает запрос на ввод числа
  3. бот получает число в новом сообщении
  4. бот сохраняет полученное число

Вам нужно ждать после шага 2. Важный момент, это что ожидание должно происходить не в обработчике шага 1. Т.е. в обработчике команды, бот должен

  1. послать запрос на ввод числа
  2. запомнить, что такому-то пользователю он послал запрос

Запоминание нужно, чтобы, когда бот получит следующее сообщение от этого пользователя (в отдельном обработчике, т.е. в функции с `@bot.message_handler'), то чтобы бот знал, что это сообщение нужно трактовать как ответ на вопрос.

Самый простейший вариант, это сохранить message.chat.id в коллекцию типа так:

waiting_for_password_length_reply = set()

def next_step2(..):
    ...
    waiting_for_password_length_reply.add(message.chat.id)
    bot.send_message(message.chat.id, '''
            ❍ Напишите длину паролей \n  \n
            ➮ Макс. 150 символов, минимум 1''')

Ну и теперь в новом обработчике можно сделать так:

@bot.message_handler(func=lambda message: message.chat.id in waiting_for_password_length_reply, content_types=['text'])
def handle_password_length_reply(message):
    try:
       length = int(message.text) 
       bot.send_message(message.chat.id, 'Кол-во символов в паролях будет: ' +str(length))
       waiting_for_password_length_reply.remove(message.chat.id)
    except ValueError as e:
       error001()
→ Ссылка