WhatsApp(Web 渠道)
状态:通过 WhatsApp Web(Baileys)实用的生产环境准备就绪。网关拥有关联会话。快速设置
OpenClaw 推荐在可能的情况下使用独立号码运行 WhatsApp。(渠道元数据和引导流程针对该设置进行了优化,但也支持个人号码设置。)
部署模式
专用号码(推荐)
专用号码(推荐)
这是最清晰的运营模式:
- 为 OpenClaw 提供独立的 WhatsApp 身份
- 更清晰的私信允许列表和路由边界
- 降低自聊混淆的可能性
个人号码应急方案
个人号码应急方案
引导支持个人号码模式,并写入适合自聊的基线:
dmPolicy: "allowlist"allowFrom包含您的个人号码selfChatMode: true
allowFrom。仅限 WhatsApp Web 渠道范围
仅限 WhatsApp Web 渠道范围
当前 OpenClaw 渠道架构中,消息平台渠道基于 WhatsApp Web(
Baileys)。内置聊天渠道注册表中没有独立的 Twilio WhatsApp 消息渠道。运行时模型
- 网关拥有 WhatsApp 套接字和重连循环。
- 出站发送要求目标账户存在活跃的 WhatsApp 监听器。
- 状态和广播聊天被忽略(
@status,@broadcast)。 - 直接聊天使用私信会话规则(
session.dmScope;默认main合并私信到代理主会话)。 - 群组会话隔离(
agent:<agentId>:whatsapp:group:<jid>)。
访问控制与激活
- 私信策略
- 群组策略与允许列表
- 提及与 /activation
channels.whatsapp.dmPolicy 控制直接聊天访问:pairing(默认)allowlistopen(要求allowFrom包含"*")disabled
allowFrom 接受符合 E.164 格式的号码(内部标准化处理)。多账户覆盖:channels.whatsapp.accounts.<id>.dmPolicy(及 allowFrom)优先于该账户的渠道级默认值。运行时行为详情:- 配对信息存储在渠道允许存储中,并与配置的
allowFrom合并 - 如果没有配置允许列表,则默认允许关联的自号码
- 出站的
fromMe私信不会自动配对
个人号码及自聊行为
当关联的自号码同时存在于allowFrom 时,会启用 WhatsApp 自聊保护措施:
- 自聊轮次跳过已读回执
- 忽略会触发自己提醒的提及 JID 自动触发行为
- 如果未设置
messages.responsePrefix,自聊回复默认为[{identity.name}]或[openclaw]
消息规范化与上下文
入站信封与回复上下文
入站信封与回复上下文
收到的 WhatsApp 消息被包装在共享的入站信封中。如果存在引用回复,附加上下文形式为:支持填充回复元数据字段(
ReplyToId、ReplyToBody、ReplyToSender、发送者 JID/E.164)当可用时。媒体占位符与位置/联系人提取
媒体占位符与位置/联系人提取
仅媒体入站消息规范为占位符,如:
<media:image><media:video><media:audio><media:document><media:sticker>
待处理群组历史注入
待处理群组历史注入
对于群组,未处理的消息可缓冲并在机器人最终被触发时注入为上下文。
- 默认限制:
50 - 配置:
channels.whatsapp.historyLimit - 后备:
messages.groupChat.historyLimit - 设置为
0禁用
[从您上次回复以来的聊天消息 - 用于上下文][当前消息 - 回复此内容]
已读回执
已读回执
默认为接受的入站 WhatsApp 消息启用已读回执。全局禁用:按账户覆盖:自聊轮次即使全局启用也跳过已读回执。
投递、分块和媒体
文本分块
文本分块
- 默认分块限制:
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) - 出站自动回复媒体上限:
agents.defaults.mediaMaxMb(默认5MB) - 图像会自动优化(调整大小/质量)以适应限制
- 媒体发送失败时,首项回退发送文字警告,而非静默丢弃响应
回复确认表情
WhatsApp 支持通过channels.whatsapp.ackReaction 在入站接收后即时发送确认表情。
- 在入站消息接受后立即发送(回复前)
- 失败时记录日志,但不阻止正常回复发送
- 群组模式
mentions在提及触发时反应;群组激活always作为该检查的绕过 - WhatsApp 使用
channels.whatsapp.ackReaction(这里不使用旧版的messages.ackReaction)
多账户与凭证
账户选择和默认值
账户选择和默认值
- 账户 ID 来源于
channels.whatsapp.accounts - 默认账户选择:如果存在
default,选择该账户,否则选择第一个配置的账户 ID(排序) - 账户 ID 内部标准化以便查找
凭证路径与兼容性
凭证路径与兼容性
- 当前认证路径:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - 备份文件:
creds.json.bak - 旧版默认认证路径
~/.openclaw/credentials/仍被识别/迁移以支持默认账户流程
注销行为
注销行为
运行
openclaw channels logout --channel whatsapp [--account <id>] 清除该账户的 WhatsApp 认证状态。旧版认证目录中 oauth.json 会被保留,Baileys 认证文件被删除。工具、动作和配置写入
- 代理工具支持 WhatsApp 回复动作(
react)。 - 动作门控:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- 渠道发起的配置写入默认启用(通过设置
channels.whatsapp.configWrites=false可禁用)。
故障排除
未关联(需要二维码)
未关联(需要二维码)
症状:渠道状态报告未关联。解决:
已关联但断开连接 / 重连循环
已关联但断开连接 / 重连循环
症状:已关联账户反复断开或尝试重连。解决:如有需要,使用
channels login 重新关联。发送时无活动监听器
发送时无活动监听器
出站发送在目标账户无活动网关监听时快速失败。确认网关已运行且账户已关联。
群组消息意外被忽略
群组消息意外被忽略
请按此顺序检查:
groupPolicygroupAllowFrom/allowFromgroups允许列表条目- 提及门控(
requireMention+ 提及模式) openclaw.json中重复键(JSON5):后面条目覆盖前面,确保每个作用域中只有一个groupPolicy
Bun 运行时警告
Bun 运行时警告
WhatsApp 网关运行时应使用 Node。Bun 被标记为不兼容,不能稳定运行 WhatsApp/Telegram 网关。
配置参考指针
主要参考: 高频 WhatsApp 字段:- 访问:
dmPolicy、allowFrom、groupPolicy、groupAllowFrom、groups - 投递:
textChunkLimit、chunkMode、mediaMaxMb、sendReadReceipts、ackReaction - 多账户:
accounts.<id>.enabled、accounts.<id>.authDir、账户级覆盖 - 操作:
configWrites、debounceMs、web.enabled、web.heartbeatSeconds、web.reconnect.* - 会话行为:
session.dmScope、historyLimit、dmHistoryLimit、dms.<id>.historyLimit