Интеграция с Telegram через один управляемый Hub
Отправляйте сообщения от нескольких ботов, принимайте Telegram update через единый публичный адрес и пересылайте их в нужные приложения с журналом в SQLite.
getWebhookInfo.Первая двусторонняя отправка
Нужны API key Hub, токен Telegram-бота и HTTPS endpoint вашего приложения, принимающий JSON.
curl -X POST "$HUB_URL/send" \
-H "Authorization: Bearer $HUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"bot_token": "123456:ABC...",
"chat_id": "123456789",
"text": "Новая заявка",
"parse_mode": "HTML",
"callback_url": "https://app.example.com/hooks/telegram",
"callback_secret": "shared-hmac-secret",
"callback_delivery_mode": "durable"
}'
$hub = new HubTelegramClient([
'url' => env('TELEGRAM_HUB_URL'),
'api_key' => env('TELEGRAM_HUB_API_KEY'),
'callback_url' => route('hooks.telegram'),
'callback_secret' => env('TELEGRAM_HUB_CALLBACK_SECRET'),
]);
$hub->send($chatId, 'Новая заявка', [
'parse_mode' => 'HTML',
]);
bot_token имеет приоритет над именем channel.
Callback URL, HMAC secret и закрытый входящий путь сохраняются между перезапусками.
Для этого публичный адрес Hub должен начинаться с https://.
Ответ содержит результат Telegram и служебный блок callback.
Автоматические обратные webhook
Маршрут связывается с bot token. Callback можно передавать в каждом запросе или только при первой настройке.
| Поле | Назначение | Хранение |
|---|---|---|
callback_url | Endpoint приложения для Telegram update | SQLite |
callback_secret | Ключ подписи X-Hub-Signature | SQLite |
callback_delivery_mode | sync или надёжная очередь durable | SQLite |
webhook_url | Закрытый входящий URL конкретного бота в Hub | SQLite |
telegram_secret | Проверка запроса от Telegram | SQLite |
Проверка перед каждой отправкой
Если callback не передан, Hub ищет его по bot_token или channel.
getWebhookInfo должен вернуть внутренний webhook URL текущего Hub.
При пустом или чужом URL Hub повторяет setWebhook с сохранённым secret.
В SQLite и панели сохраняются ok, registered, repaired или failed.
telegram_secret.Авторизация
Исходящий API принимает Bearer token или X-API-Key. Панель и admin API используют отдельные логин и пароль.
Authorization: Bearer <HUB_API_KEY>
# либо
X-API-Key: <HUB_API_KEY>
| Поверхность | Защита |
|---|---|
/send, /telegram/*, /channels | Bearer API key или X-API-Key |
/admin, /admin/api/* | Admin session или HTTP Basic |
/webhooks/telegram/* | X-Telegram-Bot-Api-Secret-Token |
/health, /docs, /openapi.json | Публично |
Доставка Telegram update
Hub загружает маршрут из SQLite, сохраняет исходный payload и доставляет точный JSON в совместимом синхронном режиме либо через надёжную очередь.
| Режим | Ответ Telegram | Повтор |
|---|---|---|
sync | 200 после ответа callback 2xx | Telegram повторяет update после ошибки Hub |
durable | 200 после записи в SQLite | Воркеры Hub, exponential backoff и статус dead |
| Заголовок | Значение |
|---|---|
X-Hub-Bot | Стабильное имя маршрута |
X-Hub-Event-Id | ID события в SQLite и панели |
X-Telegram-Update-Id | Исходный update ID, если он присутствует |
X-Hub-Signature | sha256=<HMAC> от точного тела запроса |
X-Hub-Event-Id. Состояния queued, retrying, forwarding и dead видны в панели.HTTP API
Справочник ниже формируется из текущей схемы запущенного Hub. Для ручных запросов доступен Swagger UI, исходная схема — в OpenAPI JSON.
Коды ошибок
| Код | Когда возвращается |
|---|---|
| 401 | API key отсутствует или неверен |
| 403 | Не совпал Telegram webhook secret |
| 404 | Маршрут, событие или admin-объект не найден |
| 409 | Конфликт имени, token или состояния retry |
| 422 | Некорректные поля, неизвестный channel или нет HTTPS URL |
| 502 | Ошибка Telegram API либо callback-получателя |
| 503 | Сервис или административная авторизация не готовы |
Каждый ответ содержит X-Request-ID. Используйте его для поиска связанной записи в журнале сервиса.
CLI управления
Глобальная команда hub работает из любого каталога. Запустите hub -h, hub bot -h или hub event -h для подробной справки. Старый hubctl.sh остаётся совместимым.
sudo hub creds
sudo hub doctor
sudo hub bot list
sudo hub bot add orders \
--token '123456:ABC...' \
--callback-url 'https://app.example.com/hooks/telegram' \
--secret 'shared-secret' \
--delivery-mode durable \
--register
sudo hub event list --limit 20
sudo hub backup
Развёртывание на домене
Telegram принимает webhook только по публичному HTTPS. Установщик автоматически использует активный Nginx и Certbot либо запускает Caddy, не затрагивая другие сайты.
curl -fsSL https://gitlab.com/valvic/hub/-/raw/main/install.sh \
| sudo bash -s -- -d hub.example.com
# Обновление
curl -fsSL https://gitlab.com/valvic/hub/-/raw/main/install.sh \
| sudo bash -s -- -u
80, TCP/UDP 443. Активный Nginx определяется автоматически; для полностью ручного proxy используйте -x.