Любите загадки? Событие еще доступно на сайте.
https://lp.jetbrains.com/phpverse-2025/

Новый релиз Laravel-бота для техподдержки: интеграция с ВКонтакте и Docker-окружение с мониторингом

Презентация работы бота

Привет, коллеги.

В этом посте делюсь обновлениями по своему open source-проекту — Laravel-боту для технической поддержки. За месяц проект набрал более 100 клонирований и 40+ звёзд на GitHub. От сообщества начали поступать предложения и баг-репорты — спасибо всем, кто подключился.

На основе фидбека реализовал два ключевых улучшения:

  • интеграция с ВКонтакте как новым каналом сообщений
  • docker-compose сборка с полноценным стеком и логированием через Loki + Grafana

GitHub – https://github.com/prog-time/tg-support-bot

Если понравится — буду рад вашей ⭐!

Интеграция с ВКонтакте

Теперь бот может получать сообщения от сообщества ВКонтакте и пересылать их в Telegram-группу. Это позволяет объединить входящий поток из разных платформ в одном канале.

Поддерживается пересылка:

  • текстовых сообщений
  • файлов
  • изображений
  • голосовых
  • контактов (преобразуются в текстовый формат)

Подключение ВКонтакте

В сообществе ВКонтакте:

  • создайте ключ с доступом к сообщениям, фото и документам
  • настройте Callback API на https://<домен>/api/vk/bot
  • активируйте события: входящие/исходящие сообщения

В .env проекта пропишите:

VK_TOKEN=...
VK_CONFIRM_CODE=...
VK_SECRET_CODE=...

Роутинг и обработка реализованы через Laravel Controller с валидацией входящих запросов по VK_SECRET_CODE.

Презентация работы бота

Docker-сборка

Проект теперь поставляется с готовым docker-compose.yml, включающим:

  • nginx, php-fpm, PostgreSQL
  • pgAdmin — для доступа к БД через браузер
  • Grafana + Loki — для логирования и мониторинга

Логируются:

  • все входящие и исходящие события (включая Telegram и VK)
  • исключения, ошибки Laravel и stack trace

Примеры метрик:

  • количество сообщений по каналам
  • частота ошибок
  • пиковые нагрузки

Grafana может быть сразу подключена к Loki и PostgreSQL для визуализации как логов, так и пользовательских метрик.

Grafana для бота

Что дальше

Реализованные доработки — результат прямой обратной связи от пользователей. Следующий этап — интеграция нового канала трафика (анонс после 80 звёзд на GitHub).

Если используете Laravel в проектах с Telegram/VK-ботами, посмотрите репозиторий на GitHub — возможно, он закроет часть ваших задач по организации единой поддержки через мессенджеры.

Pull requests и обсуждения приветствуются.

Telegram-бот на Laravel для клиентской поддержки через темы в группах

Разработка поддержки через Telegram часто заканчивается тем, что каждый менеджер ведёт переписку с клиентом в личке, а история общения теряется где-то между GIF-ками и ссылками. Это не масштабируется и выглядит как временное решение.

Я столкнулся с этой проблемой сам и решил сделать своего Telegram-бота на Laravel, который решает сразу несколько задач:

  • структурирует коммуникацию,
  • прячет личные аккаунты менеджеров,
  • даёт возможность работать с обращениями в одной Telegram-группе,
  • использует темы (топики) для диалогов с каждым клиентом.

Где посмотреть и задать вопросы

Весь код открыт, поддержка звёздочками приветствуется 😉:

🔗 https://github.com/prog-time/tg-support-bot

Если при установке возникнут вопросы — пишите в Telegram:

📬 https://t.me/prog_time_bot

Как это работает

Пользователь пишет боту. Если это новое обращение — в Telegram-группе создаётся отдельная тема, куда бот отправляет первое сообщение клиента и базовую информацию о нём. Менеджеры отвечают внутри темы, и бот пересылает ответы пользователю от своего имени.

Благодаря этому:

  • у команды появляется общая история переписки;
  • менеджеры не светят свои личные аккаунты;
  • можно подключать нескольких операторов без потери контекста;
  • клиент чувствует, что с ним работают “как в саппорте”, а не в личке.

Особенности реализации

Бот написан на Laravel 12 и использует стандартный стек.

Файлы, фото и сообщения не сохраняются — всё пересылается в Telegram напрямую. Это упрощает соблюдение конфиденциальности и избавляет от лишних забот с хранением персональных данных.

Для кого это решение

Проект подойдёт для небольших команд, фрилансеров, техподдержки онлайн-сервисов, Telegram-first продуктов, онлайн-школ, консультационных проектов и всех, кто получает обращения через Telegram и хочет организовать поддержку быстро и просто.

Установка

  1. Клонируем репозиторий:
