Zalo
状态:实验性。直接消息和群组聊天均已实现。下方的功能表格反映了在 Zalo Bot Creator / Marketplace 机器人上已验证的行为。
捆绑插件¶
Zalo 在当前 OpenClaw 发行版中作为捆绑插件提供,因此打包构建无需单独安装。
在较旧的构建版本或不包含 Zalo 的自定义安装中,请直接安装 npm 包:
- 安装:
openclaw plugins install @openclaw/zalo - 固定版本:
openclaw plugins install @openclaw/zalo@<version>(仅用于可重现安装时固定版本) - 从本地代码库安装:
openclaw plugins install ./path/to/local/zalo-plugin - 详情:插件
快速设置¶
- 在 https://bot.zaloplatforms.com 创建机器人令牌(登录、创建机器人、配置设置)。令牌格式为
numeric_id:secret。对于 Marketplace 机器人,可用的运行时令牌可能出现在机器人的欢迎消息中。 - 设置令牌,可以设置为环境变量
ZALO_BOT_TOKEN=...(仅限默认账户)或在配置中设置。 - 运行
openclaw channels status --probe进行检查;如果 Gateway 离线,请启动它。配置更改遵循热重载。如果你更改了服务环境,请重启 Gateway 以加载更改。 - 在首次 DM 联系时批准配对码(默认 DM 策略为 pairing)。
最小配置:
{
channels: {
zalo: {
enabled: true,
accounts: {
default: {
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
},
},
}
多账户:在 channels.zalo.accounts.<id> 下添加更多条目,每个条目拥有自己的 botToken/name。channels.zalo.botToken(扁平结构,不含 accounts)是旧版单账户简写。新配置建议使用 accounts.<id>.*。
这是什么¶
Zalo 是一款面向越南市场的消息应用。其 Bot API 允许 Gateway 为 1:1 对话和群组聊天运行机器人。回传至 Zalo 的路由是确定性的。模型永远不会选择渠道。
本页面介绍 Zalo Bot Creator / Marketplace 机器人。Zalo 官方账号(OA)机器人是另一种产品形态,行为可能有所不同。本页面不涵盖它们。
工作原理¶
- 入站消息会被规范化为带有媒体占位符的共享渠道信封。
- 回复始终路由回同一个 Zalo 聊天。不使用引用回复(
replyToMode固定为关闭)。 - 默认使用长轮询(
getUpdates)。可通过channels.zalo.webhookUrl使用 Webhook 模式。 - 群组需要 @提及 才能触发机器人。此行为无法按渠道配置。
限制¶
| 限制 | 值 |
|---|---|
| 出站文本块大小 | 2000 个字符(Zalo API 限制) |
| 媒体大小(入站/出站) | channels.zalo.mediaMaxMb,默认 5 MB |
| Webhook 请求体 | 1 MB,30 秒读取超时 |
| Webhook 速率限制 | 每个路径+客户端 IP 120 次请求 / 60 秒,之后返回 HTTP 429 |
| Webhook 重放墓碑记录 | 30 天,每个账户最多 20,000 个已完成事件(以消息 ID 为键) |
访问控制¶
直接消息¶
channels.zalo.dmPolicy:pairing(默认)|allowlist|open|disabled。- 配对:未知发送者会获得配对码。消息在获得批准前会被忽略。配对码 1 小时后过期。
openclaw pairing list zaloopenclaw pairing approve zalo <CODE>- 详情:配对
channels.zalo.allowFrom接受数字形式的 Zalo 用户 ID(不支持用户名查找)。open需要"*"。
群组¶
群组聊天受插件支持(chatTypes: ["direct", "group"]),并通过提及和群组策略进行控制:
channels.zalo.groupPolicy:open|allowlist|disabled。channels.zalo.groupAllowFrom限制哪些发送者 ID 可以在群组中触发机器人。未设置时回退到allowFrom。- 默认解析规则:当配置了
channels.zalo时,未设置的groupPolicy解析为open。当channels.zalo完全缺失时,运行时以失败关闭(fail closed)的方式回退到allowlist。 - 实际使用中报告的注意事项:在某些 Marketplace 机器人配置中,机器人根本无法被添加到群组。如果遇到这种情况,请通过你的机器人的 Zalo Bot 平台设置进行确认。这是平台侧的限制,而非 OpenClaw 策略。
长轮询与 Webhook¶
- 默认:长轮询(无需公网 URL)。
- Webhook 模式:设置
channels.zalo.webhookUrl和channels.zalo.webhookSecret。 - Webhook URL 必须使用 HTTPS。
- Webhook 密钥长度必须为 8-256 个字符。
- Zalo 通过
X-Bot-Api-Secret-Token标头发送事件,并使用恒定时间比较进行校验。 - Gateway HTTP 在
channels.zalo.webhookPath处处理 Webhook 请求(默认为 Webhook URL 的路径)。 - 请求必须使用
Content-Type: application/json(或+json媒体类型)。 - OpenClaw 仅在持久化存储原始事件后才返回 HTTP 200。存储失败时返回 HTTP 500。持久化的
200响应携带x-openclaw-delivery-accepted: durable标头。反向代理可以要求该标头,以区分 OpenClaw 的接受与普通的200响应。身份验证、验证和存储错误的响应不包含该标头。 - 根据 Zalo API 文档,getUpdates 轮询和 Webhook 是互斥的。
支持的消息类型¶
- 文本:完全支持,按 2000 个字符分块。
- 媒体:入站/出站,受
mediaMaxMb限制。 - 照片说明:截断以符合 2000 字符限制,包括轮询回复。
- 表情回应、话题、投票、原生命令:插件不支持。
- 流式传输:插件声明了分块流式传输能力。与某些其他区域渠道不同,Zalo 没有专门的出站队列/文本合并调优参数。如果这对你的用例很重要,请在你的环境中验证当前行为。
功能¶
| 功能 | 状态 |
|---|---|
| 直接消息 | 支持 |
| 群组 | 支持(需提及) |
| 媒体(入站/出站) | 支持,受 mediaMaxMb 限制 |
| 表情回应 | 不支持 |
| 话题 | 不支持 |
| 投票 | 不支持 |
| 原生命令 | 不支持 |
| 回复/引用 | 未使用(固定关闭) |
投递目标(CLI/cron)¶
使用聊天 ID 作为目标:
故障排除¶
机器人无响应:
- 检查 token:
openclaw channels status --probe - 验证发送者已获批准(配对或
allowFrom) - 检查网关日志:
openclaw logs --follow
Webhook 未接收事件:
- 确认 Webhook URL 使用 HTTPS
- 确认密钥为 8-256 个字符
- 确认网关 HTTP 端点在配置的路径上可访问
- 确认 getUpdates 轮询未同时运行(二者互斥)
- 请求突发可能返回 HTTP 429(每个路径+IP 为 120 次请求 / 60 秒)。退避并重试
配置参考¶
完整配置:配置
| 设置 | 描述 | 默认值 |
|---|---|---|
channels.zalo.enabled |
启用/禁用频道启动 | true |
channels.zalo.accounts.<id>.botToken |
Zalo Bot Platform 的机器人 token | - |
channels.zalo.accounts.<id>.tokenFile |
从文件读取 token(拒绝符号链接) | - |
channels.zalo.accounts.<id>.name |
显示名称 | - |
channels.zalo.accounts.<id>.enabled |
启用/禁用此账户 | true |
channels.zalo.accounts.<id>.dmPolicy |
每账户 DM 策略 | pairing |
channels.zalo.accounts.<id>.allowFrom |
DM 允许列表(用户 ID) | - |
channels.zalo.accounts.<id>.groupPolicy |
每账户群组策略 | 参见 群组 |
channels.zalo.accounts.<id>.groupAllowFrom |
群组发送者允许列表;回退到 allowFrom |
- |
channels.zalo.accounts.<id>.mediaMaxMb |
入站/出站媒体上限(MB) | 5 |
channels.zalo.accounts.<id>.webhookUrl |
启用 Webhook 模式(需要 HTTPS) | - |
channels.zalo.accounts.<id>.webhookSecret |
Webhook 密钥(8-256 个字符) | - |
channels.zalo.accounts.<id>.webhookPath |
网关 HTTP 服务器上的 Webhook 路径 | webhook URL 路径 |
channels.zalo.accounts.<id>.proxy |
API 请求的代理 URL | - |
channels.zalo.accounts.<id>.responsePrefix |
出站响应前缀覆盖 | - |
channels.zalo.defaultAccount |
配置多个账户时的默认账户 | default |
channels.zalo.botToken、channels.zalo.dmPolicy 以及其他扁平顶层键是上述字段的旧版单账户简写。两种形式均受支持。
环境变量选项:ZALO_BOT_TOKEN=... 仅解析默认账户的 token。
相关¶
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw