Developer and self-hosted
Mattermost
Статус: завантажуваний plugin (токен бота + події WebSocket). Підтримуються канали, приватні канали, групові приватні повідомлення та приватні повідомлення. Mattermost — це платформа для командного обміну повідомленнями, яку можна розгорнути самостійно (mattermost.com).
Встановлення
Реєстр npm
openclaw plugins install @openclaw/mattermostЛокальна робоча копія
openclaw plugins install ./path/to/local/mattermost-pluginДокладніше: Plugins
Швидке налаштування
Переконайтеся, що plugin доступний
Установіть @openclaw/mattermost за допомогою наведеної вище команди, а потім перезапустіть Gateway, якщо він уже працює.
Створіть бота Mattermost
Створіть обліковий запис бота Mattermost, скопіюйте токен бота та додайте бота до команд і каналів, які він має читати.
Скопіюйте базову URL-адресу
Скопіюйте базову URL-адресу Mattermost (наприклад, https://chat.example.com). Кінцевий суфікс /api/v4 видаляється автоматично.
Налаштуйте OpenClaw і запустіть Gateway
Мінімальна конфігурація:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}Неінтерактивний варіант:
openclaw channels add --channel mattermost --bot-token <token> --http-url https://chat.example.comВбудовані команди з косою рискою
Вбудовані команди з косою рискою потрібно вмикати явно. Коли їх увімкнено, OpenClaw реєструє команди oc_* з косою рискою в кожній команді, учасником якої є бот, і отримує зворотні POST-запити на HTTP-сервері Gateway.
{ channels: { mattermost: { commands: { native: true, nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // Використовуйте, коли Mattermost не може звернутися до Gateway безпосередньо (зворотний проксі/загальнодоступна URL-адреса). callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, }, },}Зареєстровані команди: /oc_status, /oc_model, /oc_models, /oc_new, /oc_help, /oc_think, /oc_reasoning, /oc_verbose, /oc_queue. Якщо задано nativeSkills: true, команди Skills також реєструються як /oc_<skill>.
Примітки щодо поведінки
- Типове значення
nativeіnativeSkills—"auto", яке для Mattermost означає вимкнений стан. Явно встановіть для них значенняtrue. - Типове значення
callbackPath—/api/channels/mattermost/command. - Якщо
callbackUrlне вказано, OpenClaw формуєhttp://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>. Для адрес прив’язки з підстановними знаками (0.0.0.0,::) використовується резервне значенняlocalhost. - У конфігураціях із кількома обліковими записами
commandsможна задати на верхньому рівні або вchannels.mattermost.accounts.<id>.commands(значення облікового запису перевизначають поля верхнього рівня). - Наявні команди з косою рискою з таким самим тригером, створені іншими інтеграціями, залишаються без змін (під час реєстрації їх пропускають); команди, створені ботом, оновлюються або створюються повторно, коли змінюється URL-адреса зворотного виклику.
- Зворотні виклики команд перевіряються за окремими для кожної команди токенами, які повертає Mattermost, коли OpenClaw реєструє команди
oc_*. - Перед прийняттям кожного зворотного виклику OpenClaw оновлює поточну реєстрацію команд Mattermost, тому застарілі токени видалених або повторно створених команд з косою рискою перестають прийматися без перезапуску Gateway.
- Перевірка зворотного виклику завершується відмовою, якщо API Mattermost не може підтвердити, що команда досі актуальна; невдалі перевірки ненадовго кешуються, паралельні пошуки об’єднуються, а частота запуску нових пошуків обмежується для кожної команди, щоб стримувати навантаження від повторного відтворення запитів.
- Зворотні виклики команд з косою рискою завершуються відмовою, якщо реєстрація не вдалася, запуск був частковим або токен зворотного виклику не збігається із зареєстрованим токеном визначеної команди (токен, дійсний для однієї команди, не може пройти подальшу перевірку для іншої команди).
- Прийняті зворотні виклики підтверджуються ефемерною відповіддю «Обробка...», а фактична відповідь надходить як звичайне повідомлення.
Вимога щодо доступності
Кінцева точка зворотного виклику має бути доступною із сервера Mattermost.
- Не встановлюйте для
callbackUrlзначенняlocalhost, якщо Mattermost не працює на тому самому хості або в тому самому мережевому просторі імен, що й OpenClaw. - Не встановлюйте для
callbackUrlбазову URL-адресу Mattermost, якщо ця адреса не проксіює/api/channels/mattermost/commandдо OpenClaw через зворотний проксі. - Для швидкої перевірки виконайте
curl https://<gateway-host>/api/channels/mattermost/command; GET-запит має повернути від OpenClaw405 Method Not Allowed, а не404.
Список дозволених адрес для вихідних з’єднань Mattermost
Якщо зворотний виклик спрямовано на приватні адреси, адреси tailnet або внутрішні адреси, налаштуйте ServiceSettings.AllowedUntrustedInternalConnections у Mattermost так, щоб параметр містив хост або домен зворотного виклику.
Використовуйте записи хостів або доменів, а не повні URL-адреси.
- Правильно:
gateway.tailnet-name.ts.net - Неправильно:
https://gateway.tailnet-name.ts.net
Змінні середовища (типовий обліковий запис)
Якщо ви віддаєте перевагу змінним середовища, задайте їх на хості Gateway:
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
Режими чату
Mattermost автоматично відповідає на приватні повідомлення. Поведінка в каналах контролюється параметром chatmode:
oncall (типово)
Відповідати в каналах лише після згадки через @.
onmessage
Відповідати на кожне повідомлення в каналі.
onchar
Відповідати, коли повідомлення починається з префікса-тригера.
Приклад конфігурації:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], // типово }, },}Примітки:
- У режимі
oncharбот також відповідає на явні згадки через @. - Параметр
channels.mattermost.requireMentionусе ще враховується, але рекомендовано використовуватиchatmode. Налаштуванняgroups.<channelId>.requireMentionдля окремого каналу мають вищий пріоритет за обидва. - Після того як бот надсилає видиму відповідь у гілці каналу, на наступні повідомлення в тій самій гілці він відповідає без нової згадки через @ або префікса
onchar, завдяки чому багатокрокова розмова в гілці триває без переривань. Участь запам’ятовується протягом 7 днів після останньої відповіді бота в цій гілці та зберігається після перезапусків Gateway. Це не впливає на гілки, які бот лише спостерігав; створіть нове повідомлення верхнього рівня, щоб знову вимагати явну згадку.
Гілки та сеанси
Використовуйте channels.mattermost.replyToMode, щоб визначити, чи залишатимуться відповіді в каналах і групах в основному каналі, чи створюватимуть гілку під повідомленням-тригером.
off(типово): відповідати в гілці, лише якщо вхідне повідомлення вже належить до неї.first: для повідомлень верхнього рівня в каналі або групі створювати гілку під цим повідомленням і спрямовувати розмову до сеансу, пов’язаного з гілкою.allіbatched: наразі в Mattermost працюють так само, якfirst, оскільки після появи кореневого повідомлення гілки наступні частини відповіді та медіафайли надсилаються в ту саму гілку.- Для приватних повідомлень типовим залишається значення
off, навіть якщо встановленоreplyToMode.
Використовуйте channels.mattermost.replyToModeByChatType, щоб перевизначити режим для чатів типу direct, group або channel. Задайте значення для direct, щоб увімкнути гілки в приватних повідомленнях:
off(типово): приватні повідомлення залишаються без гілок в одному безперервному сеансі.first,allабоbatched: кожне приватне повідомлення верхнього рівня створює гілку Mattermost з новим незалежним сеансом.
{ channels: { mattermost: { replyToMode: "all", replyToModeByChatType: { direct: "first", }, }, },}Примітки:
- У сеансах, пов’язаних із гілкою, ідентифікатор повідомлення-тригера використовується як корінь гілки.
firstіallнаразі еквівалентні, оскільки після появи кореневого повідомлення гілки Mattermost наступні частини відповіді та медіафайли надсилаються в ту саму гілку.- Перевизначення для окремих типів чатів мають вищий пріоритет за
replyToMode. Без перевизначенняdirectнаявні розгортання зберігають плоскі приватні повідомлення без гілок.
Керування доступом (приватні повідомлення)
- Типове значення:
channels.mattermost.dmPolicy = "pairing"(невідомі відправники отримують код сполучення). Інші значення:allowlist,open,disabled. - Схвалення:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Загальнодоступні приватні повідомлення:
channels.mattermost.dmPolicy="open"разом ізchannels.mattermost.allowFrom=["*"](схема конфігурації вимагає підстановний знак). channels.mattermost.allowFromприймає ідентифікатори користувачів (рекомендовано) та записиaccessGroup:<name>. Див. Групи доступу.
Канали (групи)
- Типове значення:
channels.mattermost.groupPolicy = "allowlist"(потрібна згадка). - Додайте відправників до списку дозволених за допомогою
channels.mattermost.groupAllowFrom(рекомендовано використовувати ідентифікатори користувачів). channels.mattermost.groupAllowFromприймає записиaccessGroup:<name>. Див. Групи доступу.- Перевизначення вимоги згадки для окремих каналів задаються в
channels.mattermost.groups.<channelId>.requireMention, а типове значення — уchannels.mattermost.groups["*"].requireMention. - Зіставлення за
@usernameє змінним і вмикається лише за умовиchannels.mattermost.dangerouslyAllowNameMatching: true. - Відкриті канали:
channels.mattermost.groupPolicy="open"(потрібна згадка). - Порядок визначення:
channels.mattermost.groupPolicy, потімchannels.defaults.groupPolicy, потім"allowlist". - Примітка щодо середовища виконання: якщо розділ
channels.mattermostповністю відсутній, під час перевірок груп середовище виконання завершує перевірку відмовою зgroupPolicy="allowlist"(навіть якщо встановленоchannels.defaults.groupPolicy) і одноразово записує попередження до журналу.
Приклад:
{ channels: { mattermost: { groupPolicy: "open", groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, }, },}Цілі вихідної доставки
Використовуйте ці формати цілей із openclaw message send або Cron/Webhook:
| Ціль | Куди доставляється |
|---|---|
channel:<id> |
Канал за ідентифікатором |
channel:<name> або #channel-name |
Канал за назвою; пошук виконується в усіх командах, до яких належить бот |
user:<id> або mattermost:<id> |
Приватне повідомлення цьому користувачу |
@username |
Приватне повідомлення (ім’я користувача визначається через API Mattermost) |
Вихідні повідомлення підтримують не більше одного вкладення на повідомлення; надсилайте кілька файлів окремими повідомленнями.
Повторні спроби для каналу приватних повідомлень
Коли OpenClaw надсилає повідомлення до цілі приватного повідомлення Mattermost і спочатку має визначити прямий канал, він типово повторює спроби після тимчасових помилок створення прямого каналу.
Використовуйте channels.mattermost.dmChannelRetry, щоб налаштувати цю поведінку глобально для plugin Mattermost, або channels.mattermost.accounts.<id>.dmChannelRetry для окремого облікового запису. Типові значення:
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}Примітки:
- Це стосується лише створення каналу особистих повідомлень (
/api/v4/channels/direct), а не кожного виклику API Mattermost. - Повторні спроби використовують експоненційне збільшення затримки з джитером і застосовуються до тимчасових збоїв, як-от перевищення лімітів частоти запитів, відповіді 5xx, а також помилки мережі чи перевищення часу очікування.
- Помилки клієнта 4xx, крім
429, вважаються постійними й не спричиняють повторних спроб.
Потокове попереднє відображення
Mattermost потоково передає процес міркування, активність інструментів і частковий текст відповіді в чернетку допису попереднього перегляду, яка остаточно оновлюється на місці, коли фінальну відповідь можна безпечно надіслати. У режимі partial попередній перегляд оновлюється в дописі з тим самим ідентифікатором замість засмічення каналу повідомленнями для кожного фрагмента. У режимі block попередній перегляд перемикається між завершеним текстом і блоками активності інструментів, тому попередні блоки залишаються видимими як окремі дописи замість перезапису наступним блоком. Фінальні відповіді з медіафайлами або помилками скасовують очікувані зміни попереднього перегляду й використовують звичайне доставлення замість публікації непотрібного допису попереднього перегляду.
Потокове попереднє відображення увімкнено за замовчуванням у режимі partial. Налаштуйте його через channels.mattermost.streaming (рядок режиму, логічне значення або об’єкт на кшталт { mode: "progress" }):
{ channels: { mattermost: { streaming: "partial", // off | partial | block | progress }, },}Режими потокового передавання
partial(за замовчуванням): один допис попереднього перегляду, який редагується зі зростанням відповіді, а потім завершується повною відповіддю.blockперемикає попередній перегляд між завершеним текстом і блоками активності інструментів, тому кожен блок залишається видимим як окремий допис замість перезапису на місці. Паралельні та послідовні оновлення інструментів використовують спільний поточний допис активності інструментів.progressпоказує попередній перегляд стану під час генерування та публікує фінальну відповідь лише після завершення.offвимикає потокове попереднє відображення. ЯкщоblockStreaming: true, завершені блоки асистента все одно доставляються як звичайні блокові відповіді (окремі дописи), а не як один об’єднаний фінальний допис.
Примітки щодо поведінки потокового передавання
- Якщо потік неможливо завершити на місці (наприклад, допис видалили під час потокового передавання), OpenClaw натомість надсилає новий фінальний допис, щоб відповідь не була втрачена.
- Дані, що містять лише міркування, не публікуються в каналі, зокрема текст, який надходить як цитата
> Thinking. Установіть/reasoning on, щоб бачити міркування в інших інтерфейсах; фінальний допис Mattermost містить лише відповідь. - Матрицю зіставлення каналів див. у розділі Потокове передавання.
Реакції (інструмент повідомлень)
- Використовуйте
message action=reactізchannel=mattermost. messageId— це ідентифікатор допису Mattermost.emojiприймає назви на кшталтthumbsupабо:+1:(двокрапки необов’язкові).- Установіть
remove=true(логічне значення), щоб видалити реакцію. - Події додавання та видалення реакцій пересилаються як системні події до спрямованого сеансу агента з урахуванням тих самих перевірок політик особистих повідомлень і груп, що й для повідомлень.
Приклади:
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=trueКонфігурація:
channels.mattermost.actions.reactions: увімкнути або вимкнути дії з реакціями (за замовчуваннямtrue).- Перевизначення для окремого облікового запису:
channels.mattermost.accounts.<id>.actions.reactions.
Інтерактивні кнопки (інструмент повідомлень)
Надсилайте повідомлення з кнопками, які можна натискати. Коли користувач натискає кнопку, агент отримує вибір і може відповісти.
Кнопки надходять із семантичних даних presentation (у звичайних відповідях агента та в message action=send). OpenClaw відображає кнопки зі значеннями як інтерактивні кнопки Mattermost, залишає кнопки з URL видимими в тексті повідомлення та перетворює меню вибору на читабельний текст.
message action=send channel=mattermost target=channel:<channelId> presentation={"blocks":[{"type":"buttons","buttons":[{"label":"Yes","value":"yes"},{"label":"No","value":"no"}]}]}Поля кнопки презентації:
labelstringrequiredВідображувана мітка (псевдонім: text).
valuestringЗначення, яке надсилається після натискання та використовується як ідентифікатор дії (псевдоніми: callback_data, callbackData). Обов’язкове для кнопки, яку можна натискати, якщо не встановлено url.
urlstringКнопка-посилання; відображається в тілі повідомлення як текст label: url замість інтерактивної кнопки.
style"primary" | "secondary" | "success" | "danger"Стиль кнопки. Mattermost застосовує стандартне оформлення до значень, які він не підтримує.
Щоб оголосити підтримку кнопок у системному запиті агента, додайте inlineButtons до можливостей каналу:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}Коли користувач натискає кнопку:
Перевірка доступу
Користувач, який натиснув кнопку, має пройти ті самі перевірки політик особистих повідомлень і груп, що й відправник повідомлення; у разі неавторизованого натискання відображається тимчасове сповіщення, а натискання ігнорується.
Заміна кнопок підтвердженням
Усі кнопки замінюються рядком підтвердження (наприклад, «✓ Yes вибрано користувачем @user»).
Агент отримує вибір
Агент отримує вибір як вхідне повідомлення (разом із системною подією) і відповідає.
Примітки щодо реалізації
- Зворотні виклики кнопок використовують перевірку HMAC-SHA256 (автоматично, налаштування не потрібне).
- Після натискання замінюється весь блок вкладення, тому всі кнопки видаляються разом — часткове видалення неможливе.
- Ідентифікатори дій, що містять дефіси або символи підкреслення, автоматично очищаються (обмеження маршрутизації Mattermost).
- Натискання, у яких
action_idне відповідає дії в початковому дописі, відхиляються з кодом403(«Unknown action»).
Конфігурація та доступність
channels.mattermost.capabilities: масив рядків можливостей. Додайте"inlineButtons", щоб увімкнути опис інструмента кнопок у системному запиті агента.channels.mattermost.interactions.callbackBaseUrl: необов’язкова зовнішня базова URL-адреса для зворотних викликів кнопок (наприклад,https://gateway.example.com). Використовуйте її, коли Mattermost не може безпосередньо звернутися до Gateway за його адресою прив’язки.- У конфігураціях із кількома обліковими записами те саме поле також можна встановити в
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Якщо
interactions.callbackBaseUrlне вказано, OpenClaw формує URL-адресу зворотного виклику зgateway.customBindHost+gateway.port(за замовчуванням 18789), а потім використовує резервну адресуhttp://localhost:<port>. Шлях зворотного виклику:/mattermost/interactions/<accountId>. - Правило доступності: URL-адреса зворотного виклику кнопки має бути доступна із сервера Mattermost.
localhostпрацює лише тоді, коли Mattermost і OpenClaw запущені на одному хості або в одному просторі імен мережі. channels.mattermost.interactions.allowedSourceIps: список дозволених IP-адрес джерел для зворотних викликів кнопок. Без нього приймаються лише джерела local loopback (127.0.0.1,::1), тому віддалений сервер Mattermost потрібно додати до цього списку, інакше його натискання відхилятимуться з кодом403. Якщо використовується зворотний проксі, також установітьgateway.trustedProxies, щоб справжня IP-адреса клієнта визначалася з пересланих заголовків.- Якщо ціль зворотного виклику приватна, належить до tailnet або є внутрішньою, додайте її хост чи домен до
ServiceSettings.AllowedUntrustedInternalConnectionsу Mattermost.
Пряма інтеграція з API (зовнішні скрипти)
Зовнішні скрипти та Webhook можуть публікувати кнопки безпосередньо через REST API Mattermost замість використання інструмента агента message. За можливості використовуйте buildButtonAttachments() із Plugin; якщо публікуєте необроблений JSON, дотримуйтеся таких правил:
Структура даних:
{ channel_id: "<channelId>", message: "Choose an option:", props: { attachments: [ { actions: [ { id: "mybutton01", // alphanumeric only - see below type: "button", // required, or clicks are silently ignored name: "Approve", // display label style: "primary", // optional: "default", "primary", "danger" integration: { url: "https://gateway.example.com/mattermost/interactions/default", context: { action_id: "mybutton01", // must match button id action: "approve", // ... any custom fields ... _token: "<hmac>", // see HMAC section below }, }, }, ], }, ], },}Генерування токена HMAC
Gateway перевіряє натискання кнопок за допомогою HMAC-SHA256. Зовнішні скрипти мають генерувати токени, які відповідають логіці перевірки Gateway:
Отримайте секрет із токена бота
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken), закодований у шістнадцятковому форматі.
Створіть об’єкт контексту
Створіть об’єкт контексту з усіма полями, крім _token.
Серіалізуйте з відсортованими ключами
Серіалізуйте з рекурсивно відсортованими ключами та без пробілів (Gateway також канонізує вкладені об’єкти й створює компактний JSON).
Підпишіть дані
HMAC-SHA256(key=secret, data=serializedContext)
Додайте токен
Додайте отриманий шістнадцятковий дайджест як _token до контексту.
Приклад на Python:
secret = hmac.new( b"openclaw-mattermost-interactions", bot_token.encode(), hashlib.sha256).hexdigest() ctx = {"action_id": "mybutton01", "action": "approve"}payload = json.dumps(ctx, sort_keys=True, separators=(",", ":"))token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest() context = {**ctx, "_token": token}Поширені помилки HMAC
json.dumpsу Python за замовчуванням додає пробіли ({"key": "val"}). Використовуйтеseparators=(",", ":"), щоб результат відповідав компактному виводу JavaScript ({"key":"val"}).- Завжди підписуйте всі поля контексту (крім
_token). Gateway видаляє_token, а потім підписує все, що залишилося. Підписування лише частини полів призводить до непомітної помилки перевірки. - Використовуйте
sort_keys=True— Gateway сортує ключі перед підписуванням, а Mattermost може змінити порядок полів контексту під час зберігання даних. - Отримуйте секрет із токена бота (детерміновано), а не з випадкових байтів. Секрет має бути однаковим у процесі, що створює кнопки, і в Gateway, який виконує перевірку.
Адаптер каталогу
Plugin Mattermost містить адаптер каталогу, який визначає назви каналів і користувачів через API Mattermost. Це дає змогу використовувати цілі #channel-name і @username у openclaw message send, а також у доставленнях Cron і Webhook.
Налаштування не потрібне — адаптер використовує токен бота з конфігурації облікового запису.
Кілька облікових записів
Mattermost підтримує кілька облікових записів у channels.mattermost.accounts:
{ channels: { mattermost: { accounts: { default: { name: "Основний", botToken: "mm-token", baseUrl: "https://chat.example.com" }, alerts: { name: "Сповіщення", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, }, }, },}Значення облікового запису перевизначають поля верхнього рівня; channels.mattermost.defaultAccount визначає, який обліковий запис використовується, якщо його не вказано.
Усунення несправностей
Немає відповідей у каналах
Переконайтеся, що бот перебуває в каналі, і згадайте його (oncall), використайте префікс-тригер (onchar) або встановіть chatmode: "onmessage".
Помилки автентифікації або кількох облікових записів
- Перевірте токен бота, базову URL-адресу та чи ввімкнено обліковий запис.
- Проблеми з кількома обліковими записами: змінні середовища застосовуються лише до облікового запису
default. - Для приватних/LAN-хостів Mattermost потрібен параметр
network.dangerouslyAllowPrivateNetwork: true(захист від SSRF типово блокує приватні IP-адреси).
Вбудовані слеш-команди не працюють
Unauthorized: invalid command token.: OpenClaw не прийняв токен зворотного виклику. Типові причини:- реєстрація слеш-команд завершилася помилкою або була виконана лише частково під час запуску
- зворотний виклик надходить до неправильного Gateway або облікового запису
- у Mattermost досі є старі команди, що вказують на попередню ціль зворотного виклику
- Gateway перезапустився без повторної активації слеш-команд
- Якщо вбудовані слеш-команди припинили працювати, перевірте журнали на наявність
mattermost: failed to register slash commandsабоmattermost: native slash commands enabled but no commands could be registered. - Якщо
callbackUrlне вказано, а журнали попереджають, що адреса зворотного виклику визначилася як URL-адреса loopback на кшталтhttp://localhost:18789/..., імовірно, ця адреса доступна лише тоді, коли Mattermost працює на тому самому хості або в тому самому мережевому просторі імен, що й OpenClaw. Натомість явно задайте зовнішньо доступну адресуcommands.callbackUrl.
Проблеми з кнопками
- Кнопки відображаються як білі прямокутники або не відображаються взагалі: дані кнопок мають неправильний формат. Для кожної презентаційної кнопки потрібні
labelіvalue(кнопки, у яких відсутнє будь-яке з цих полів, відкидаються). - Кнопки відображаються, але натискання нічого не робить: перевірте, чи Gateway доступний із сервера Mattermost, чи IP-адресу сервера Mattermost додано до
channels.mattermost.interactions.allowedSourceIps(без цього приймається лише loopback), а також чи міститьServiceSettings.AllowedUntrustedInternalConnectionsхост зворотного виклику для приватних цілей. - Після натискання кнопки повертають 404: імовірно,
idкнопки містить дефіси або символи підкреслення. Маршрутизатор дій Mattermost не працює з ідентифікаторами, що містять неалфавітно-цифрові символи. Використовуйте лише[a-zA-Z0-9]. - У журналах Gateway з'являється
rejected callback source: натискання надійшло з IP-адреси, якої немає вinteractions.allowedSourceIps. Додайте сервер Mattermost або вашу точку входу до списку дозволених, а при використанні зворотного проксі налаштуйтеgateway.trustedProxies. - У журналах Gateway з'являється
invalid _token: невідповідність HMAC. Перевірте, що ви підписуєте всі поля контексту (а не лише їхню частину), використовуєте відсортовані ключі та компактний JSON (без пробілів). Дивіться розділ про HMAC вище. - У журналах Gateway з'являється
missing _token in context: поле_tokenвідсутнє в контексті кнопки. Переконайтеся, що воно включене під час формування корисного навантаження інтеграції. - Gateway відхиляє натискання з повідомленням
Unknown action:context.action_idне відповідає жодномуidдії в дописі. Задайте для обох однакове нормалізоване значення. - Агент не пропонує кнопки: додайте
capabilities: ["inlineButtons"]до конфігурації каналу Mattermost.
Пов’язані матеріали
- Маршрутизація каналів — маршрутизація сеансів для повідомлень
- Огляд каналів — усі підтримувані канали
- Групи — поведінка групових чатів і обмеження за згадуванням
- Сполучення — автентифікація в особистих повідомленнях і процес сполучення
- Безпека — модель доступу та посилення захисту