Телеграм бот на Laravel без боли
carbon
Discover the magic of the internet at Imgur, a community powered entertainment destination. Lift your spirits with funny jokes, trending memes, entertaining gifs, inspiring stories, viral videos, and so much more from users.

С сентября работаю над пакетом для Laravel для быстрой разработки телеграм ботов.
TL;DR
- Роутинг на
всемногие экшены телеграм, через атрибуты и роуты как в ларавель. TelegramRoute::onAnimation(string[]|string|\Closure $action, string $botId = '*', \Closure|string|null $pattern = null) - Есть асинхронный режим на базе go и очередей Laravel
- Поллинг для локальной разработки из коробки
- Middlewares и Guard для авторизации по telegram_id
- Стейты для хранения текущего состояния беседы для удобного ветвления и навигации.
- Защита от превышения лимита запросов в телеграм.
- Документация с поиском и context7 для AI
- Поддержка множества ботов
Если детали нужны
Идея была изначально натянуть сову на глобус реализовать асинхронный пакет на базе ReactPHP для Laravel, уж очень мне он понравился. Даже начал раскапывать уже не поддерживаемый пакет. Но благо, вовремя меня посетила другая мысль, что можно воткнуть небольшой go прокси на телегроам вебхук, этот прокси будет диспатчить задачи напрямую в редис, а воркеры уже обработают задачу не тратя время на бутсрап, как если это был бы стандартный подход при обработке HTTP запросе.
Я переделал то, что уже успел написать, проверил что идея рабочая, оказалось что да, так и появился этот модуль Пришлось раскопать еще, как внутри сериализуется Job. Для поддержки Horizon, как под капотом проиcходит работа с Redis, какие события нужно вызывать чтобы Job была учтена в статистике.
Последний штрих, это автоматическая установка бинарника.
Достаточно вызвать ./vendor/bin/tgook, и бинарник автоматически запуститься и будет слушать входящие запросы на 6945 порту.
Zanzara стала первым донором идей для моего пакета, оттуда я взял:
- Long polling из коробки, чтобы не нужно было возиться с настройкой тунеля при локлаьной разработке
- Роутинг флуент апи по типу onMessage()
- Middleware
- Система стостоянияZanzara
- Защита от флуда в телеграм
На эти фичи ушло много времени, но сейчас они уже стабильно работают. Роутинг конечно пока покрыл только часть действий доступных для телеграм, но как временное решение есть роут onAny в который будет прокинут Update. Я уже совсем скоро продолжу добавлять новые роуты и в идеале на все все возможные обновления от телеграм свои роуты с удобной фильтрацией
Ядром пакета (типы данных, обработка Update, работа с API) является стороння библиотка Пока считаю, что это нормальная история. Реализовывать еще и апишку было бы слишком накладно по моим ресурсам и пакет так и не добрался бы до релиза.
Сейчас я финалю тестирование и осваиваю управление опесор проектом. Совсем скоро планирую продолжить добавлять новые роуты. Всех приглашаю на тестирование пакета.
Установка и настройка выглядит очень просто:
composer require hybridgram/tgbot-laravel
Далее нужно опуликовать конфиг, тестовые роуты
php artisan vendor:publish --provider="HybridGram\Providers\TelegramServiceProvider"
И установить переменную BOT_TOKEN в вашем .env еще рекомендую натсроить BOT_ID для безопасности (любое уникальное значение).
Настраиваем первые роуты
<?php
use HybridGram\Facades\TelegramRouter;
use HybridGram\Core\Routing\RouteData\TextMessageData;
use HybridGram\Core\Routing\RouteData\PollData;
use HybridGram\Telegram\Poll\PollType;
use HybridGram\Telegram\TelegramBotApi;
TelegramRouter::group(['for_bot' => 'main'], function (\HybridGram\Core\Routing\TelegramRouteBuilder $builder) {
$builder->onTextMessage(function (TextMessageData $message) {
$api = app(TelegramBotApi::class);
$api->sendMessage($message->getChatId(), "Echo: {$message->text}");
});
// you can use any of route
// $builder->onPoll(function (PollData $poll) {
// $api = app(TelegramBotApi::class);
// $api->sendMessage(
// $poll->getChatId(),
// "Poll received ({$poll->poll->type}) with " . count($poll->poll->options) . " options"
// );
// }, pollType: PollType::REGULAR);
});
И запускаем polling
php artisan hybridgram:polling --hot-reload
Это все) Больше подробностей в документации https://hybridgram.space/ru/getting-started/introduction/