Создание Telegram бота на PHP #5: работа с хуками

В новом уроке мы с вами поговорим о настройке хуков и напишем свой первый обработчик команд.

В первом уроке я вам рассказывал что такое хуки, давайте повторим:

Hooks (Хуки) — это способ общения с программой, по средствам отправки данных от сервераклиенту. То есть при определённых изменениях в программе, сервер (приложение) будет отправлять данные на указанный URL скрипта клиента.

Например. Каждый раз когда пользователи будут писать сообщения боту, данные о сообщениях будут отправляться на указанный скрипт, где вы сможете записать сообщения в БД или отправить ответ.

Полный список всех записей курса находится на сайте https://prog-time.ru/course_cat/telegram-bot-basic/ или в публикациях на Хабр https://habr.com/ru/users/Prog-Time/posts/

Для регистрации хука нужно выполнить 2 правила:

  • разместить скрипт на виртуальный сервер (хостинг)

  • домен на который будут отправляться запросы, должен иметь SSL сертификат и работать через HTTPS соединение

Если ваш хостинг соответствует данным требованиям, то давайте займёмся регистрацией хука для Telegram бота.

Регистрация хука для Telegram бота

Для регистрации хука нам нужно отправить запрос с методом setWebhook(), которому в качестве параметра url мы должны передать ссылку на скрипт обработчик. В моём случае это просто php скрипт.

Вот пример запроса:

$token = "5340791844:AAEXXDduvInvQrlykV91USOQSevrPVU";

$getQuery = array(
     "url" => "https://prog-time.ru/tg_script/index.php",
);
$ch = curl_init("https://api.telegram.org/bot". $token ."/setWebhook?" . http_build_query($getQuery));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);

$resultQuery = curl_exec($ch);
curl_close($ch);

echo $resultQuery;

Если запрос прошёл успешно, то вы получите следующий ответ:

Теперь давайте проверим работу нашего обработчика. Сообщения приходят POST-запросом, с типом application/json. Получить его в PHP можно следующим образом:

Разбор параметров передаваемых через Hooks

Давайте теперь посмотрим что приходит на наш скрипт при отправке простого текстового сообщения боту.

Здесь есть небольшая проблема! Скрипты будут выполняться в рандомный момент и если мы не запишем данные, то они пропадут в пустоту. Для записи ответа вы можете использовать БД или как я, просто записать массив в файл txt.

Для записи строки я буду использовать дополнительную, самописную функцию writeLogFile()

Моя функция принимает 2 параметра:

  • первый параметр, строка для записи. В нашем случае это JSON строка.

  • второй параметр используется для очистки файла и перезаписи. Если данный параметр имеет значение false, то в файл дописывается информация.

Полный код для записи информации в файл будет выглядеть следующим образом.

После отправки сообщения боту, данные были отправлены на наш скрипт и мы записали их в лог файл.

Теперь выведем полученную информацию на страницу

Вот что мы получаем. Это объект в котором записана информация о созданном сообщение, мы видим данные о пользователе, данные о чате, дата отправления и текст сообщения.

Данные при нажатие на кнопку в чате

Если пользователь нажал на кнопку, то на скрипт также будет отправлен запрос с данными о пользователе и о кнопке.

Отличительной особенностью таких запросов является то что главный ключ message заменяется на callback_query, а сам массив message будет находиться внутри.

Получить код кнопки на которую было произведено нажатие, можно из callback_query -> data.

Данные при отправке изображения

Теперь давайте посмотри данные которые приходят при отправке изображения в чат, от пользователя.

После получения данного массива мы можем сохранить отправленное изображение на своём сервере. Для этого нам нужно с помощью метода getFile получить полный путь к изображению, передав ему в качестве параметра file_id.

Полный код для сохранения будет выглядеть так:

Скрипт для ответа на запросы через Хук

Получив представление о работе хуков, давайте теперь напишем полноценного бота, который будет отвечать на сообщения. Бот будет отвечать на текстовые сообщения, отправлять изображения по запросу и сохранять изображения пользователей.

Поехали…

Токен бота запишем в константу TG_TOKEN

Для удобства я создал специальные функции для отправки типовых запросов на сервер Telegram. Созданные функции принимают в качестве первого аргумента массив с параметрами запроса.

Так же я добавил дополнительную функцию, которая выводит список всех файлов из директории. Данная функция будет отдавать массив с файлами, для последующего отправления рандомного файла в чат.

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

В переменные $textMessage записывает текст сообщения, а в переменную $chatId записываем id чата.

Ниже мы проверяем наличие файла в сообщение. Если пользователь отправил файл, то мы его сохраняем в папку с картинками.

Здесь желательно прописать более сложный обработчик для проверки типа файла, но сейчас, чтобы не затягивать видео, я просто буду проверять наличие файла в сообщение.

Далее мы прописываем проверку на текст сообщения и в случае нужного текста отправляем ответное сообщение.

Если пользователь отправил «Привет», то мы в ответ отправляем сообщение «Привет! Есть фото для меня?». Данное сообщение отправляется с помощью ранее созданной функции TG_sendMessage().

Ниже пропишем подобный код для запроса изображения. Если пользователь отправил «хочу фото», то мы выбираем рандомное изображение и отправляем его пользователю с помощью функции TG_sendPhoto().

Далее пропишем код для сохранения любых, отправленных в чат, изображений.

Ну и на последок, давайте пропишем ещё 2 условия. Первое условие будет отправлять кнопку в чат, а второе условие будет проверять нажатие на кнопку и отправлять дополнительное сообщение.

Запрос для отправки кнопок создаём аналогично запросу со словом «Привет». По запросу мы будем отправлять 2 кнопки с callback_data — but_1 и but_2.

Теперь давайте пропишем проверку нажатия на кнопки. Здесь нам нужно записать в переменную $dataBut код нашей кнопки, чтобы по нему в дальнейшем делать проверку. В переменную $textMessage и $chatId мы так же записываем текст сообщения и id пользователя, только в этот раз достаём эти данные из массива с ключом callback_query.

Ниже проверяем код нажатой кнопки и отправляем простое текстовое сообщение в ответ.

Подведём итоги! В новом уроке, мы с вами научились обрабатывать запросы от Телеграма к серверу и прописали свой простой обработчик. Аналогичным образом вы можете прописать ответы на любые команды.

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

Last updated

Was this helpful?