git clone https://github.com/prog-time/tg-support-bot.git
  1. Создаём бота через BotFather.

  2. Создаём приватную Telegram-группу с включёнными темами, добавляем туда бота как администратора.

  3. Получаем ID группы (например, с помощью getmyid_bot).

  4. Настраиваем .env:

APP_URL=https://your-domain.com
TELEGRAM_TOKEN=your_bot_token
TELEGRAM_GROUP_ID=your_group_id
TELEGRAM_SECRET_KEY=ваш_уникальный_ключ
  1. Устанавливаем webhook: Переходим в браузере по адресу: https://your-domain.com/api/telegram/set_webhook

Готово. Теперь можно писать боту, и он будет маршрутизировать обращения в соответствующие темы в группе.

Если вам пригодился проект — буду рад фидбеку и идеям по улучшению.

Laravel + тестирование: как сэкономить время на валидации запросов

При разработке API на Laravel часто возникает необходимость тестировать валидацию входящих данных. Один из способов — вручную писать тесты с различными вариантами входных параметров. Однако этот процесс может быть трудоемким и рутинным.

Чтобы упростить задачу, я разработал пакет laravel-request-testdata, который автоматически создает тестовые данные на основе правил валидации Laravel Request.

Ссылка на репозиторий – https://github.com/prog-time/laravel-request-testdata

Кому будет полезен этот пакет?

  • Разработчикам, которые хотят автоматизировать тестирование валидации запросов.
  • Тем, кто пишет много API-тестов и хочет минимизировать рутинные задачи.
  • Всем, кто хочет быстро получать корректные тестовые данные без необходимости вручную прописывать каждый вариант входных данных.

Как работает модуль?

Рассмотрим стандартный Laravel Request с простыми правилами:

class SimpleRequest extends FormRequest
{
  public function rules(): array
  {
    'name' => 'required|string',
    'email' => 'required|email',
  }
}

Теперь используем laravel-request-testdata для получения тестовых данных:

use App\Http\Requests\SimpleRequest;
use ProgTime\RequestTestData\RequestDataGenerator;

$request = new SimpleRequest();
$testData = RequestDataGenerator::generate($request);

Выходные данные могут выглядеть так:

[
  'name' => 'May Walker',
  'email' => 'ola.lagua@example.com',
]

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

При таком подходе вам нужно меньше следить за актуальностью тестов при редактирование правил валидации + это избавляет вас от необходимости вручную прописывать тестовые данные.

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

Разные форматы правил валидации

Данный модуль может обрабатывать правила валидации в разном формате.

Правила в формате массива

Вы можете описать правила в виде строки, как это было сделано в предыдущих примерах, а можете передать массив со списком параметром:

[
  'name'      => ['required', 'string', 'min:3', 'max:50'],
  'age'       => ['nullable', 'integer', 'min:18'],
  'password'  => ['required', 'string', 'min:8'],
]

Использование сложных условий

По мимо типичных правил валидации, модуль также понимает такие правила, как: in, exists, unique и так далее.

[
  'status' => 'required|string|in:pending,approved,rejected',
  'category_id' => 'required|exists:categories,id',
  'email' => 'required|email|unique:users,email',
]

Использование класса Rule для описания правил

В некоторых Request классах правила валидации описываются в формате Rule конструкций. Это может быть Rule::unique для проверки на уникальность или Rule::in для проверки на соответствие конкретным значениям.

[
    'email' => ['required', 'email', Rule::unique('users')],
    'role' => ['required', Rule::in(['admin', 'user', 'moderator'])],
]

Генерация тестовых файлов для проверки валидации

Что касается валидации загружаемых файлов, то тут всё немного сложнее. На данный момент мой модуль может сгенерировать файлы таких типов, как: yml, xml, svg, sql, png, log, json, jpg, html, gif и csv.

Количество доступных форматов будет постепенно увеличиваться, по мере развития данного модуля.

Для данной проблемы есть обходной вариант, который мы рассмотрим ниже.

Указание своих тестовых данных

Бываю моменты когда вам нужно для тестирования передавать свои данные, которые более корректно смогут настроить проверку работы приложения.

Для этого необходимо в Request классе создать метод requestTestData(). Данный метод должен возвращать параметры запроса с заполненными тестовыми данными.

public function requestTestData(): array
{
    $faker = \Faker\Factory::create();
    return [
        'email' => $faker->email(),
        'age' => 25,
    ];
}

Через метод requestTestData() вы также можете передавать тестовые файлы в форматах, которые на данный момент не поддерживаются моим модулем.

Таким образом я постарался разработать полезный модуль, который позволит сократить время на написание тестов и облегчит поддержку уже написанных авто-тестов.

Данный модуль не требует дополнительной настройки, его легко можно установить через composer и использовать в своих тестах.

Я надеюсь вам понравилось моё решение. Я буду очень благодарен если вы поддержите данный модуль звёздочкой на GitHub и напишите свой комментарий под данным постом.

Спасибо за то что дочитали данный пост до конца!

9