telegram bot api - Как сделать телегам-бота на PHP (Symfony 4)
Primary tabs
(статья будет дополняться)
Бот Telegram
Что же это такое? Если вопрос стоит так, то вам сюда.
С помощью Telegram-ботов сегодня можно обрабатывать сообщения и медиа-контент, работать со сторонними сервисами, организовывать опросы и даже проводить платежи. Давайте разберёмся, как написать своего телеграм-бота на PHP.
Регистрация
Для начала нужно зарегистрировать своего бота. Об этом на просторах интернета написано много статей, которые достаточно полно объясняют, как это сделать, например:
А вот официальная документация от Telegram:
Webhook (обновление данных)
Как настроить и проверить, напишу здесь.
И далее наконец-то буду выкладывать свой вариант PHP-кода.
PHP
Для общения с Telegram-ботом можно использовать библиотеки, напрмер:
Но мы не ищем лёгких путей, поэтому пишу всё руками. Возможно, так будет нагляднее.
Логгирование
Начнём с печального. Логи ошибок, к сожалению, достать невозможно. Единственное, что можно предложить - возможность ручного дампа. Записываем данные, которые нужно проверить в файл:
// ... file_put_contents($this->getProjectDir().'/var/log/telegram.log', 'гет проджект дир'); // ...
В данном случае, происходит проверка, пишутся ли логи в файл telegram.log (предварительно создайте его), но в качестве второго аргумента вы можете передать что угодно.
Принимаем request
При настройке бота мы определили путь (route), на который будет поступать вся информация от Telegram API. У меня это /telegram. (Использую Symfony 4, путь прописываю в аннотации метода контроллера).
Контроллер будет выглядеть так:
// src/Controller/TelegramController.php <?php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; class TelegramController { /** * @Route("/telegram", name="telegram") * * @param Request $request * * @return JsonResponse */ public function telegram(Request $request): JsonResponse { $result = json_decode($request->getContent(), true); // ... return $response; }
Достаём данные
Ну и сразу достаём данные, которые передаёт Telegram API так. Будьте внимательны :) В зависимости от того, какие данные вы ожидаете, массив получаемый данных будет разный.
Роутинг
С помощью switch или elseif перебираем варианты текта сообщений, приходящих нам в Request-е и создаём индивидуальный $response:
switch ($text) : case '/start': $responseBody = $startCommandHandler->getResponseBody($telegramId, $chatId); break; case 'Анкета': $responseBody = $worksheetCommandHandler->getResponseBody($telegramId, $chatId); break; case 'Отменить': $responseBody = $cancelCommandHandler->getResponseBody($telegramId, $chatId); break; case '/help': $responseBody = $helpCommandHandler->getResponseBody($chatId); break; default: $responseBody = $defaultHandler->getResponseBody($telegramId, $chatId); endswitch; return new JsonResponse($responseBody);
Отправляем ответ
Следующий этап - ответ, который мы посылаем API:
// .. if ($text) { if ($text == '...') { // здесь может быть код, если нужно что-то сделать перед ответом $response = new JsonResponse([ 'method' => '...', // также передаём здась другие аргументы, которые ожидает конкретный метод ]); } elseif ($text == '...') { $response = new JsonResponse([ 'method' => '...', ]); } else { $response = new JsonResponse([ 'method' => '...', ]); } } return $response;
Методы - варианты response-ов (примеры кода)
Подробнее о действиях (методах), которые может прочитать Telegram API:
- Отправить сообщение. sendMessage()
- Вывести кнопки. sendMessage()
Вот и всё
Слепите всё вместе и получите рабочую модель telegram-bot-а. Логику обработки различных данных, приходящих от telegram API можно выделить в отдельные сервисы, логику формирования response тоже. Тогда вы получите более или менее красивую картинку)
Удачной разработки!♥
Источники
- Log in to post comments
- 13594 reads
vedro-compota
Wed, 02/21/2018 - 19:28
Permalink
file_put_contents(
почему логгер сифони не используете?
_____________
матфак вгу и остальная классика =)
melisa
Thu, 02/22/2018 - 12:03
Permalink
Потому что мой ответ не
Потому что мой ответ не выводится непосредственно в браузере или где-либо ещё, а передаётся API Telegram для дальнейшей обработки. В частности даные, которые мы передаём, вызывают ту или иную функцию API Telegram, которая уже формирует вывод. Соответственно, результат стандартного для Symfony dump() мы просто не увидим.