Поддержите проект, сделав пожертвование
Image

Андрей Гурковский

Веду телеграм канал про PHP "Миддл не приговор" @middle_not_final Работаю Backend разработчиком в найме

Телеграм бот на Laravel без боли

carbon

https://imgur.com/carbon-27JXZmf

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.

Image

С сентября работаю над пакетом для 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/

Временные файлы в PHPStorm

Я работаю в PhpStorm, и часто возникает необходимость где-то временно сохранить текст или сниппет, чтобы потом к нему вернуться или найти нужную информацию. Хочется сделать это быстро и без лишних размышлений, чтобы случайно этот файл не попал в Git. И вот только пару месяцев назад я нашёл удобный способ это делать, не открывая никакие заметки или второй редактор.

Существует сочетание клавиш Cmd + Shift + N для Mac и Alt + Ctrl + Shift + Insert для Windows Linux, которое вызывает окно для создания временного файла:

New Scratch File

В этом окне можно выбрать любой формат или просто обычный Plain Text. Мне удобно создавать файлы в форматах PHP, JSON, а также простые тестовые файлы. Работа с такими файлами происходит так же, как с любыми другими: их можно искать через глобальный поиск Cmd + Shift + O или находить в списке последних редактируемых файлов Cmd + E.

Найти все свои старые временные файлы можно в разделе Scratches and Consoles:

Где смотреть Этот раздел находится в панели Project в самом низу, ниже всех файлов проекта.

Как мне кажется, это очень удобно. В моём окружении никто этим не пользуется, поэтому я решил поделиться этим небольшим лайфхаком.

Кстати, там же сохраняются консоли, если вы делаете запросы в базу данных прямо из PhpStorm.

Если понравилась заметка, подписывайтесь на мой телеграм канал, там я пишу про разработку, PHP и просто про жизнь. @middle_not_final

2
Image