Как в Telegram bot сделать типа опросника?

Всем доброго дня, как при нажатии на кнопку:
Продолжить диалог с ботом, чтобы бот запоминал предыдущие ответы

<?php
include('db.php'); // Подключаем БД
include('../vendor/autoload.php'); //Подключаем библиотеку
use Telegram\Bot\Api;

/*
* Собираем данные с балансами
*/

$telegram = new Api('APITOKEN'); //Устанавливаем токен, полученный у BotFather
$result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя

$text = $result["message"]["text"]; //Текст сообщения
$chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя
$name = $result["message"]["from"]["username"]; //Юзернейм пользователя
$keyboard = [["\xF0\x9F\x8E\xAC Заказать"], 
             ["\xE2\x9D\x93 Информация", "\xF0\x9F\x93\xA9 О нас"]]; //Клавиатура


if($text){
    if ($text == "/start") {
        $reply = "\xF0\x9F\x8E\xAC Добро пожаловать в сервис
            Если вы готовы к заказу нажмите <code>Заказать</code>";

        $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);
        $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply, 'reply_markup' => $reply_markup ]);
        
        //Проверяем есть ли такой Chat_ID в БД
            $result = mysqli_query($db, "SELECT * FROM bot_kino_user WHERE chat_id LIKE '%".$chat_id."%'");
                if (mysqli_num_rows($result) == 0) {
                    $userlogin = $name;
                    mysqli_query ($db,"INSERT INTO `bot_kino_user` (`chat_id`, `username`) VALUES ('$chat_id', '$userlogin')");//добавление в базу
            }
            
    }elseif ($text == "\xF0\x9F\x8E\xAC Заказать") {
        $reply = "Для заказа пришлите: 
        1. Город
        2. Возраст
        3. Имя";
        
        $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply ]);
    }


После нажатия кнопки "Заказать"
Нужно спросить - Город
Сохранить
Спросить - Возраст
Сохранить
Спросить - Имя
Сохранить

Далее показываем введенные данные, и спрашиваем всё ли верно, если да
То возвращаемся в главное меню

Искал примеры, нигде такого не нашел..
Помогите кто чем может пожлуйста)
  • Вопрос задан
  • 1904 просмотра
Решения вопроса 1
Winsik
@Winsik
сис.админ, недопрограммист :)
У вас логика хромает, вы же сами в примере пишете, для примера "город: ваш город"
следовательно должно это работать как то так :
bot:
Для заказа билета пришлите: 
        Пример - Город: Ваш город"

Вы: Город: Москва
bot:
Ваш город Москва, введите Кинотеатр (пример: Кинотеатр: Ваш Кинотеатр)

Вы: Кинотеатр: Восход
и т.д....
и соответственно проверять сначала текст на соответствие началу (что бы найти Город: или Кинотеатр: , а после двоеточия уже потом искать до конца строки что вам там понаписали .

p.s. такая логика это ужасно, нормальный человек пользоваться не станет )
Если делать по человечески, то бот должен спросить ... Какой город ? и запоминает переменную step="city", далее при любом ответе пользователя , смотрит что в переменной step, понимает на каком этапе он находиться, запоминает ответ пользователя , задаёт новый вопрос и в переменную step кладём новый этап, например step="cinema"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
prolisk
@prolisk
Верстая. Криво.
Храните в переменных.
Я на питоне писал, но суть та же - обьявляешь переменную, в нее записываешь ответ, потом в конце выводишь ему и если нужно - сохраняешь в БД.
Ответ написан
m0pfin
@m0pfin Автор вопроса
Кому-то может будет полезно, немного развил дальше получился такой код:
(Пока не могу сохранить значение переменной в пределах скрипта, в базу пишутся пустые переменные)

elseif ($text == "\xF0\x9F\x8E\xAC Заказать билет") {
        $reply = "Для заказа билета пришлите: 
        Пример - <code>Город: Ваш город</code>";
        
        $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply ]);
        
    }elseif(strstr($text, "Город")){
            
            $_SESSION['city'] = $text;
            $city = $_SESSION['city'];
            
            $reply = "$city - Сохранен! \nПример - <code>Кинотеатр: Ваш кинотеатр</code>"; 
            
            $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply ]);
            
            }elseif(strstr($text,"Кинотеатр")){
            
            $_SESSION['kinoteatr'] = $text;
            $kinoteatr = $_SESSION['kinoteatr'];
            
            $reply = "$kinoteatr - Сохранен! \nПример - <code>Фильм: Название фильма 20:45 (время сеанса)</code>"; 
            
            $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply ]);
            
            }elseif(strstr($text,"Фильм")){
            
            $_SESSION['film'] = $text;
            $film = $_SESSION['film'];
            
            $reply = "$film - Сохранен! \nПример - <code>Ряд: 7 ряд, 5 6 7 8 место</code>"; 
            
            $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply ]);
            }elseif(strstr($text,"Ряд")){

            $_SESSION['count'] = $text;
            $count = $_SESSION['count'];
            
            $reply = "$count,$film,$kinoteatr,$city - Сохранен! \nПример - <code>Сумма заказа: 690 р</code>"; 
            
            $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply ]);
            
            }elseif(strstr($text,"Сумма")){
            
            $_SESSION['cost'] = $text;
            $cost = $_SESSION['cost'];
            
            
            if (empty($city || $kinoteatr || $film || $count || $cost)){
                
                $reply = "$cost - Сохранен! \nВаш заказ сформирован! № Заказа: 2034"; 
                $userlogin = '@'.$name;
                mysqli_query($db, "INSERT INTO `bot_order`(`date`, `chat_id`, `username`, `city`, `kinoteatr`, `film`, `count`, `cost`) VALUES (NOW(),'$chat_id','$userlogin','$city','$kinoteatr','$film','$count','$cost')");
                 $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply ]);
                 $_SESSION  = array();
                 unset($_SESSION); // или $_SESSION = array() для очистки всех данных сессии
                 session_destroy();
                }
                else{
                     $reply = "Какое-то поле вы пропустили :( \nПожалуйста, начните сначала.\n\nДля заказа билета пришлите: \nПример - <code>Город: Ваш город</code>"; 
                     $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply ]);
                     $_SESSION  = array();
                     unset($_SESSION); // или $_SESSION = array() для очистки всех данных сессии
                     session_destroy();
                }
           
          }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы