Telegram бот на PHP. Как сохранять состояние ответа пользователя? Только начинаю знакомиться с Telegram API для ботов (до этого весь опыт разработки ботов сводился к написанию простейших полезняшек для себя, вроде по команде /stat отправить некоторую сводную информацию, собранную PHP скриптом из разных источников) поэтому хотел бы уточнить следующее. Допустим мы пишем простейшего бота на PHP без использования сторонних библиотек и классов. Возможно ли реализовать функционал "опроса" пользователя с сохранением состояний ответов без использования MySQL, сохранения в файлы и т.п. Если утрированно, то постановка задачи такая:
- Имеем хост с установленным Apache + PHP, поддержка SSL настроена, бот запущен и настроен через setWebhook.
- Реализовать простейший опрос пользователя, например, спросить у него имя, год рождения и знак зодиака, после чего вывести ему в ответ какую-нибудь картинку (например его имя на красивом фоне с наложением знака зодиака).
И вот тут, даже на "теоретической стадии", у меня возник следующий вопрос. Фактически мы должны узнать у пользователя три входных параметра param1 (name), param2 (year), param3 (zodiac). "Опрос" пользователя считается завершенным если он корректно ввел все три параметра, только после этого выдается результат - картинка (ну или с введенными данными осуществляются какие-то другие действия). Какие варианты отслеживания текущего состояния пользователя в опросе из скрипта существуют? Сервер Telegram "дергает" скрипт каждый раз, когда пользователь присылает какое-либо сообщение и при этом абсолютно не знает о том что следующее сообщение пользователя относится к какому-либо этапу выполнения сценария скрипта.
Например, пользователь дал команду /poll и тем самым начал участие в опросе. После чего бот задает ему первый вопрос, а-ля введите param1. Если введенные пользователем данные прошли валидацию, то бот переходит к следующему шагу и задает второй вопрос, введите param2 и т.п. Если же параметр введен неверно, например указан 3027 год, то бот должен "переспросить" пользователя, т.е. запросить повторный ввод данных. Так вот, вопрос в следующем - как лучше всего отслеживать состояние (на каком этапе он находится, ввод имени, ввода года, ввод знака зодиака) пользователя в этом опросе?
Если бы у нас была MySQL, то можно было бы хранить id пользователя и некое значение state в БД и исходя из этого строить логику работы бота. Т.е. если значение state=1, например, значит пользователь участвует в опросе и отвечает на первый вопрос, если state=2, то отвечает на второй и т.п. То же самое применимо и к хранению состояний в файлах. По-крайней мере это самое логичное что мне пришло в голову. Но может быть есть какое-то более оптимальное решение (например, можно как-то передать серверу Telegram некий параметр state, который придет вместе со следующим сообщением пользователя) или еще что-нибудь в этом духе?
Как бы вы реализовали подобное в описанных стартовых условиях? (напомню что задача носит "учебный" характер, наверняка есть какие-то библиотеки, классы и т.п. использующие БД и позволяющие реализовать все описанное в одну строчку кода, но мне куда интереснее понять принцип как сохранять "состояние пользователя" и определять на каком шаге "сценария" он находится без их использования, т.е. как это реализуют в большинстве ботов, использующих интерактивные диалоги с пользователем).

21 Авг 2019 в 06:27
230 +1
0
Ответы
1

Если вы хотите реализовать подобный функционал без использования базы данных или файлов, вы можете использовать сессии PHP для хранения состояния пользователя. Вы можете сохранить текущий шаг "опроса" пользователя в сессии и на основе этого определять, какой вопрос задавать далее.

Вот пример кода, демонстрирующий использование сессий для отслеживания состояния опроса пользователя:

<?php
session_start();
// Получаем текст сообщения от пользователя
$user_input = "Текст сообщения от пользователя";
// Проверяем текущий шаг опроса пользователя
if (!isset($_SESSION['step'])) {
$_SESSION['step'] = 1;
}
// Логика для каждого шага опроса
switch ($_SESSION['step']) {
case 1:
// Задаем первый вопрос
// Проверяем ответ пользователя и сохраняем его
$_SESSION['param1'] = $user_input;
$_SESSION['step'] = 2;
break;
case 2:
// Задаем второй вопрос
// Проверяем ответ пользователя и сохраняем его
$_SESSION['param2'] = $user_input;
$_SESSION['step'] = 3;
break;
case 3:
// Задаем третий вопрос
// Проверяем ответ пользователя и сохраняем его
$_SESSION['param3'] = $user_input;
// По завершении опроса выводим результат
$result = "Имя: " . $_SESSION['param1'] . ", Год рождения: " . $_SESSION['param2'] . ", Знак зодиака: " . $_SESSION['param3'];
// Сбрасываем состояние сессии
unset($_SESSION['step']);
unset($_SESSION['param1']);
unset($_SESSION['param2']);
unset($_SESSION['param3']);
break;
}
// Выводим результат или задаем следующий вопрос
echo $result;
?>

Обратите внимание, что это лишь пример и необходимо доработать его под ваш конкретный случай. В реальном проекте вам, возможно, потребуется добавить дополнительные проверки, обработку ошибок, валидацию данных и т.д. Но в целом этот код показывает принцип использования сессий для отслеживания состояния пользователя в интерактивном опросе.

20 Апр в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир