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, который придет вместе со следующим сообщением пользователя) или еще что-нибудь в этом духе? Как бы вы реализовали подобное в описанных стартовых условиях? (напомню что задача носит "учебный" характер, наверняка есть какие-то библиотеки, классы и т.п. использующие БД и позволяющие реализовать все описанное в одну строчку кода, но мне куда интереснее понять принцип как сохранять "состояние пользователя" и определять на каком шаге "сценария" он находится без их использования, т.е. как это реализуют в большинстве ботов, использующих интерактивные диалоги с пользователем).
Если вы хотите реализовать подобный функционал без использования базы данных или файлов, вы можете использовать сессии 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; ?>
Обратите внимание, что это лишь пример и необходимо доработать его под ваш конкретный случай. В реальном проекте вам, возможно, потребуется добавить дополнительные проверки, обработку ошибок, валидацию данных и т.д. Но в целом этот код показывает принцип использования сессий для отслеживания состояния пользователя в интерактивном опросе.
Если вы хотите реализовать подобный функционал без использования базы данных или файлов, вы можете использовать сессии PHP для хранения состояния пользователя. Вы можете сохранить текущий шаг "опроса" пользователя в сессии и на основе этого определять, какой вопрос задавать далее.
Вот пример кода, демонстрирующий использование сессий для отслеживания состояния опроса пользователя:
<?phpsession_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;
?>
Обратите внимание, что это лишь пример и необходимо доработать его под ваш конкретный случай. В реальном проекте вам, возможно, потребуется добавить дополнительные проверки, обработку ошибок, валидацию данных и т.д. Но в целом этот код показывает принцип использования сессий для отслеживания состояния пользователя в интерактивном опросе.