Боты с Mattermost
Скрипты для Mattermost строятся на трёх механизмах: входящих вебхуках, слеш-командах и исходящих вебхуках. Все три работают в Kontext без правок скрипта — меняется только адрес в настройке. Одна оговорка: входящий вебхук пишет только в свой канал, поле channel из тела запроса не действует. Скрипту, который шлёт в разные каналы, нужен отдельный вебхук на каждый канал.
Что работает
| В Mattermost | В Kontext | Что поменять |
|---|---|---|
Входящий вебхук ({"text": "…"}, вложения, payload=) | «Интеграции → Вебхуки → Slack-совместимый» | Адрес вебхука в скрипте |
Слеш-команда (token, ответ {"response_type", "text"}) | Команда бота: карточка бота → «Команды» | Адрес скрипта — в настройке команды в Kontext |
Исходящий вебхук по словам-триггерам (ответ {"text", "response_type": "comment"}) | Подписка бота в формате «Mattermost»: карточка бота → «События» | Адрес скрипта и слова — в настройке подписки |
| Бот-аккаунт и его токен | Бот пространства и токен ktx_b_… | Вызовы API v4 переписать на API v1 |
Бот
Заведите бота: «Пространство → Интеграции → Боты → Новый бот». От имени бота приходят ответы его команд и подписок, а по желанию — и сообщения входящих вебхуков («Писать от имени: бота» в настройке вебхука). Бот не занимает оплачиваемого места в подписке и не зависит от того, в каких каналах сейчас человек, который завёл интеграцию.
Бот видит и получает сообщения только из каналов, куда его добавили (карточка бота → «Каналы»).
Слеш-команда
- Карточка бота → «Команды»: задайте
/имя, адрес скрипта, метод (POSTилиGET), описание и подсказку. - Kontext покажет проверочный токен — впишите его в скрипт вместо токена Mattermost.
Запрос содержит поля Mattermost (token, team_id, channel_id, channel_name, user_id, user_name, command, text, response_url, user_mentions, channel_mentions…) и заголовок Authorization: Token <токен>. Ответ — как в Mattermost: с ephemeral его видит только тот, кто вызвал команду, а с in_channel бот пишет его в канал (над ответом указано, кто вызвал). extra_responses, channel_id и response_url работают. Ответа скрипта Kontext ждёт до 30 секунд (через 3 секунды вызвавший видит «ждём ответ…») и запрос не повторяет — как и Mattermost.
Отличия: идентификаторы в полях выглядят как C<число>, U<число>, T<число>, а не 26-значные строки. Поля username, icon_url, goto_location и props в ответе не действуют — ответ всегда приходит от имени бота.
Исходящий вебхук
- Карточка бота → «События» → новая подписка, формат «Mattermost».
- Задайте слова-триггеры и условие («первое слово» или «начинается с»), каналы и тип тела запроса (JSON или форма) — как в Mattermost. Обязательно хотя бы одно: слова или каналы.
В теле запроса — поля Mattermost (token, team_id, team_domain, channel_id, channel_name, timestamp, user_id, user_name, post_id, text, trigger_word, file_ids). Ответ {"text": "…", "response_type": "comment"} попадает в тред сообщения, которое вызвало вебхук, а без response_type — в канал. Ответ пишет бот, username и icon_url не действуют. Сообщения входящих вебхуков, ответы скриптов и ответы команд исходящий вебхук не запускают — как и в Mattermost. Поэтому два скрипта не зациклятся, отвечая друг другу.
Отличия: кнопка «Проверить» в Kontext не отправляет запрос скрипту, а только проверяет адрес — скрипт Mattermost принял бы проверку за сообщение в канале. Если доставка не прошла за 5 секунд, Kontext повторяет её через 1 минуту, 5 минут, 30 минут, 2 часа и 6 часов. Журнал доставок — в карточке подписки.
Чего нет
- API Mattermost v4. Скрипты, которые обращаются к
/api/v4/…, придётся переписать на API v1: он небольшой и описан полностью. - Выбор канала из тела входящего вебхука. Поле
channelне действует: вебхук пишет в свой канал. Скрипту, который одним вебхуком раскладывал сообщения по разным каналам, понадобится отдельный вебхук на каждый канал.@channelи@hereиз тела запроса присылают уведомления, только если у вебхука отмечено «Будить канал». - Серверные плагины. Сторонние программы подключаются только по HTTP: на одном сервере работают многие компании.
- Интерактивные кнопки и диалоги в формате Mattermost (
integrationвattachments.actions,dialog.open) пока не поддерживаются. Кнопки и модальные окна работают в формате Slack — см. «Кнопки и окна».
Полное описание API — Документация → API.