
Рано или поздно, в жизни разработчика телеграмм-ботов приходит чёткое осознание, того что всё бренно нужно создавать более-менее полноценные меню для ботов.
Так как:
А) Это удобно
Б) Удобно для кастомизации*
Никто, конечно же, не отменял «/команды», но всё же
Суть задачи
С первого взгляда — задача проста, но как бы не так. Вся проблема в самом API, а именно в объекте Update.
Немного подробнее: Используя метод getUpdate — вы получаете объект Update, логично же! Так вот, этот объект содержит много чего полезного, включая информацию о сообщении, но только о последнем. В этом и загвоздка
Исходя из выше описанного следует не самый приятный вывод — обработка запросов по вебхуку, без хранения дополнительных данных, нам не светит…
Ну что же, умываемся и приступаем к работе.
Написание Изучение кода
В своей практике, специально под эту задачу, был разработан небольшой класс.
NEW! Теперь и на гитхаб)
Если не терпится, то можете сразу переходить на репозиторий, там есть экскурс.
Продолжим
Класс создаёт запрос на запрос
Немного о структуре: Переход по меню осуществляется при помощи создания запроса на запроса. Вы создаете его в нужном месте, и при следующем обращении юзера, бац, и он в «меню».
Согласен, концепция, после этого, понятной не стала… Попытаюсь разъяснить. Для понимания нужно перейти на некий уровень абстракции, то есть представьте что вся структура бота состоит из разных меню, между которыми переключается юзер(можно провести аналогию с активити андроида). При активации бота пользователь оказывается в «начальном меню», из которого он может перейти, допустим, в меню «Настройка», «Информация», и тд.

И так, структура бота немного меняется, если вкратце:
В начале проверяем, существует ли запрос:
ДА ) Запускаем «обработчик» запросов
НЕТ) Остаёмся в «начальном меню», сверяем ответ юзера с доступными командами.
*это сильно упрощённый вариант, из-за этого сбивает столку. С примерами станет проще.
Продолжим..?
Начнём с установки. Для установки воспользуемся compser-ом(создаём «composer.json», после копируем в него строки ниже, подробнее читайте в офф. доках)
{ "require" : { "s0d3s/tg-long-req": ">=1" } }
и подключим
include_once('path/to/autoload.php'); use TgLongReq\TgLongReq;
ИЛИ подключаем вручную(скачиваем в папку с проектом)
include_once('TgLongReq.php'); use TgLongReq\TgLongReq;
СОЗДАЁМ ОБЪЕКТ
function SOMTH($tg_res, $long_req_obj, $tab_key){ echo "EveryForEveryone"; return; } $BOT_FUNC_ASSO_TAB = arrray("ECHO_SOMETHING" => "SOMTH"); //Ключ - используется при создании запроса на запрос, значение - имя ф-ции\обработчика запросов $tgreq = new TgLongReq ( $usr_id, //(STR)Уникальный телеграмм-id юзера $BOT_FUNC_ASSO_TAB, //(ARRAY) $BOT_req_dir , //[OPT](STR) $tapi, //[OPT](ANY*) $result //[OPT](ANY**) ); // * доп параметр, можно получить через $this->tg_api // ** доп параметр, первый параметр в обработчике запросов
СОЗДАЁМ ЗАПРОС, ПРОВЕРЯЕМ ЕГО НАЛИЧИЕ И ЗАПУСКАЕМ ОБРАБОТКУ
$tgreq -> ReqCreate('SOMTH');//создаём запрос if($tgreq -> ReqCheck()){ //если существует, то запускаем обработчик, в нашем случае запрос всегда существует $tgreq -> ReqHand();//запускает функцию, соответствующею запросу }
ПРЯЧЕМ И ДОСТАЁМ ВРЕМЕННЫЕ ДАННЫЕ
сохраняем:
$tgreq -> SaveToTemp('HiHabr');//Принимает любые данные, сохраняет в виде json-строки
восстанавливаем:
$tgreq -> GetFromTemp(false);//если истина - временный файл не удаляется, по умолчанию ложь //возвращает переменную, сохранённую с помощью SaveToTemp()
РЕЗУЛЬТАТ ФУНКЦИИ
Следует заметить, что каждая[за исключением GetFromTemp(),GetError(),ReqCheck() и конструктора] функция, возвращает массив:
/*$function_result = array( 'func_res' =>возвращаемое функцией значение 'error' =>true, если была ошибка 'err_discript' =>описание ошибки, существует если была ошибка ); */
ОШИБКИ
Каждая функция [за исключением GetFromTemp(),GetError(),ReqCheck() и конструктора], устанавливают ошибку, в случае неудачи, которую можно проверить с помощью:
$error_arr = $tgreq -> GetError(); /*$error_arr = array( 'error' =>true, если была ошибка 'err_discript' =>описание ошибки, существует если была ошибка ); */
Всё собрали, в путь!
Будем считать что вы минимально знакомы с написанием телеграмм-ботов, если нет — %статья%, дочитайте до пункта «Написание кода бота» — первая ссылка в гугле по сабжу, можете поискать сами, главное узнайте как создать бота в самом тг, и настроить его на свой сервер. Если будет интересно, напишу статью как настроить вебхук для работы с локальным сервером(~NEW! решение обхода «проблемы» с https).
Воплотим в жизнь, данный пример. Разделим пространство на два файла «botmain.php»(основное меню и обработка) и «varfunc.php»(функции обработки запросов). Для лёгкости примера будем использовать telegram-bot-sdk(хорошо сделанный и оформленный проект, удобно для небольших проектов, спасибо создателю;).
В общем, листинг:
{ "require" : { "irazasyed/telegram-bot-sdk": ">=3", "s0d3s/tg-long-req": ">=1", "php":">=7.1" } }
Далее в папке проекта открываем консоль и…
>composer install ...
UPD: В рамках Хабра исходный код становится нечитабельным, без глобальной правки. Из-за этого, если вас интересуют примеры, предлагаю вам перейти на гитхаб.
Заключение
Под конец могу лишь сказать, что это не единственный возможный вариант решения данной проблемы, но с точки зрения оптимальности для МЕНЯ является фаворитом.
ссылка на оригинал статьи https://habr.com/ru/post/459604/
Добавить комментарий