Appearance
WhatsApp(Web 渠道)
状态:通过 WhatsApp Web(Baileys)实现,已生产就绪。Gateway 独占管理已关联的会话。
安装
- 首次通过
openclaw onboard或openclaw channels add --channel whatsapp选择该渠道时,会提示安装 WhatsApp 插件。 openclaw channels login --channel whatsapp在插件未安装时也会提供安装流程。- 开发渠道 + git checkout:默认使用本地插件路径。
- Stable/Beta:默认使用 npm 包
@openclaw/whatsapp。
手动安装也同样支持:
bash
openclaw plugins install @openclaw/whatsapp快速配置
第一步:配置 WhatsApp 访问策略
json5
{
channels: {
whatsapp: {
dmPolicy: "pairing",
allowFrom: ["+15551234567"],
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
},
},
}第二步:扫码关联 WhatsApp
bash
openclaw channels login --channel whatsapp指定账号:
bash
openclaw channels login --channel whatsapp --account work第三步:启动 Gateway
bash
openclaw gateway第四步:批准首个配对请求(如使用 pairing 模式)
bash
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>配对请求有效期 1 小时,每个渠道最多同时存在 3 个待处理请求。
OpenClaw 建议在可能时使用独立号码运行 WhatsApp。(渠道元数据和配置流程针对该模式优化,但个人号码也支持。)
部署模式
独立号码(推荐): 这是最简洁的运营模式——OpenClaw 有独立的 WhatsApp 身份,私信白名单和路由边界更清晰,减少自发消息混淆。
json5
{
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551234567"],
},
},
}个人号码回退: 引导配置支持个人号码模式,生成友好的基础配置:
dmPolicy: "allowlist"allowFrom包含你的个人号码selfChatMode: true
运行时自我聊天保护基于已关联的自身号码和 allowFrom。
运行时模型
- Gateway 独占 WhatsApp socket 和重连循环。
- 出站发送需要目标账号有活跃的 WhatsApp 监听器。
- 状态和广播聊天被忽略(
@status、@broadcast)。 - 私信使用私信会话规则(
session.dmScope;默认main将私信折叠到 Agent 主会话)。 - 群组会话独立隔离(
agent:<agentId>:whatsapp:group:<jid>)。
访问控制与激活
私信策略
channels.whatsapp.dmPolicy 控制私信访问:
pairing(默认)allowlistopen(allowFrom需包含"*")disabled
allowFrom 接受 E.164 格式号码(内部标准化处理)。
多账号覆盖:channels.whatsapp.accounts.<id>.dmPolicy(和 allowFrom)优先于该账号的渠道级默认值。
运行时行为细节:
- 配对记录在渠道允许存储中持久化,并与配置的
allowFrom合并 - 如未配置白名单,已关联的自身号码默认被允许
fromMe出站私信不会自动配对
群组策略与白名单
群组访问有两个层次:
群组成员白名单(
channels.whatsapp.groups)- 省略
groups时所有群组均可使用 - 存在
groups时作为群组白名单(允许"*")
- 省略
群组发送方策略(
channels.whatsapp.groupPolicy+groupAllowFrom)open:绕过发送方白名单allowlist:发送方须匹配groupAllowFrom(或*)disabled:屏蔽所有群组入站
发送方白名单回退:未设置 groupAllowFrom 时回退到 allowFrom(如可用)。
注意:如果完全没有 channels.whatsapp 块,运行时群组策略回退为 allowlist(并记录警告),即使设置了 channels.defaults.groupPolicy。
提及与激活命令
群组回复默认需要提及。提及检测包括:
- 显式 WhatsApp 提及机器人身份
- 配置的提及正则模式(
agents.list[].groupChat.mentionPatterns,回退messages.groupChat.mentionPatterns) - 隐式回复机器人检测(回复发送方与机器人身份匹配)
安全说明:引用/回复仅满足提及门控,不授予发送方授权。在 groupPolicy: "allowlist" 下,即使非白名单发送方回复了白名单用户的消息,仍会被拦截。
会话级激活命令:
/activation mention/activation always
activation 只更新会话状态(不是全局配置),且受 Owner 门控。
个人号码与自我聊天行为
当已关联的自身号码也出现在 allowFrom 中时,WhatsApp 自我聊天保护激活:
- 跳过自我聊天轮次的已读回执
- 忽略可能触发自我提及的提及 JID 自动触发行为
- 如果
messages.responsePrefix未设置,自我聊天回复默认使用[{identity.name}]或[openclaw]
消息规范化与上下文
入站信封与引用上下文: 入站 WhatsApp 消息包裹在共享入站信封中。如果存在引用回复,上下文以以下格式附加:
text
[Replying to <sender> id:<stanzaId>]
<quoted body or media placeholder>
[/Replying]媒体占位符: 仅媒体的入站消息使用以下占位符:
<media:image><media:video><media:audio><media:document><media:sticker>
位置和联系人负载在路由前规范化为文本上下文。
群组历史注入: 对于群组,未处理的消息可以缓冲并在机器人被触发时作为上下文注入:
- 默认限制:
50 - 配置:
channels.whatsapp.historyLimit - 回退:
messages.groupChat.historyLimit 0禁用
已读回执: 对已接受的入站 WhatsApp 消息默认启用已读回执。
禁用:
json5
{
channels: {
whatsapp: {
sendReadReceipts: false,
},
},
}自我聊天轮次即使全局启用也会跳过已读回执。
投递、分块与媒体
文本分块:
- 默认分块限制:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"newline模式优先按段落边界(空行)分割,超长再按长度分割
出站媒体:
- 支持图片、视频、音频(PTT 语音消息)和文档负载
audio/ogg重写为audio/ogg; codecs=opus以兼容语音消息- 通过
gifPlayback: true支持 GIF 动画播放 - 发送多媒体回复负载时,字幕应用于第一个媒体项
- 媒体来源可以是 HTTP(S)、
file://或本地路径
媒体大小限制与回退:
- 入站媒体保存上限:
channels.whatsapp.mediaMaxMb(默认50) - 图片自动优化(调整大小/质量)以符合限制
- 媒体发送失败时,第一项回退为文本警告而非静默丢弃回复
确认反应(Ack Reaction)
WhatsApp 支持在接收入站消息时立即通过 channels.whatsapp.ackReaction 发送确认反应。
json5
{
channels: {
whatsapp: {
ackReaction: {
emoji: "👀",
direct: true,
group: "mentions", // always | mentions | never
},
},
},
}行为说明:
- 在接受入站消息后立即发送(回复前)
- 失败会记录日志但不阻断正常回复投递
- 群组模式
mentions在提及触发的轮次中反应;群组激活always会绕过此检查 - WhatsApp 使用
channels.whatsapp.ackReaction(旧版messages.ackReaction在此不适用)
多账号与凭证
- 账号 ID 来自
channels.whatsapp.accounts - 默认账号选择:存在
default时优先使用,否则取第一个已配置的账号 ID(排序后) - 当前认证路径:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json openclaw channels logout --channel whatsapp [--account <id>]清除该账号的 WhatsApp 认证状态
工具、动作与配置写入
- Agent 工具支持包括 WhatsApp 反应动作(
react)。 - 动作开关:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- 渠道发起的配置写入默认启用(通过
channels.whatsapp.configWrites=false禁用)。
故障排查
未关联(需要扫码):
bash
openclaw channels login --channel whatsapp
openclaw channels status已关联但断连/重连循环:
bash
openclaw doctor
openclaw logs --follow如需要,使用 channels login 重新关联。
发送时无活跃监听器: 确保 Gateway 正在运行且账号已关联。
群组消息意外被忽略: 按以下顺序检查:
groupPolicygroupAllowFrom/allowFromgroups白名单条目- 提及门控(
requireMention+ 提及模式) openclaw.json中的重复键(JSON5):后面的条目覆盖前面的,每个作用域只保留一个groupPolicy
Bun 运行时警告: WhatsApp Gateway 运行时应使用 Node。Bun 被标记为不兼容,不适用于稳定的 WhatsApp/Telegram Gateway 运营。