Developer and self-hosted
Mattermost
Статус: загружаемый плагин (токен бота + события WebSocket). Поддерживаются каналы, закрытые каналы, групповые личные сообщения и личные сообщения. Mattermost — это платформа для командного обмена сообщениями с возможностью самостоятельного размещения (mattermost.com).
Установка
Реестр npm
openclaw plugins install @openclaw/mattermostЛокальная рабочая копия
openclaw plugins install ./path/to/local/mattermost-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 команды навыков также регистрируются как /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, если этот URL не проксирует/api/channels/mattermost/commandв OpenClaw через обратный прокси. - Для быстрой проверки используйте
curl https://<gateway-host>/api/channels/mattermost/command; запрос GET должен вернуть405 Method Not Allowedот OpenClaw, а не404.
Список разрешённых исходящих адресов Mattermost
Если обратный вызов направлен на частные адреса, адреса tailnet или внутренние адреса, задайте в Mattermost ServiceSettings.AllowedUntrustedInternalConnections, включив в него хост или домен обратного вызова.
Используйте записи хостов или доменов, а не полные 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, поскольку после появления корневого сообщения обсуждения в Mattermost последующие части ответа и медиафайлы продолжают отправляться в то же обсуждение.- Для личных сообщений по умолчанию используется
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/webhooks:
| Цель | Место доставки |
|---|---|
channel:<id> |
Канал по идентификатору |
channel:<name> или #channel-name |
Канал по имени с поиском среди команд, в которых состоит бот |
user:<id> или mattermost:<id> |
Личные сообщения с указанным пользователем |
@username |
Личные сообщения (имя пользователя определяется через API Mattermost) |
При исходящей отправке поддерживается не более одного вложения на сообщение; несколько файлов следует отправлять отдельными сообщениями.
Повторная попытка для канала личных сообщений
Когда OpenClaw отправляет сообщение адресату личной переписки Mattermost и сначала должен определить прямой канал, по умолчанию он повторяет попытки при временных сбоях создания прямого канала.
Используйте channels.mattermost.dmChannelRetry, чтобы настроить это поведение глобально для плагина 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 (устаревшие скалярные или логические значения streaming переносятся командой openclaw doctor --fix):
{ channels: { mattermost: { streaming: { mode: "partial" }, // off | partial | block | progress }, },}Режимы потоковой передачи
partial(по умолчанию): одна публикация предпросмотра, которая редактируется по мере формирования ответа, а затем финализируется полным ответом.blockпереключает предпросмотр между блоками завершённого текста и активности инструментов, поэтому каждый блок остаётся видимым как отдельная публикация, а не перезаписывается на месте. Параллельные и последовательные обновления инструментов используют общую текущую публикацию активности инструментов.progressпоказывает предпросмотр состояния во время генерации и публикует окончательный ответ только после завершения.offотключает потоковую передачу предпросмотра. При использованииstreaming.block.enabled: 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, оставляет кнопки со ссылками видимыми в тексте сообщения и преобразует меню выбора в удобочитаемый текст.
message action=send channel=mattermost target=channel:<channelId> presentation={"blocks":[{"type":"buttons","buttons":[{"label":"Да","value":"yes"},{"label":"Нет","value":"no"}]}]}Поля кнопок представления:
labelstringrequiredОтображаемая подпись (псевдоним: text).
valuestringЗначение, возвращаемое при нажатии и используемое как идентификатор действия (псевдонимы: callback_data, callbackData). Обязательно для нажимаемой кнопки, если не задано url.
urlstringКнопка-ссылка; отображается как текст label: url в теле сообщения, а не как интерактивная кнопка.
style"primary" | "secondary" | "success" | "danger"Стиль кнопки. Для неподдерживаемых значений Mattermost применяет оформление по умолчанию.
Чтобы указать поддержку кнопок в системном промпте агента, добавьте inlineButtons в возможности канала:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}Когда пользователь нажимает кнопку:
Проверка доступа
Пользователь, нажавший кнопку, должен пройти те же проверки политик личных и групповых переписок, что и отправитель сообщения; при неавторизованных нажатиях показывается временное уведомление, а сами нажатия игнорируются.
Замена кнопок подтверждением
Все кнопки заменяются строкой подтверждения (например, «✓ Да — выбор пользователя @user»).
Агент получает выбранное значение
Агент получает выбранное значение как входящее сообщение (а также системное событие) и отвечает.
Примечания о реализации
- Обратные вызовы кнопок проверяются с помощью HMAC-SHA256 (автоматически, настройка не требуется).
- При нажатии заменяется весь блок вложения, поэтому все кнопки удаляются одновременно — частичное удаление невозможно.
- Идентификаторы действий, содержащие дефисы или символы подчёркивания, автоматически очищаются (ограничение маршрутизации Mattermost).
- Нажатия, у которых
action_idне соответствует действию в исходной публикации, отклоняются с ошибкой403(«Неизвестное действие»).
Конфигурация и доступность
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-адресов для обратных вызовов кнопок. Если он не задан, принимаются только локальные источники (127.0.0.1,::1), поэтому удалённый сервер Mattermost необходимо добавить в этот список, иначе его нажатия будут отклонены с ошибкой403. При работе через обратный прокси также задайтеgateway.trustedProxies, чтобы реальный IP-адрес клиента определялся по перенаправленным заголовкам.- Если адрес обратного вызова является частным, внутренним или находится в tailnet, добавьте его хост или домен в
ServiceSettings.AllowedUntrustedInternalConnectionsMattermost.
Прямая интеграция с API (внешние скрипты)
Внешние скрипты и вебхуки могут публиковать кнопки напрямую через REST API Mattermost вместо использования инструмента агента message. Предпочтительно использовать инструмент message OpenClaw. Для прямых интеграций импортируйте buildButtonAttachments из @openclaw/mattermost/api.js; при публикации необработанного JSON соблюдайте следующие правила:
Структура полезной нагрузки:
{ channel_id: "<channelId>", message: "Выберите вариант:", props: { attachments: [ { actions: [ { id: "mybutton01", // только буквы и цифры — см. ниже type: "button", // обязательно, иначе нажатия молча игнорируются name: "Одобрить", // отображаемая подпись style: "primary", // необязательно: "default", "primary", "danger" integration: { url: "https://gateway.example.com/mattermost/interactions/default", context: { action_id: "mybutton01", // должен соответствовать идентификатору кнопки action: "approve", // ... любые пользовательские поля ... _token: "<hmac>", // см. раздел о HMAC ниже }, }, }, ], }, ], },}Генерация токена 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
- Python
json.dumpsпо умолчанию добавляет пробелы ({"key": "val"}). Используйтеseparators=(",", ":"), чтобы результат соответствовал компактному выводу JavaScript ({"key":"val"}). - Всегда подписывайте все поля контекста (кроме
_token). Gateway удаляет_token, а затем подписывает все оставшиеся поля. Подписание только части полей приводит к сбою проверки без сообщения об ошибке. - Используйте
sort_keys=True: Gateway сортирует ключи перед подписанием, а Mattermost может изменить порядок полей контекста при сохранении полезной нагрузки. - Получайте секрет из токена бота детерминированным способом, а не генерируйте случайные байты. Секрет должен совпадать в процессе, который создает кнопки, и в Gateway, выполняющем проверку.
Адаптер каталога
Плагин Mattermost включает адаптер каталога, который разрешает имена каналов и пользователей через API Mattermost. Это позволяет использовать цели #channel-name и @username в openclaw message send, а также при доставке через Cron и Webhook.
Настройка не требуется: адаптер использует токен бота из конфигурации учетной записи.
Несколько учетных записей
Mattermost поддерживает несколько учетных записей в channels.mattermost.accounts:
{ channels: { mattermost: { accounts: { default: { name: "Primary", botToken: "mm-token", baseUrl: "https://chat.example.com" }, alerts: { name: "Alerts", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, }, }, },}Значения учетной записи переопределяют поля верхнего уровня; channels.mattermost.defaultAccount определяет, какая учетная запись используется, если она не указана.
Устранение неполадок
Нет ответов в каналах
Убедитесь, что бот добавлен в канал, и упомяните его (oncall), используйте префикс-триггер (onchar) либо задайте chatmode: "onmessage".
Ошибки аутентификации или нескольких учетных записей
- Проверьте токен бота, базовый URL и то, включена ли учетная запись.
- Проблемы с несколькими учетными записями: переменные среды применяются только к учетной записи
default. - Для частных или локальных хостов 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не указан, а в журналах выводится предупреждение, что для обратного вызова определен loopback-URL, напримерhttp://localhost:18789/..., этот URL, вероятно, доступен только в том случае, если 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.
Связанные материалы
- Маршрутизация каналов — маршрутизация сеансов для сообщений
- Обзор каналов — все поддерживаемые каналы
- Группы — поведение групповых чатов и фильтрация по упоминанию
- Сопряжение — аутентификация в личных сообщениях и процесс сопряжения
- Безопасность — модель доступа и усиление защиты