Как бот в телеграмме может подождать ввод числа пользователем?
Пишу бота для Телеграмм на 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 шт):
Нужно организовать взаимодействие таким образом:
- бот получает команду
- бот посылает запрос на ввод числа
- бот получает число в новом сообщении
- бот сохраняет полученное число
Вам нужно ждать после шага 2. Важный момент, это что ожидание должно происходить не в обработчике шага 1. Т.е. в обработчике команды, бот должен
- послать запрос на ввод числа
- запомнить, что такому-то пользователю он послал запрос
Запоминание нужно, чтобы, когда бот получит следующее сообщение от этого пользователя (в отдельном обработчике, т.е. в функции с `@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()