状态:仅支持通过 Baileys 的 WhatsApp Web。Gateway 网关拥有会话。
~/.openclaw/openclaw.json 中配置 WhatsApp。openclaw channels login 扫描二维码(关联设备)。最小配置:
{
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551234567"],
},
},
}
默认情况下,WhatsApp 允许写入由 /config set|unset 触发的配置更新(需要 commands.config: true)。
禁用方式:
{
channels: { whatsapp: { configWrites: false } },
}
WhatsApp 需要真实手机号码进行验证。VoIP 和虚拟号码通常会被封锁。在 WhatsApp 上运行 OpenClaw 有两种支持的方式:
为 OpenClaw 使用单独的手机号码。最佳用户体验,清晰的路由,无自聊天怪异问题。理想设置:备用/旧 Android 手机 + eSIM。保持 Wi-Fi 和电源连接,通过二维码关联。
WhatsApp Business: 你可以在同一设备上使用不同号码的 WhatsApp Business。非常适合将个人 WhatsApp 分开——安装 WhatsApp Business 并在那里注册 OpenClaw 号码。
示例配置(专用号码,单用户允许列表):
{
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551234567"],
},
},
}
配对模式(可选):
如果你想使用配对而不是允许列表,请将 channels.whatsapp.dmPolicy 设置为 pairing。未知发送者会收到配对码;使用以下命令批准:
openclaw pairing approve whatsapp <code>
快速备选方案:在你自己的号码上运行 OpenClaw。给自己发消息(WhatsApp"给自己发消息")进行测试,这样就不会打扰联系人。在设置和实验期间需要在主手机上阅读验证码。必须启用自聊天模式。 当向导询问你的个人 WhatsApp 号码时,输入你将用于发送消息的手机(所有者/发送者),而不是助手号码。
示例配置(个人号码,自聊天):
{
"whatsapp": {
"selfChatMode": true,
"dmPolicy": "allowlist",
"allowFrom": ["+15551234567"]
}
}
当设置了 identity.name 时,自聊天回复默认为 [{identity.name}](否则为 [openclaw]),
前提是 messages.responsePrefix 未设置。明确设置它可以自定义或禁用
前缀(使用 "" 来移除)。
避免: TextNow、Google Voice、大多数"免费短信"服务——WhatsApp 会积极封锁这些。
提示: 该号码只需要接收一条验证短信。之后,WhatsApp Web 会话通过 creds.json 持久化。
openclaw channels login(通过关联设备扫描二维码)。openclaw channels login --account <id>(<id> = accountId)。--account 时):如果存在则为 default,否则为第一个配置的账户 id(排序后)。~/.openclaw/credentials/whatsapp/<accountId>/creds.json。creds.json.bak(损坏时恢复)。~/.openclaw/credentials/ 中。openclaw channels logout(或 --account <id>)删除 WhatsApp 认证状态(但保留共享的 oauth.json)。messages.upsert(Baileys)。channels.whatsapp.dmPolicy 控制直接聊天访问(默认:pairing)。openclaw pairing approve whatsapp <code> 批准;码在 1 小时后过期)。channels.whatsapp.allowFrom 包含 "*"。channels.whatsapp.dmPolicy 和 channels.whatsapp.allowFrom 检查。如果你在个人 WhatsApp 号码上运行 OpenClaw,请启用 channels.whatsapp.selfChatMode(见上面的示例)。
行为:
channels.whatsapp.dmPolicy。默认情况下,Gateway 网关在接受入站 WhatsApp 消息后将其标记为已读(蓝色勾号)。
全局禁用:
{
channels: { whatsapp: { sendReadReceipts: false } },
}
按账户禁用:
{
channels: {
whatsapp: {
accounts: {
personal: { sendReadReceipts: false },
},
},
},
}
注意事项:
当我关联 WhatsApp 时,OpenClaw 会给随机联系人发消息吗? 不会。默认私信策略是配对,因此未知发送者只会收到配对码,他们的消息不会被处理。OpenClaw 只会回复它收到的聊天,或你明确触发的发送(智能体/CLI)。
WhatsApp 上的配对是如何工作的? 配对是未知发送者的私信门控:
openclaw pairing approve whatsapp <code>(使用 openclaw pairing list whatsapp 列出)。多个人可以在一个 WhatsApp 号码上使用不同的 OpenClaw 实例吗?
可以,通过 bindings 将每个发送者路由到不同的智能体(peer kind: "dm",发送者 E.164 如 +15551234567)。回复仍然来自同一个 WhatsApp 账户,直接聊天会折叠到每个智能体的主会话,因此每人使用一个智能体。私信访问控制(dmPolicy/allowFrom)是每个 WhatsApp 账户全局的。参见多智能体路由。
为什么向导会询问我的手机号码?
向导使用它来设置你的允许列表/所有者,以便允许你自己的私信。它不会用于自动发送。如果你在个人 WhatsApp 号码上运行,请使用相同的号码并启用 channels.whatsapp.selfChatMode。
Body 是带有信封的当前消息正文。[Replying to +1555 id:ABC123]
<quoted text or <media:...>>
[/Replying]
ReplyToId = stanzaIdReplyToBody = 引用正文或媒体占位符ReplyToSender = 已知时为 E.164<media:image|video|audio|document|sticker>agent:<agentId>:whatsapp:group:<jid> 会话。channels.whatsapp.groupPolicy = open|disabled|allowlist(默认 allowlist)。mention(默认):需要 @提及或正则匹配。always:始终触发。/activation mention|always 仅限所有者,必须作为独立消息发送。channels.whatsapp.allowFrom(如果未设置则为自身 E.164)。[Chat messages since your last reply - for context](已在会话中的消息不会重新注入)[Current message - respond to this][from: Name (+E164)]WhatsApp 可以在收到传入消息时立即自动发送表情回应,在机器人生成回复之前。这为用户提供即时反馈,表明他们的消息已收到。
配置:
{
"whatsapp": {
"ackReaction": {
"emoji": "👀",
"direct": true,
"group": "mentions"
}
}
}
选项:
emoji(字符串):用于确认的表情(例如"👀"、"✅"、"📨")。为空或省略 = 功能禁用。direct(布尔值,默认:true):在直接/私信聊天中发送表情回应。group(字符串,默认:"mentions"):群聊行为:"always":对所有群消息做出回应(即使没有 @提及)"mentions":仅在机器人被 @提及时做出回应"never":从不在群组中做出回应按账户覆盖:
{
"whatsapp": {
"accounts": {
"work": {
"ackReaction": {
"emoji": "✅",
"direct": false,
"group": "always"
}
}
}
}
}
行为说明:
requireMention: false(激活:always)的群组中,group: "mentions" 会对所有消息做出回应(不仅仅是 @提及)。messages.ackReaction;请改用 channels.whatsapp.ackReaction。whatsapp,带有 react 动作(chatJid、messageId、emoji,可选 remove)。participant(群组发送者)、fromMe(对自己的消息做出回应)、accountId(多账户)。channels.whatsapp.actions.reactions(默认:启用)。channels.whatsapp.textChunkLimit 分块(默认 4000)。channels.whatsapp.chunkMode="newline" 在长度分块之前按空行(段落边界)分割。channels.whatsapp.mediaMaxMb 限制(默认 50 MB)。agents.defaults.mediaMaxMb 限制(默认 5 MB)。channels.whatsapp.textChunkLimit 配置,可选 channels.whatsapp.chunkMode)。audio/ogg => audio/ogg; codecs=opus。gifPlayback: true 的 MP4 以实现内联循环。openclaw message send --media <mp4> --gif-playbacksend 参数包含 gifPlayback: trueWhatsApp 将音频作为语音消息(PTT 气泡)发送。
audio/ogg 重写为 audio/ogg; codecs=opus。[[audio_as_voice]](音频已作为语音消息发送)。agents.defaults.mediaMaxMb。web.heartbeatSeconds,默认 60 秒)。agents.list[].heartbeat)或通过
agents.defaults.heartbeat 全局配置(当没有设置按智能体条目时的降级)。Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.)+ HEARTBEAT_OK 跳过行为。web.reconnect:initialMs、maxMs、factor、jitter、maxAttempts。channels.whatsapp.dmPolicy(私信策略:pairing/allowlist/open/disabled)。channels.whatsapp.selfChatMode(同手机设置;机器人使用你的个人 WhatsApp 号码)。channels.whatsapp.allowFrom(私信允许列表)。WhatsApp 使用 E.164 手机号码(无用户名)。channels.whatsapp.mediaMaxMb(入站媒体保存上限)。channels.whatsapp.ackReaction(消息收到时的自动回应:{emoji, direct, group})。channels.whatsapp.accounts.<accountId>.*(按账户设置 + 可选 authDir)。channels.whatsapp.accounts.<accountId>.mediaMaxMb(按账户入站媒体上限)。channels.whatsapp.accounts.<accountId>.ackReaction(按账户确认回应覆盖)。channels.whatsapp.groupAllowFrom(群组发送者允许列表)。channels.whatsapp.groupPolicy(群组策略)。channels.whatsapp.historyLimit / channels.whatsapp.accounts.<accountId>.historyLimit(群组历史上下文;0 禁用)。channels.whatsapp.dmHistoryLimit(私信历史限制,按用户轮次)。按用户覆盖:channels.whatsapp.dms["<phone>"].historyLimit。channels.whatsapp.groups(群组允许列表 + 提及门控默认值;使用 "*" 允许全部)channels.whatsapp.actions.reactions(门控 WhatsApp 工具表情回应)。agents.list[].groupChat.mentionPatterns(或 messages.groupChat.mentionPatterns)messages.groupChat.historyLimitchannels.whatsapp.messagePrefix(入站前缀;按账户:channels.whatsapp.accounts.<accountId>.messagePrefix;已弃用:messages.messagePrefix)messages.responsePrefix(出站前缀)agents.defaults.mediaMaxMbagents.defaults.heartbeat.everyagents.defaults.heartbeat.model(可选覆盖)agents.defaults.heartbeat.targetagents.defaults.heartbeat.toagents.defaults.heartbeat.sessionagents.list[].heartbeat.*(按智能体覆盖)session.*(scope、idle、store、mainKey)web.enabled(为 false 时禁用渠道启动)web.heartbeatSecondsweb.reconnect.*whatsapp/inbound、whatsapp/outbound、web-heartbeat、web-reconnect。/tmp/openclaw/openclaw-YYYY-MM-DD.log(可配置)。未关联 / 需要二维码登录
channels status 显示 linked: false 或警告"Not linked"。openclaw channels login 并扫描二维码(WhatsApp → 设置 → 关联设备)。已关联但断开连接 / 重连循环
channels status 显示 running, disconnected 或警告"Linked but disconnected"。openclaw doctor(或重启 Gateway 网关)。如果问题持续,通过 channels login 重新关联并检查 openclaw logs --follow。Bun 运行时