Интеграция Telegram в Laravel: Отправка сообщений без сторонних библиотек
Я покажу самый базовый вариант интеграции отправки сообщений из 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(), тогда с этим проблем не будет. Это не проблема и займет у вас пару минут времени