telegram bot api - Как сделать телегам-бота на PHP (Symfony 4)

(статья будет дополняться)

Бот 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 тоже. Тогда вы получите более или менее красивую картинку)

Удачной разработки!♥

Источники

vedro-compota's picture

file_put_contents(

почему логгер сифони не используете?

_____________
матфак вгу и остальная классика =)

melisa's picture

Потому что мой ответ не выводится непосредственно в браузере или где-либо ещё, а передаётся API Telegram для дальнейшей обработки. В частности даные, которые мы передаём, вызывают ту или иную функцию API Telegram, которая уже формирует вывод. Соответственно, результат стандартного для Symfony dump() мы просто не увидим.