Создаем анкету (опрос), пользователь должен пройти последовательность шагов, где Handler сообщает системе, каким должен быть следующий шаг. В зависимости от ответа, последовательность может меняться.
Для этого используется обработчик ConversationHandler — позволяет строить (описывать) диалоги со сложной логикой. У каждого ConversationHandler есть:
entry_points — запускает данный диалог, точка входа.
states — шаги диалога, у каждого шага есть название и обработчик на который этот шаг реагирует.
fallbacks — выход из диалога или можно использовать при некорректном вводе информации пользователем.
1. В файле utility.py создадим дополнительную кнопку «Заполнить анкету».
2. В файл bot.py импортируем ConversationHandler, и создаем базовую структуру обработчика.
Вход в диалог — это один или несколько обработчиков, после срабатывания диалог будет считаться начатым.
3. Сделаем так чтобы диалог начинался с фразы «Заполнить анкету» или при нажатии кнопки «Заполнить анкету».
4. В файле handlers.py создаем функцию anketa_start(). Функция будет убирать основную клавиатуру с помощью ReplyKeyboardRemove и определять следующий шаг диалога по ключу user_name.
5. Добавим ключ user_name в словарь states файла bot.py, указав следующий шаг функция anketa_get_name().
6. В файле handlers.py создаем (описываем) функцию anketa_get_name() и в ней укажем ключ user_age.
7. Следующий шаг ссылается на функцию anketa_get_age(). В файле handlers.py создаем (описываем) функцию anketa_get_age() и в ней укажем ключ evalution. Для реализации клавиатуры понадобится импортировать ReplyKeyboardMarkup.
8. Следующий шаг ссылается на функцию anketa_get_evalution(). В файле handlers.py создаем (описываем) функцию anketa_get_evalution() и в ней укажем ключ comment.
9. Завершаем нашу анкету (диалог) создав две функции anketa_exit_comment() и anketa_comment().
10. Что бы избежать получения от пользователя текста вместо цифр или цифр не указанных на шаге, где пользователь оценивает статью нажимая на кнопки от 1 до 5. Используем Failback для проверки введенных данных и создадим функцию реагирующую на неправильный ответ.
11. Для того чтобы в телефонном клиенте клавиатура не растягивалась на пол экрана, добавим resize_keyboard=True.
Запускаем Telegram бота и проверяем работоспособность.
Фиксируем изменения программы в Git репозиторий и по необходимости выкладываем на сайт GitHub. Написанный код в этой статье можно скачать (скопировать) на GitHub.
Предыдущие статьи из серии Python Telegram Bot:
8. Рефакторинг кода Telegram бота.
7. Telegram бот запрашивает местоположение и контакты пользователя.
6. Добавим клавиатуру и научим Telegram бота рассказывать анекдоты.
5. Выкладываем код Telegram бота на GitHub.
4. Учим Telegram бота обрабатывать текстовые сообщения.
3. Научим Telegram бота сообщать о его запуске и здороваться.