Вебхуки каналов
Вебхук канала — секретный URL, на который внешняя система (GitLab, Zabbix, Grafana, собственный скрипт) шлёт уведомление, и оно появляется в канале от имени самого канала. Формат входа — Slack/Mattermost Incoming Webhooks ({"text": …, "attachments": […]}), то есть почти любая интеграция, которая умеет слать в Slack, работает здесь без переделки.
В отличие от Bot API (страница «Боты и Bot API»), здесь не нужен бот: создаёте вебхук в настройках канала, копируете URL и вставляете его во внешний сервис. Автором сообщения становится botMother — системный бот, который может писать в любой канал без приглашения. Участники получают уведомление и непрочитанное, как от обычного сообщения.
Создание
1. Откройте настройки канала (сведения о канале → «Вебхуки»). Доступно только владельцу канала или суперадмину — секрет даёт право писать в канал от его имени, это власть владельца.
2. Нажмите «Создать вебхук». Можно задать метку («GitLab», «Мониторинг») — она видна только в списке.
3. Скопируйте URL. Он имеет вид https://<сервер>/api/v1/hooks/<секрет>. Секрет — 64 символа: перебор невозможен, а утечка URL равна праву писать в канал, поэтому не публикуйте его в открытых местах.
4. Вставьте URL во внешний сервис и настройте формат сообщения (см. ниже).
У канала может быть до 10 вебхуков — например, свой на проект GitLab и свой на мониторинг. Каждый имеет свою статистику (когда последний раз срабатывал и сколько раз).
Формат сообщения
Тело запроса — JSON в формате Slack Incoming Webhooks:
{ "text": "Деплой 2.4.1 завершён" }
``
Поле `text` поддерживает Markdown. Оповещение-карточка:
{ "text": "Критическая ошибка на проде", "attachments": [ { "title": "Zabbix · Production-01", "text": "CPU Load > 95% пять минут", "color": "danger", "fields": [{"title": "Хост", "value": "db-master-01", "short": true}] } ] } ``
Используются text и attachments (внутри — title, text, color, fields). Цвет color рисует полоску слева: #RRGGBB или слова good, warning, danger, info. Поля username, icon_emoji, icon_url принимаются ради совместимости, но игнорируются — отправитель всегда botMother.
Принимаются оба формата отправки:
- сырой JSON (
Content-Type: application/json) — как шлют современные системы; - form-encoded
payload=<json>(Content-Type: application/x-www-form-urlencoded) — legacy-формат Slack/Mattermost, который до сих пор шлют Zabbix, часть интеграций GitLab и старые скрипты.
Если запрос отклонён с 400 «Пустое сообщение» — внешняя система прислала JSON БЕЗ поля text (например, generic-webhook GitLab). В этом случае настройте интеграцию на формат Slack/Mattermost или добавьте поле text в тело.
Пример: GitLab
В настройках проекта GitLab: Settings → Integrations → Webhooks (или Settings → Integrations → Mattermost notifications — формат тот же):
- URL:
https://<сервер>/api/v1/hooks/<секрет>(скопируйте из настроек канала). - События: выберите нужные (push, pipeline, issue, merge request…).
GitLab шлёт JSON с полями text и attachments — они склеиваются в одно сообщение канала.
Пример: curl (проверка)
curl -X POST https://<сервер>/api/v1/hooks/<секрет> \\
-H "Content-Type: application/json" \\
-d '{"text":"Вебхук работает"}'
``
Успешный ответ — `ok` (200). Пустой `text` без вложений — ошибка 400.
---
## Как это работает под капотом
* Сообщение создаётся от имени botMother — системного бота, который может писать в любой канал без приглашения (проверка членства для неё делает исключение). У сообщения должен быть автор, иначе клиент не показывает непрочитанное и не будит телефон.
* Приём идёт по секрету в URL, без заголовков авторизации: внешние системы шлют вебхуки голым POST. Частота ограничена общим лимитером сервера (по IP).
* Удаление вебхука не трогает уже доставленные сообщения. Удаление канала уносит вебхуки каскадом.
---
## Диагностика
| Симптом | Что проверить |
|---|---|
| 404 при отправке | Вебхук удалён или секрет скопирован не полностью |
| 403 «канал в архиве» | Архив запрещает запись; разархивируйте канал |
| 400 «пустое сообщение» | В запросе нет `text` и нет вложений |
| Сообщение есть, но без уведомления | Проверьте настройки уведомлений канала на устройстве |
| Сервер просит подождать | Слишком частые запросы — снизьте темп |
Смежные страницы: «Боты и Bot API», «Интеграции и вебхуки».
TRIBLY