Интеграция Telegram в Laravel: Отправка сообщений без сторонних библиотек

Опубликовано: Комментариев: 0

Я покажу самый базовый вариант интеграции отправки сообщений из Laravel в Тelegram API. Писать будем на PHP 8.4 и Laravel 12. Здесь мы сосредоточимся на технической стороне процесса и я надеюсь что вы сможете самостоятельно нагуглить как создать бота в телеграм, приватный канал и добавить бота в этот телеграм.

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

Шаг 1. Добавляем переменные окружения

Открываем файл .env и вносим наши переменные окружения, после знака равно добавляем свои значения от Телеграм 


TELEGRAM_CHANNEL_ID=
TELEGRAM_BOT_TOKEN=

Шаг 2. Cоздаем простейший класс для работы с Telegram API

Создадим класс TelegramService вот тут app/Modules/Telegram/TelegramService.php со следующим содержимым:

<?php

declare(strict_types=1);

namespace App\Modules\Telegram;

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;

class TelegramService
{
    public function sendMessage(string $message): void
    {
        $message = str_replace('\\', '\\\\', Str::limit($message, 4093));

        $escapedMessage = preg_replace_callback(
            '/[_*[\]()~`>#\+\-=|{}.!]/',
            fn ($matches): string => "\\$matches[0]",
            $message
        );

        $response = Http::post(
            url: sprintf(
                'https://api.telegram.org/bot%s/sendMessage',
                env('TELEGRAM_BOT_TOKEN', '')
            ),
            data: [
                'chat_id' => env('TELEGRAM_CHANNEL_ID', ''),
                'parse_mode' => 'MarkdownV2',
                'text' => $escapedMessage,
                'disable_web_page_preview' => true,
            ],
        );

        if ($response->failed()) {
            Log::error(
                sprintf(
                    'Failed to send Telegram Message, error code: %s. %s',
                    $response->status(),
                    $response->json()['description'],
                ),
            );
        }
    }
}

Метод sendMessage будет принимать 1 аргумент - строку. Вначале мы обрезаем строку до длины в 4093, и добавляем троеточие если строка больше. Это сделано для того чтоб не выходить за лимит в 4096 символов в одном сообщении

Далее, через preg_replace_callback экранируем все спец символы.  И последним действием отправляем POST запрос с нашими параметрами. После отправки сообщения берем результат и если он не успешный - то можно залоггировать ошибку о том что попытка отправить сообщение не удалась, с кодом ошибки и поясненим от Telegram API. 

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

 

Пример использования

Создадим новую комманду и добавим наш сервис в качестве зависимости внуть команды

<?php

declare(strict_types=1);

namespace App\Console\Commands;

use App\Modules\Telegram\TelegramService;
use Illuminate\Console\Command;

class MyCommand extends Command
{
    protected $signature = 'app:my-command';

    public function handle(TelegramService $telegramService): void
    {
        $telegramService->sendMessage('Hello World!');
    }
}

и через консоль вызываем нашу команду

php artisan app:my-command

если все сделано корреткно, то сообщение прилетит в нужный чатик, а если нет - то в логах будут детали ошибки. Вот и все

Заключение

В принципе базовая реализация готова. Но при такой архитектуре невозможно будет сделать php artisan optimize. Чтоб кэширование работало, нужно получать конфиги через config(), тогда с этим проблем не будет. Это не проблема и займет у вас пару минут времени

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