Телеграм бот для объединения сообщений из Telegram, ВКонтакте и сторонних API источников в единую систему технической поддержки.
Сообщения отправляются в Telegram-группу, где под каждого пользователя создаётся отдельная чат-тема (топик).
Бот поддерживает все типы сообщений: текст, изображения, файлы, голосовые сообщения, видео, стикеры, контакты и другие медиафайлы.
Презентация работы бота: https://youtu.be/hIpYreHOxIk
Инструкция по установке через Docker Compose: https://youtu.be/ZAtP9qJ5q9M
Telegram-группа поддержки: https://t.me/pt_tg_support
- Как это работает
- Основные возможности
- Технологический стек
- Быстрый старт
- Установка и настройка
- AI помощник
- Живой чат для сайта
- API интеграция
- Мониторинг и логирование
- Поддерживаемые типы сообщений
- Интерактивные клавиатуры
- Архитектура
- Развертывание
- Документация
- Вклад в проект
- Лицензия
┌─────────────┐ ┌─────────────┐ ┌─────────────────┐
│ Telegram │────────▶│ │◀────────│ ВКонтакте │
│ Users │ │ │ │ Users │
└─────────────┘ │ │ └─────────────────┘
│ │
┌─────────────┐ │ TG Bot │ ┌─────────────────┐
│ Website │────────▶│ Server │◀────────│ External API │
│ Widget │ │ │ │ Sources │
└─────────────┘ │ │ └─────────────────┘
└──────┬──────┘
│
▼
┌──────────────────────┐
│ Telegram Group │
│ ┌────────────────┐ │
│ │ Topic: User 1 │ │
│ ├────────────────┤ │
│ │ Topic: User 2 │ │
│ ├────────────────┤ │
│ │ Topic: User 3 │ │
│ └────────────────┘ │
└──────────────────────┘
- Получение сообщения: Пользователь отправляет сообщение боту через Telegram, ВКонтакте, виджет сайта или внешний API
- Создание топика: Бот автоматически находит или создаёт тему (топик) в Telegram-группе для этого клиента
- Пересылка в группу: Сообщение пересылается в соответствующую тему с информацией об отправителе
- Ответ менеджера: Менеджеры отвечают прямо в теме — бот отслеживает их сообщения
- Отправка клиенту: Ответ автоматически пересылается клиенту от имени бота (без раскрытия личности менеджера)
- Telegram: Полная поддержка Telegram Bot API
- ВКонтакте: Интеграция с VK API для сообщений сообщества
- Website Widget: Готовый виджет живого чата для встраивания на сайт
- External API: REST API для подключения сторонних источников
- Все типы медиафайлов (текст, изображения, документы, голосовые, видео, стикеры, контакты)
- Автоматическая организация диалогов в топики Telegram-группы
- Приватность: клиенты не видят, кто из менеджеров им отвечает
- Настраиваемые шаблоны имен топиков
- AI помощник: Интеграция с OpenAI, DeepSeek, GigaChat для автоматических ответов
- Очереди сообщений с Laravel Queue
- Webhook обработка в реальном времени
- WebSocket поддержка через Socket.io
- Grafana: Визуализация метрик и статистики
- Loki: Централизованное логирование
- PgAdmin: Управление базой данных
- RedisInsight: Мониторинг Redis
- Интеграция с Sentry для отслеживания ошибок
- Блокировка пользователей
- Закрытие обращений
- История всех сообщений
- Управление внешними источниками
Backend:
- Laravel 12.0+ (PHP 8.2+)
- PostgreSQL (база данных)
- Redis (кэш и очереди)
- Laravel Queue (обработка фоновых задач)
Frontend & Real-time:
- Node.js + Socket.io (WebSocket сервер)
- JavaScript (виджет чата)
External APIs:
- Telegram Bot API
- VK API
- OpenAI API / DeepSeek / GigaChat (AI)
DevOps:
- Docker + Docker Compose
- Nginx (веб-сервер)
- Certbot (SSL сертификаты)
Monitoring & Logging:
- Grafana (дашборды)
- Loki (логи)
- Promtail (сбор логов)
- Sentry (error tracking)
Development:
- PHPUnit (тестирование)
- PHPStan (статический анализ)
- Laravel Pint (code style)
- Docker 20.10+
- Docker Compose 2.0+
- Git
Создайте Telegram бота:
- Напишите @BotFather
- Отправьте
/newbot - Следуйте инструкциям и получите
TELEGRAM_TOKEN - Отключите Privacy Mode:
/setprivacy→ Disable
Создайте Telegram группу:
- Создайте новую группу
- Добавьте в неё созданного бота как администратора
- Включите Topics (темы) в настройках группы
- Получите
TELEGRAM_GROUP_ID(можно через бота @getidsbot)
Для ВКонтакте (опционально):
- Создайте сообщество ВКонтакте
- Настройте API: Настройки → API → Создать ключ
- Получите
VK_TOKEN,VK_CONFIRM_CODE,VK_SECRET_CODE
# Основные настройки
APP_NAME="TG Support Bot"
APP_URL=https://yourdomain.com
MAIN_DOMAIN=yourdomain.com
# Telegram Bot
TELEGRAM_TOKEN="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
TELEGRAM_GROUP_ID="-1001234567890"
TELEGRAM_SECRET_KEY="your_random_secret_key"
# VK (опционально)
VK_TOKEN="your_vk_token"
VK_CONFIRM_CODE="12345678"
VK_SECRET_CODE="your_vk_secret"
# База данных
DB_CONNECTION=pgsql
DB_HOST=pgdb
DB_PORT=5432
DB_DATABASE=support_bot
DB_USERNAME=postgres
DB_PASSWORD=secure_password
# Redis
REDIS_HOST=redis
REDIS_PASSWORD=secure_redis_password
# Шаблон имени топика
TEMPLATE_TOPIC_NAME="{first_name} {last_name} {platform}"Установка на хостинг - https://github.com/prog-time/tg-support-bot/wiki/Инструкция-по-установке-бота-на-хостинг
Установка через Docker Compose - https://github.com/prog-time/tg-support-bot/wiki/Установка-через-Docker-Compose
Бот поддерживает интеграцию с AI для автоматической генерации ответов.
- OpenAI (GPT-4, GPT-3.5)
- DeepSeek
- GigaChat (Сбер)
# Включить AI
AI_ENABLED=true
AI_AUTO_REPLY=false # true для автоматических ответов
# Выбор провайдера
AI_DEFAULT_PROVIDER=openai # или deepseek, gigachat
# OpenAI
OPENAI_API_KEY=sk-proj-...
OPENAI_MODEL=gpt-4
OPENAI_MAX_TOKENS=1000
OPENAI_TEMPERATURE=0.7
# DeepSeek
DEEPSEEK_CLIENT_SECRET=sk-...
DEEPSEEK_MODEL=deepseek-chat
# GigaChat
GIGACHAT_CLIENT_SECRET=your_secret
GIGACHAT_MODEL=GigaChat-2-MaxAI помощник активируется через команды бота или автоматически при включении AI_AUTO_REPLY=true.
Бот может генерировать ответы на основе истории диалога и контекста.
Проект включает готовый виджет живого чата для встраивания на сайт.
Подробная инструкция доступна в разделе Wiki.
Краткая инструкция:
- Скопируйте код виджета из
public/chat-widget.js - Вставьте перед закрывающим тегом
</body>на вашем сайте:
<script src="https://yourdomain.com/chat-widget.js"></script>
<script>
ChatWidget.init({
apiUrl: 'https://yourdomain.com',
source: 'website'
});
</script>- Все сообщения из виджета будут поступать в Telegram группу
Бот предоставляет REST API для подключения внешних систем.
Endpoint: POST /api/external/message
Пример запроса:
curl -X POST https://yourdomain.com/api/external/message \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source": "crm-system",
"external_user_id": "user_12345",
"first_name": "Иван",
"last_name": "Петров",
"message": "Здравствуйте, у меня вопрос по заказу",
"message_type": "text"
}'Параметры:
source— идентификатор внешнего источникаexternal_user_id— ID пользователя в вашей системеfirst_name,last_name— имя и фамилияmessage— текст сообщенияmessage_type— тип сообщения (text,photo,document, и т.д.)
Ответ:
{
"success": true,
"message_id": 12345,
"topic_id": 67890
}Подробная документация API доступна через Swagger: https://yourdomain.com/api/documentation
URL: https://grafana.yourdomain.com
Логин: значение из GRAFANA_USER
Пароль: значение из GRAFANA_PASSWORD
Grafana подключена к Loki для визуализации логов и создания дашбордов.
Централизованное хранилище логов. Доступен на http://loki:3100.
Веб-интерфейс для управления PostgreSQL.
URL: https://pgadmin.yourdomain.com
Логин: PGADMIN_EMAIL
Пароль: PGADMIN_PASSWORD
Мониторинг Redis.
URL: http://redis:8001
Для отслеживания ошибок в production настройте:
SENTRY_LARAVEL_DSN=https://...@sentry.io/...
SENTRY_TRACES_SAMPLE_RATE=0.1- ✅ Текстовые сообщения
- ✅ Фото
- ✅ Документы
- ✅ Голосовые сообщения
- ✅ Видео
- ✅ Видео-кружки (video notes)
- ✅ Стикеры
- ✅ Аудио
- ✅ Контакты
- ✅ Локации
- ✅ Опросы (polls)
- ✅ Текстовые сообщения
- ✅ Фото
- ✅ Документы
- ✅ Голосовые сообщения
- ✅ Видео
- ✅ Стикеры
- ✅ Аудио
- ✅ Текстовые сообщения
- ✅ Файлы (изображения, документы)
- ✅ Все типы через API (определяется параметром
message_type)
Бот поддерживает отправку интерактивных клавиатур пользователям через специальный синтаксис в тексте сообщения.
Кнопки добавляются в текст сообщения с помощью двойных квадратных скобок:
[[Текст кнопки|тип:значение]]
| Тип | Синтаксис | Описание |
|---|---|---|
| URL | [[Открыть сайт|url:https://example.com]] |
Кнопка со ссылкой |
| Callback | [[Назад|callback:back]] |
Inline callback кнопка |
| Phone | [[Отправить номер|phone]] |
Запрос контакта пользователя |
| Text | [[Вариант 1]] |
Текстовая кнопка (reply keyboard) |
Inline клавиатура с URL и callback кнопками:
Добрый день! Чем могу помочь?
[[Открыть сайт|url:https://example.com]]
[[Вернуться назад|callback:back]]
[[Позвать оператора|callback:operator]]
Кнопки в одном ряду (без переноса строки между ними):
Выберите вариант:
[[Да|callback:yes]] [[Нет|callback:no]]
Reply клавиатура с запросом контакта:
Для продолжения поделитесь своим номером телефона
[[Отправить номер|phone]]
Текстовые кнопки:
Выберите категорию:
[[Техническая поддержка]]
[[Вопрос по оплате]]
[[Другое]]
| Платформа | Inline Keyboard | Reply Keyboard |
|---|---|---|
| Telegram | ✅ | ✅ |
| ВКонтакте | ✅ | ✅ |
| External API | ✅ (через webhook) | ✅ (через webhook) |
- Кнопки автоматически удаляются из текста сообщения
- Inline кнопки (url, callback) имеют приоритет над reply keyboard
- Максимум 8 кнопок в одном ряду для Telegram
- Для VK кнопки конвертируются в соответствующий формат VK API
┌─────────────────────────────────────────────────────────────────┐
│ Nginx (Reverse Proxy) │
│ SSL, Load Balancing │
└────────────┬───────────────────────────────────┬────────────────┘
│ │
┌────────▼────────┐ ┌───────▼────────┐
│ Laravel App │ │ Node.js │
│ (PHP-FPM) │◀───────────────▶│ Socket.io │
│ │ Redis │ │
└────────┬────────┘ └────────────────┘
│
┌────────▼──────────────────────────────────────────┐
│ Laravel Queue Worker │
│ (Background job processing) │
└────────┬──────────────────────────────────────────┘
│
┌────────▼────────┬──────────────┬──────────────────┐
│ PostgreSQL │ Redis │ File Storage │
│ (Database) │ (Cache/Queue│ (Public Files) │
└─────────────────┴──────────────┴──────────────────┘
App Service: Laravel приложение, обрабатывает HTTP запросы, webhook'и от Telegram/VK
Queue Worker: Обработка фоновых задач (отправка сообщений, AI обработка)
Node.js Server: WebSocket сервер для виджета живого чата
PostgreSQL: Основная база данных (пользователи, сообщения, топики)
Redis: Кэш, очереди, pub/sub для real-time обновлений
Nginx: Веб-сервер, reverse proxy, SSL termination
Monitoring Stack: Grafana + Loki + Promtail для мониторинга
# Установить certbot в контейнер nginx
docker exec -it nginx certbot --nginx -d yourdomain.com
# Автоматическое продление
docker exec -it nginx certbot renew --dry-runWiki: https://github.com/prog-time/tg-support-bot/wiki/
API Documentation: https://yourdomain.com/api/documentation (Swagger)
Telegram группа поддержки: https://t.me/pt_tg_support
GitHub Issues: https://github.com/prog-time/tg-support-bot/issues
Мы приветствуем вклад сообщества!
Пожалуйста, ознакомьтесь с CONTRIBUTING.md перед началом работы.
Как помочь проекту:
- Сообщайте об ошибках через GitHub Issues
- Предлагайте новые функции
- Улучшайте документацию
- Создавайте Pull Request'ы
Если проект был вам полезен, поддержите его:
- ⭐ Поставьте звезду на GitHub
- 📢 Расскажите о проекте друзьям и коллегам
- 🤝 Внесите вклад в разработку
Проект распространяется под лицензией MIT.
Подробнее: LICENSE
GitHub: https://github.com/prog-time
Проект: https://github.com/prog-time/tg-support-bot
Telegram: https://t.me/pt_tg_support
Сделано с ❤️ для сообщества