diff --git a/docs/zh-CN/channels/mattermost.md b/docs/zh-CN/channels/mattermost.md
index 0ca6f8509..d3debd6b3 100644
--- a/docs/zh-CN/channels/mattermost.md
+++ b/docs/zh-CN/channels/mattermost.md
@@ -6,23 +6,23 @@ sidebarTitle: Mattermost
summary: Mattermost 机器人设置和 OpenClaw 配置
title: Mattermost
x-i18n:
- generated_at: "2026-04-29T05:38:06Z"
+ generated_at: "2026-05-01T15:14:23Z"
model: gpt-5.5
provider: openai
- source_hash: 1926a1d7347ff35ed60f8d5c3e0b26a064863ada213ad0e171776af5a84d8475
+ source_hash: 0e83d7d4a1b60822f5efdb004fb28e26764b7cd70b3c78296b882d38d51241ae
source_path: channels/mattermost.md
workflow: 16
---
-Status: 内置插件(bot token + WebSocket 事件)。支持渠道、组和私信。Mattermost 是一个可自托管的团队消息平台;产品详情和下载请查看官方网站 [mattermost.com](https://mattermost.com)。
+Status:内置插件(Bot 令牌 + WebSocket 事件)。支持渠道、群组和私信。Mattermost 是一个可自托管的团队消息平台;产品详情和下载请参见官方网站 [mattermost.com](https://mattermost.com)。
## 内置插件
-Mattermost 在当前 OpenClaw 版本中作为内置插件提供,因此正常的打包构建不需要单独安装。
+Mattermost 在当前 OpenClaw 版本中作为内置插件随附,因此普通打包构建不需要单独安装。
-如果你使用的是较旧构建,或排除了 Mattermost 的自定义安装,请在发布后安装当前 npm 包:
+如果你使用的是较旧构建,或排除了 Mattermost 的自定义安装,请在 npm 包发布后安装当前版本:
@@ -30,15 +30,16 @@ Mattermost 在当前 OpenClaw 版本中作为内置插件提供,因此正常
openclaw plugins install @openclaw/mattermost
```
-
+
```bash
openclaw plugins install ./path/to/local/mattermost-plugin
```
-如果 npm 报告 OpenClaw 拥有的包已弃用,请使用当前打包的
-OpenClaw 构建,或在较新的 npm 包发布前使用本地检出路径。
+如果 npm 报告 OpenClaw 拥有的软件包已弃用,请使用当前打包的
+OpenClaw 构建或本地检出路径,直到更新的 npm 包
+发布。
详情:[插件](/zh-CN/tools/plugin)
@@ -46,10 +47,10 @@ OpenClaw 构建,或在较新的 npm 包发布前使用本地检出路径。
- 当前打包的 OpenClaw 版本已内置它。较旧/自定义安装可以使用上面的命令手动添加。
+ 当前打包的 OpenClaw 版本已经内置该插件。较旧/自定义安装可以使用上面的命令手动添加。
-
- 创建一个 Mattermost bot 账号并复制 **bot token**。
+
+ 创建一个 Mattermost Bot 账号并复制 **Bot 令牌**。
复制 Mattermost **基础 URL**(例如 `https://chat.example.com`)。
@@ -75,7 +76,7 @@ OpenClaw 构建,或在较新的 npm 包发布前使用本地检出路径。
## 原生斜杠命令
-原生斜杠命令是可选启用的。启用后,OpenClaw 会通过 Mattermost API 注册 `oc_*` 斜杠命令,并在 Gateway 网关 HTTP 服务器上接收回调 POST。
+原生斜杠命令为可选启用。启用后,OpenClaw 会通过 Mattermost API 注册 `oc_*` 斜杠命令,并在 Gateway 网关 HTTP 服务器上接收回调 POST。
```json5
{
@@ -96,24 +97,26 @@ OpenClaw 构建,或在较新的 npm 包发布前使用本地检出路径。
- `native: "auto"` 对 Mattermost 默认禁用。设置 `native: true` 以启用。
- - 如果省略 `callbackUrl`,OpenClaw 会根据 Gateway 网关主机/端口 + `callbackPath` 推导一个。
- - 对于多账号设置,可以在顶层设置 `commands`,也可以在 `channels.mattermost.accounts..commands` 下设置(账号值会覆盖顶层字段)。
- - 命令回调会使用 OpenClaw 注册 `oc_*` 命令时 Mattermost 返回的逐命令 token 进行验证。
- - 当注册失败、启动不完整,或回调 token 与任何已注册命令不匹配时,斜杠回调会安全失败。
+ - 如果省略 `callbackUrl`,OpenClaw 会从 Gateway 网关主机/端口 + `callbackPath` 派生一个。
+ - 对于多账号设置,`commands` 可以设置在顶层,也可以设置在 `channels.mattermost.accounts..commands` 下(账号值会覆盖顶层字段)。
+ - 命令回调会使用 Mattermost 在 OpenClaw 注册 `oc_*` 命令时返回的每命令令牌进行验证。
+ - OpenClaw 会在接受每个回调前刷新当前 Mattermost 命令注册,因此已删除或重新生成的斜杠命令中的过期令牌无需重启 Gateway 网关就会停止被接受。
+ - 如果 Mattermost API 无法确认该命令仍是当前命令,回调验证会失败关闭;失败的验证会短暂缓存,并发查找会合并,并且每个命令的新查找启动会被限速,以限制重放压力。
+ - 当注册失败、启动部分完成,或回调令牌与解析到的命令的已注册令牌不匹配时,斜杠回调会失败关闭(对一个命令有效的令牌不能到达另一个命令的上游验证)。
- 回调端点必须能从 Mattermost 服务器访问。
+ 回调端点必须能被 Mattermost 服务器访问。
- - 不要将 `callbackUrl` 设置为 `localhost`,除非 Mattermost 与 OpenClaw 运行在同一主机/网络命名空间中。
- - 不要将 `callbackUrl` 设置为你的 Mattermost 基础 URL,除非该 URL 会将 `/api/channels/mattermost/command` 反向代理到 OpenClaw。
- - 快速检查方式是 `curl https:///api/channels/mattermost/command`;GET 应该从 OpenClaw 返回 `405 Method Not Allowed`,而不是 `404`。
+ - 除非 Mattermost 与 OpenClaw 运行在同一主机/网络命名空间中,否则不要将 `callbackUrl` 设置为 `localhost`。
+ - 除非你的 Mattermost 基础 URL 将 `/api/channels/mattermost/command` 反向代理到 OpenClaw,否则不要将 `callbackUrl` 设置为你的 Mattermost 基础 URL。
+ - 一个快速检查是 `curl https:///api/channels/mattermost/command`;GET 应从 OpenClaw 返回 `405 Method Not Allowed`,而不是 `404`。
- 如果你的回调目标是私有/tailnet/内部地址,请将 Mattermost `ServiceSettings.AllowedUntrustedInternalConnections` 设置为包含回调主机/域名。
+ 如果你的回调目标是私有/tailnet/内部地址,请设置 Mattermost `ServiceSettings.AllowedUntrustedInternalConnections` 以包含回调主机/域名。
- 使用主机/域名条目,不要使用完整 URL。
+ 使用主机/域名条目,而不是完整 URL。
- 正确:`gateway.tailnet-name.ts.net`
- 错误:`https://gateway.tailnet-name.ts.net`
@@ -123,15 +126,15 @@ OpenClaw 构建,或在较新的 npm 包发布前使用本地检出路径。
## 环境变量(默认账号)
-如果你更喜欢环境变量,请在 Gateway 网关主机上设置这些项:
+如果你更偏好环境变量,请在 Gateway 网关主机上设置这些变量:
- `MATTERMOST_BOT_TOKEN=...`
- `MATTERMOST_URL=https://chat.example.com`
-环境变量只应用于**默认**账号(`default`)。其他账号必须使用配置值。
+环境变量仅适用于**默认**账号(`default`)。其他账号必须使用配置值。
-`MATTERMOST_URL` 不能从工作区 `.env` 设置;请参阅[工作区 `.env` 文件](/zh-CN/gateway/security)。
+`MATTERMOST_URL` 不能从工作区 `.env` 设置;请参见[工作区 `.env` 文件](/zh-CN/gateway/security)。
## 聊天模式
@@ -143,7 +146,7 @@ Mattermost 会自动响应私信。渠道行为由 `chatmode` 控制:
仅在渠道中被 @提及时响应。
- 响应每一条渠道消息。
+ 响应每条渠道消息。
当消息以触发前缀开头时响应。
@@ -166,16 +169,16 @@ Mattermost 会自动响应私信。渠道行为由 `chatmode` 控制:
说明:
- `onchar` 仍会响应显式 @提及。
-- 旧配置仍支持 `channels.mattermost.requireMention`,但首选使用 `chatmode`。
+- 旧版配置会遵循 `channels.mattermost.requireMention`,但首选使用 `chatmode`。
## 线程和会话
-使用 `channels.mattermost.replyToMode` 控制渠道和组回复是留在主渠道,还是在触发帖下开启一个线程。
+使用 `channels.mattermost.replyToMode` 控制渠道和群组回复是留在主渠道中,还是在触发帖子下启动线程。
-- `off`(默认):仅当入站帖子已经在线程中时才在线程里回复。
-- `first`:对于顶层渠道/组帖子,在该帖子下开启一个线程,并将对话路由到线程作用域的会话。
-- `all`:目前在 Mattermost 中与 `first` 行为相同。
-- 私信会忽略此设置,并保持非线程化。
+- `off`(默认):仅当入站帖子已在线程中时,才在线程中回复。
+- `first`:对于顶层渠道/群组帖子,在该帖子下启动线程,并将对话路由到线程范围的会话。
+- `all`:目前对 Mattermost 来说行为与 `first` 相同。
+- 私信会忽略此设置并保持非线程化。
配置示例:
@@ -191,8 +194,8 @@ Mattermost 会自动响应私信。渠道行为由 `chatmode` 控制:
说明:
-- 线程作用域的会话使用触发帖子 ID 作为线程根。
-- `first` 和 `all` 目前等价,因为 Mattermost 一旦有了线程根,后续分块和媒体就会继续留在同一线程中。
+- 线程范围的会话使用触发帖子 ID 作为线程根。
+- `first` 和 `all` 当前等价,因为一旦 Mattermost 有了线程根,后续分块和媒体会继续留在同一线程中。
## 访问控制(私信)
@@ -200,16 +203,16 @@ Mattermost 会自动响应私信。渠道行为由 `chatmode` 控制:
- 通过以下方式批准:
- `openclaw pairing list mattermost`
- `openclaw pairing approve mattermost `
-- 公开私信:`channels.mattermost.dmPolicy="open"` 加 `channels.mattermost.allowFrom=["*"]`。
+- 公开私信:`channels.mattermost.dmPolicy="open"` 加上 `channels.mattermost.allowFrom=["*"]`。
-## 渠道(组)
+## 渠道(群组)
-- 默认:`channels.mattermost.groupPolicy = "allowlist"`(需要提及)。
-- 使用 `channels.mattermost.groupAllowFrom` 允许发送者(推荐使用用户 ID)。
-- 单渠道提及覆盖位于 `channels.mattermost.groups..requireMention` 下,或使用 `channels.mattermost.groups["*"].requireMention` 作为默认值。
+- 默认:`channels.mattermost.groupPolicy = "allowlist"`(受提及门控)。
+- 使用 `channels.mattermost.groupAllowFrom` 允许发送者(建议使用用户 ID)。
+- 每渠道提及覆盖位于 `channels.mattermost.groups..requireMention` 下,或用 `channels.mattermost.groups["*"].requireMention` 作为默认值。
- `@username` 匹配是可变的,并且仅在 `channels.mattermost.dangerouslyAllowNameMatching: true` 时启用。
-- 开放渠道:`channels.mattermost.groupPolicy="open"`(需要提及)。
-- 运行时说明:如果完全缺少 `channels.mattermost`,运行时会回退到 `groupPolicy="allowlist"` 进行组检查(即使设置了 `channels.defaults.groupPolicy`)。
+- 开放渠道:`channels.mattermost.groupPolicy="open"`(受提及门控)。
+- 运行时说明:如果完全缺少 `channels.mattermost`,运行时会回退到 `groupPolicy="allowlist"` 进行群组检查(即使已设置 `channels.defaults.groupPolicy`)。
示例:
@@ -229,16 +232,16 @@ Mattermost 会自动响应私信。渠道行为由 `chatmode` 控制:
## 出站投递目标
-将这些目标格式用于 `openclaw message send` 或 cron/webhooks:
+将这些目标格式与 `openclaw message send` 或 cron/webhook 一起使用:
- `channel:` 表示渠道
- `user:` 表示私信
- `@username` 表示私信(通过 Mattermost API 解析)
-裸不透明 ID(如 `64ifufp...`)在 Mattermost 中是**有歧义的**(用户 ID 与渠道 ID)。
+裸露的不透明 ID(如 `64ifufp...`)在 Mattermost 中是**有歧义的**(用户 ID 与渠道 ID)。
-OpenClaw 会**优先按用户解析**:
+OpenClaw 会按**用户优先**解析:
- 如果该 ID 作为用户存在(`GET /api/v4/users/` 成功),OpenClaw 会通过 `/api/v4/channels/direct` 解析直接渠道并发送**私信**。
- 否则,该 ID 会被视为**渠道 ID**。
@@ -248,9 +251,9 @@ OpenClaw 会**优先按用户解析**:
## 私信渠道重试
-当 OpenClaw 发送到 Mattermost 私信目标且需要先解析直接渠道时,默认会重试瞬时的直接渠道创建失败。
+当 OpenClaw 发送到 Mattermost 私信目标并需要先解析直接渠道时,它默认会重试瞬时的直接渠道创建失败。
-使用 `channels.mattermost.dmChannelRetry` 为 Mattermost 插件全局调优该行为,或使用 `channels.mattermost.accounts..dmChannelRetry` 为单个账号调优。
+使用 `channels.mattermost.dmChannelRetry` 为 Mattermost 插件全局调整该行为,或使用 `channels.mattermost.accounts..dmChannelRetry` 为单个账号调整。
```json5
{
@@ -269,13 +272,13 @@ OpenClaw 会**优先按用户解析**:
说明:
-- 这仅应用于私信渠道创建(`/api/v4/channels/direct`),不是每一次 Mattermost API 调用。
-- 重试适用于瞬时失败,例如速率限制、5xx 响应,以及网络或超时错误。
+- 这仅适用于私信渠道创建(`/api/v4/channels/direct`),不适用于每个 Mattermost API 调用。
+- 重试适用于瞬时故障,例如速率限制、5xx 响应,以及网络或超时错误。
- 除 `429` 之外的 4xx 客户端错误会被视为永久错误,不会重试。
## 预览流式传输
-Mattermost 会将思考、工具活动和部分回复文本流式传输到单个**草稿预览帖子**中,并在最终答案可安全发送时原地完成。预览会更新同一个帖子 ID,而不是用逐分块消息刷屏渠道。媒体/错误最终消息会取消待处理的预览编辑,并使用正常投递,而不是刷新一个一次性预览帖子。
+Mattermost 会将思考、工具活动和部分回复文本流式传输到单个**草稿预览帖子**中,并在最终答案可以安全发送时就地最终确定。预览会在同一个帖子 ID 上更新,而不是用逐块消息刷屏渠道。媒体/错误最终结果会取消待处理的预览编辑,并使用正常投递,而不是刷新一个一次性预览帖子。
通过 `channels.mattermost.streaming` 启用:
@@ -291,27 +294,27 @@ Mattermost 会将思考、工具活动和部分回复文本流式传输到单个
- - `partial` 是常用选择:一个预览帖子会随着回复增长而被编辑,然后用完整答案完成。
- - `block` 在预览帖子中使用追加式草稿分块。
- - `progress` 在生成期间显示 Status 预览,并仅在完成时发布最终答案。
+ - `partial` 是通常选择:一个预览帖子会随着回复增长而编辑,然后用完整答案最终确定。
+ - `block` 在预览帖子中使用追加样式的草稿分块。
+ - `progress` 在生成期间显示状态预览,并且只在完成时发布最终答案。
- `off` 禁用预览流式传输。
- - 如果流无法原地完成(例如帖子在流式传输中途被删除),OpenClaw 会回退为发送一个新的最终帖子,确保回复不会丢失。
- - 仅推理 payload 会从渠道帖子中抑制,包括以 `> Reasoning:` 引用块形式到达的文本。设置 `/reasoning on` 可在其他界面中查看思考;Mattermost 最终帖子只保留答案。
- - 请参阅[流式传输](/zh-CN/concepts/streaming#preview-streaming-modes)了解渠道映射矩阵。
+ - 如果流无法就地最终确定(例如帖子在流式传输中途被删除),OpenClaw 会回退为发送新的最终帖子,确保回复不会丢失。
+ - 仅推理负载会从渠道帖子中抑制,包括作为 `> Reasoning:` 引用块到达的文本。设置 `/reasoning on` 可在其他表面查看思考;Mattermost 最终帖子只保留答案。
+ - 请参见[流式传输](/zh-CN/concepts/streaming#preview-streaming-modes)了解渠道映射矩阵。
-## 表情反应(消息工具)
+## 反应(消息工具)
- 使用 `message action=react` 并设置 `channel=mattermost`。
- `messageId` 是 Mattermost 帖子 ID。
-- `emoji` 接受类似 `thumbsup` 或 `:+1:` 的名称(冒号可选)。
-- 设置 `remove=true`(布尔值)以移除表情反应。
-- 表情反应添加/移除事件会作为系统事件转发到路由的智能体会话。
+- `emoji` 接受 `thumbsup` 或 `:+1:` 这样的名称(冒号可选)。
+- 设置 `remove=true`(布尔值)以移除反应。
+- 反应添加/移除事件会作为系统事件转发到路由的智能体会话。
示例:
@@ -322,14 +325,14 @@ message action=react channel=mattermost target=channel: messageId=.actions.reactions`。
+- `channels.mattermost.actions.reactions`:启用/禁用反应操作(默认 true)。
+- 每账号覆盖:`channels.mattermost.accounts..actions.reactions`。
## 交互式按钮(消息工具)
-发送带可点击按钮的消息。当用户点击按钮时,智能体会收到选择并可以响应。
+发送带有可点击按钮的消息。当用户点击按钮时,智能体会收到选择并可以响应。
-通过向渠道能力添加 `inlineButtons` 来启用按钮:
+通过将 `inlineButtons` 添加到渠道能力来启用按钮:
```json5
{
@@ -353,7 +356,7 @@ message action=send channel=mattermost target=channel: buttons=[[{"te
显示标签。
- 点击后发回的值(用作操作 ID)。
+ 点击时回传的值(用作操作 ID)。
按钮样式。
@@ -362,27 +365,27 @@ message action=send channel=mattermost target=channel: buttons=[[{"te
当用户点击按钮时:
-
- 所有按钮都会被替换为一行确认内容(例如:“✓ **是** 已由 @user 选择”)。
+
+ 所有按钮都会被替换为一行确认文本(例如,“✓ **Yes** selected by @user”)。
-
- 智能体会将该选择作为传入消息接收并响应。
+
+ 智能体会将该选择作为入站消息接收并作出响应。
-
+
- 按钮回调使用 HMAC-SHA256 验证(自动完成,无需配置)。
- - Mattermost 会从其 API 响应中移除回调数据(安全功能),因此点击后会移除所有按钮 — 无法部分移除。
- - 包含连字符或下划线的操作 ID 会被自动清理(Mattermost 路由限制)。
+ - Mattermost 会从其 API 响应中剥离回调数据(安全功能),因此点击后所有按钮都会被移除,无法部分移除。
+ - 包含连字符或下划线的操作 ID 会自动清理(Mattermost 路由限制)。
-
- - `channels.mattermost.capabilities`:能力字符串数组。添加 `"inlineButtons"` 可在智能体系统提示中启用按钮工具描述。
- - `channels.mattermost.interactions.callbackBaseUrl`:可选的外部基础 URL,用于按钮回调(例如 `https://gateway.example.com`)。当 Mattermost 无法直接通过 Gateway 网关的绑定主机访问它时,请使用此项。
+
+ - `channels.mattermost.capabilities`:能力字符串数组。添加 `"inlineButtons"` 可在智能体系统提示词中启用按钮工具描述。
+ - `channels.mattermost.interactions.callbackBaseUrl`:可选的外部基础 URL,用于按钮回调(例如 `https://gateway.example.com`)。当 Mattermost 无法直接通过 Gateway 网关的绑定主机访问它时使用此项。
- 在多账号设置中,你也可以在 `channels.mattermost.accounts..interactions.callbackBaseUrl` 下设置同一字段。
- - 如果省略 `interactions.callbackBaseUrl`,OpenClaw 会从 `gateway.customBindHost` + `gateway.port` 推导回调 URL,然后回退到 `http://localhost:`。
- - 可达性规则:按钮回调 URL 必须能从 Mattermost 服务器访问。只有当 Mattermost 和 OpenClaw 在同一主机/网络命名空间运行时,`localhost` 才有效。
+ - 如果省略 `interactions.callbackBaseUrl`,OpenClaw 会从 `gateway.customBindHost` + `gateway.port` 派生回调 URL,然后回退到 `http://localhost:`。
+ - 可达性规则:按钮回调 URL 必须能从 Mattermost 服务器访问。只有当 Mattermost 和 OpenClaw 在同一主机/网络命名空间上运行时,`localhost` 才有效。
- 如果你的回调目标是私有/tailnet/内部地址,请将其主机/域名添加到 Mattermost `ServiceSettings.AllowedUntrustedInternalConnections`。
@@ -390,7 +393,7 @@ message action=send channel=mattermost target=channel: buttons=[[{"te
### 直接 API 集成(外部脚本)
-外部脚本和 webhook 可以通过 Mattermost REST API 直接发布按钮,而不是通过智能体的 `message` 工具。尽可能使用插件中的 `buildButtonAttachments()`;如果发布原始 JSON,请遵循以下规则:
+外部脚本和 webhook 可以通过 Mattermost REST API 直接发布按钮,而不是经过智能体的 `message` 工具。可行时使用插件中的 `buildButtonAttachments()`;如果发布原始 JSON,请遵循以下规则:
**载荷结构:**
@@ -427,12 +430,12 @@ message action=send channel=mattermost target=channel: buttons=[[{"te
**关键规则**
-1. 附件放在 `props.attachments` 中,而不是顶层 `attachments`(会被静默忽略)。
-2. 每个操作都需要 `type: "button"` — 没有它,点击会被静默吞掉。
-3. 每个操作都需要 `id` 字段 — Mattermost 会忽略没有 ID 的操作。
-4. 操作 `id` 必须**仅包含字母数字字符**(`[a-zA-Z0-9]`)。连字符和下划线会破坏 Mattermost 的服务端操作路由(返回 404)。使用前请移除它们。
-5. `context.action_id` 必须与按钮的 `id` 匹配,这样确认消息会显示按钮名称(例如 “Approve”),而不是原始 ID。
-6. `context.action_id` 是必需的 — 缺少它时交互处理器会返回 400。
+1. 附件应放在 `props.attachments` 中,而不是顶层 `attachments`(否则会被静默忽略)。
+2. 每个操作都需要 `type: "button"`,否则点击会被静默吞掉。
+3. 每个操作都需要 `id` 字段,Mattermost 会忽略没有 ID 的操作。
+4. 操作 `id` 必须**仅包含字母数字字符**(`[a-zA-Z0-9]`)。连字符和下划线会破坏 Mattermost 的服务器端操作路由(返回 404)。使用前请移除它们。
+5. `context.action_id` 必须与按钮的 `id` 匹配,这样确认消息才会显示按钮名称(例如,“Approve”),而不是原始 ID。
+6. `context.action_id` 是必需的,缺少它时交互处理程序会返回 400。
@@ -441,19 +444,19 @@ message action=send channel=mattermost target=channel: buttons=[[{"te
Gateway 网关使用 HMAC-SHA256 验证按钮点击。外部脚本必须生成与 Gateway 网关验证逻辑匹配的令牌:
-
+
`HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken)`
-
+
构建包含除 `_token` 之外所有字段的上下文对象。
-
- 使用**排序键**并且**不包含空格**进行序列化(Gateway 网关使用带排序键的 `JSON.stringify`,会产生紧凑输出)。
+
+ 使用**排序后的键**并且**不包含空格**进行序列化(Gateway 网关使用带排序键的 `JSON.stringify`,会生成紧凑输出)。
-
+
`HMAC-SHA256(key=secret, data=serializedContext)`
-
+
将生成的十六进制摘要作为 `_token` 添加到上下文中。
@@ -476,20 +479,20 @@ context = {**ctx, "_token": token}
```
-
+
- Python 的 `json.dumps` 默认会添加空格(`{"key": "val"}`)。使用 `separators=(",", ":")` 以匹配 JavaScript 的紧凑输出(`{"key":"val"}`)。
- - 始终签名**所有**上下文字段(减去 `_token`)。Gateway 网关会移除 `_token`,然后签名剩余所有内容。只签名子集会导致静默验证失败。
- - 使用 `sort_keys=True` — Gateway 网关在签名前会排序键,并且 Mattermost 在存储载荷时可能会重新排列上下文字段。
- - 从机器人令牌派生密钥(确定性),不要使用随机字节。创建按钮的进程和执行验证的 Gateway 网关必须使用同一个密钥。
+ - 始终签名**所有**上下文字段(去掉 `_token`)。Gateway 网关会剥离 `_token`,然后对剩余所有内容签名。只签名子集会导致静默验证失败。
+ - 使用 `sort_keys=True`,Gateway 网关会在签名前对键排序,Mattermost 在存储载荷时也可能重新排列上下文字段。
+ - 从机器人令牌派生密钥(确定性),不要使用随机字节。创建按钮的进程和执行验证的 Gateway 网关必须使用相同的密钥。
## 目录适配器
-Mattermost 插件包含一个目录适配器,可通过 Mattermost API 解析渠道和用户名。这支持在 `openclaw message send` 以及 cron/webhook 递送中使用 `#channel-name` 和 `@username` 目标。
+Mattermost 插件包含一个目录适配器,可通过 Mattermost API 解析渠道和用户名称。这会在 `openclaw message send` 以及 cron/webhook 投递中启用 `#channel-name` 和 `@username` 目标。
-无需配置 — 该适配器会使用账号配置中的机器人令牌。
+无需配置,适配器会使用账号配置中的机器人令牌。
## 多账号
@@ -511,32 +514,32 @@ Mattermost 支持在 `channels.mattermost.accounts` 下配置多个账号:
## 故障排除
-
- 确保机器人已在渠道中并提及它(oncall),使用触发前缀(onchar),或设置 `chatmode: "onmessage"`。
+
+ 确保机器人位于渠道中并提及它(oncall),使用触发前缀(onchar),或设置 `chatmode: "onmessage"`。
-
- - 检查机器人令牌、基础 URL,以及账号是否已启用。
- - 多账号问题:环境变量只适用于 `default` 账号。
+
+ - 检查机器人令牌、基础 URL,以及该账号是否已启用。
+ - 多账号问题:环境变量只会应用到 `default` 账号。
-
- - `Unauthorized: invalid command token.`:OpenClaw 未接受回调令牌。典型原因:
- - 斜杠命令注册在启动时失败或仅部分完成
+
+ - `Unauthorized: invalid command token.`:OpenClaw 未接受回调令牌。典型原因包括:
+ - slash command 注册失败,或启动时只部分完成
- 回调命中了错误的 Gateway 网关/账号
- Mattermost 仍有旧命令指向先前的回调目标
- - Gateway 网关重启后未重新激活斜杠命令
- - 如果原生斜杠命令停止工作,请检查日志中是否有 `mattermost: failed to register slash commands` 或 `mattermost: native slash commands enabled but no commands could be registered`。
- - 如果省略 `callbackUrl`,且日志警告回调解析为 `http://127.0.0.1:18789/...`,则该 URL 很可能只有在 Mattermost 与 OpenClaw 运行于同一主机/网络命名空间时才可访问。请改为设置一个明确的外部可访问 `commands.callbackUrl`。
+ - Gateway 网关重启后未重新激活 slash command
+ - 如果原生 slash command 停止工作,请检查日志中是否有 `mattermost: failed to register slash commands` 或 `mattermost: native slash commands enabled but no commands could be registered`。
+ - 如果省略 `callbackUrl`,并且日志警告回调解析为 `http://127.0.0.1:18789/...`,那么该 URL 很可能只有在 Mattermost 与 OpenClaw 运行于同一主机/网络命名空间时才可访问。请改为设置一个明确可从外部访问的 `commands.callbackUrl`。
-
- - 按钮显示为白色方框:智能体可能发送了格式错误的按钮数据。请检查每个按钮是否同时包含 `text` 和 `callback_data` 字段。
- - 按钮会渲染但点击无效:确认 Mattermost 服务器配置中的 `AllowedUntrustedInternalConnections` 包含 `127.0.0.1 localhost`,并且 ServiceSettings 中的 `EnablePostActionIntegration` 为 `true`。
- - 点击按钮返回 404:按钮 `id` 很可能包含连字符或下划线。Mattermost 的操作路由器会因非字母数字 ID 而失效。仅使用 `[a-zA-Z0-9]`。
- - Gateway 网关日志显示 `invalid _token`:HMAC 不匹配。检查你是否签名了所有上下文字段(而不是子集)、使用排序键,并使用紧凑 JSON(无空格)。参见上面的 HMAC 部分。
- - Gateway 网关日志显示 `missing _token in context`:按钮上下文中没有 `_token` 字段。确保构建集成载荷时包含它。
- - 确认内容显示原始 ID 而不是按钮名称:`context.action_id` 与按钮的 `id` 不匹配。将两者设置为相同的清理后值。
- - 智能体不知道按钮:将 `capabilities: ["inlineButtons"]` 添加到 Mattermost 渠道配置中。
+
+ - 按钮显示为白色方框:智能体可能发送了格式错误的按钮数据。检查每个按钮是否同时包含 `text` 和 `callback_data` 字段。
+ - 按钮可渲染但点击无反应:验证 Mattermost 服务器配置中的 `AllowedUntrustedInternalConnections` 是否包含 `127.0.0.1 localhost`,并且 ServiceSettings 中的 `EnablePostActionIntegration` 是否为 `true`。
+ - 点击按钮返回 404:按钮 `id` 很可能包含连字符或下划线。Mattermost 的操作路由器在非字母数字 ID 上会失效。仅使用 `[a-zA-Z0-9]`。
+ - Gateway 网关日志显示 `invalid _token`:HMAC 不匹配。检查是否签名了所有上下文字段(不是子集)、使用排序键,并使用紧凑 JSON(无空格)。参见上方 HMAC 部分。
+ - Gateway 网关日志显示 `missing _token in context`:按钮上下文中没有 `_token` 字段。构建集成载荷时请确保包含它。
+ - 确认消息显示原始 ID 而不是按钮名称:`context.action_id` 与按钮的 `id` 不匹配。将两者设置为相同的清理后值。
+ - 智能体不知道按钮:将 `capabilities: ["inlineButtons"]` 添加到 Mattermost 渠道配置。
@@ -546,5 +549,5 @@ Mattermost 支持在 `channels.mattermost.accounts` 下配置多个账号:
- [渠道路由](/zh-CN/channels/channel-routing) — 消息的会话路由
- [渠道概览](/zh-CN/channels) — 所有支持的渠道
- [群组](/zh-CN/channels/groups) — 群聊行为和提及门控
-- [配对](/zh-CN/channels/pairing) — 私信认证和配对流程
+- [配对](/zh-CN/channels/pairing) — 私信身份验证和配对流程
- [安全](/zh-CN/gateway/security) — 访问模型和加固