DM Policy
管谁能私聊它。pairing 是默认门卫模式,allowlist 是只认名单,open 是全放行,disabled 是关门。
Channels 导读
这一页教你用 `openclaw channels login` 扫码绑定 WhatsApp 账号,并在配置中设置 `dmPolicy`(私聊策略)和 `groupPolicy`(群聊策略)。最容易踩的坑是:默认私聊策略是 `pairing`,新联系人发消息会触发配对请求,需要你手动 approve 才能继续对话。如果不想每次手动批准,直接改成 `allowlist` 并填好 `allowFrom` 白名单。
先讲这一页到底在解决什么
这一页教你用 `openclaw channels login` 扫码绑定 WhatsApp 账号,并在配置中设置 `dmPolicy`(私聊策略)和 `groupPolicy`(群聊策略)。最容易踩的坑是:默认私聊策略是 `pairing`,新联系人发消息会触发配对请求,需要你手动 approve 才能继续对话。如果不想每次手动批准,直接改成 `allowlist` 并填好 `allowFrom` 白名单。
第一站
WhatsApp Web channel 的本质,是 Gateway 通过 Baileys 接住你已经登录的 WhatsApp 会话。它不是另起炉灶,而是把现有的 WhatsApp 连接起来。
第一次连接时,你用 openclaw channels login --channel whatsapp 扫二维码,就像把手机上的那条线和 OpenClaw 绑到一起。
不是手机自己单独值班,而是 Gateway 负责 socket、重连和会话状态。手机只是门口那条线,真正管家的还是 Gateway。
官方推荐单独号码。意思很朴素:别把个人聊天和机器人工作号搅在一起,分开更稳,也更少自己给自己发消息。
WhatsApp 不是“填个 token 就完事”,它更像“先扫 QR 把账号绑上,再给它定谁能说话”。
第二站
原文 quick setup 很短,但动作很实。第一次上手,按这个顺序最稳。
先定好谁能进来,再把 WhatsApp 账号扫进系统,然后把 Gateway 打开,最后让第一位陌生人来敲门时先走 pairing 流程。
把 dmPolicy、allowFrom、groupPolicy、groupAllowFrom 先摆出来。像先在门口贴好“谁能进、谁不能进”的纸条。
运行 openclaw channels login --channel whatsapp,如果是指定账号,就再加 --account work。这一步像把手机账号领到 OpenClaw 的门牌上。
openclaw gateway 就像把总管叫醒。没有它,账号绑好了也不会真的开始收发消息。
如果你用 pairing 模式,第一次来的人会拿到代码。你再用 openclaw pairing list whatsapp 和 openclaw pairing approve whatsapp <CODE> 放行。
openclaw channels login --channel whatsapp:像拿手机扫码,把账号和 OpenClaw 绑成一对。dmPolicy: "pairing":像让陌生人先在门口等一会儿,登记通过再说话。groupAllowFrom:像在群里再加一层“谁能叫醒机器人”的名单。openclaw pairing approve whatsapp <CODE>:像把门口那位第一个来访者正式请进来。第三站
原文的 access control and activation 分成 DM 和 group 两层,正是因为 WhatsApp 的私聊和群聊不是同一件事。
管谁能私聊它。pairing 是默认门卫模式,allowlist 是只认名单,open 是全放行,disabled 是关门。
管群里谁能触发它。open、allowlist、disabled 是三种完全不同的门禁。
群里默认得点名它才回应。这样它不会在群里每句话都插嘴,比较安静。
它就像“只有这些号码能进门”的名单。没在名单里的,就算会说话也先别进。
群里回复了,不等于它被授权了。WhatsApp 这里把“能不能触发”和“能不能进门”分得很清楚。
第四站
原文特别提了 self-chat。意思是:如果你自己的号码也在 allowFrom 里,OpenClaw 会帮你避免一些“自己给自己发消息”的怪动作。
如果 linked self number 也在 allowFrom 里,系统会开启 self-chat 防护。像在提醒它:这是自己人,别重复敲门。
self-chat turn 会跳过 read receipt。这样不会因为自己给自己回消息,就把一些状态弄得很乱。
WhatsApp 的个人号码模式不是“特殊福利”,而是要把自己当成一位特别重要的用户去认真处理。
allowFrom 里包含自己的号码:像把自己也写进门卫名单。sendReadReceipts: false:像把回执灯关掉,别让自己把自己点亮得太吵。messages.responsePrefix:如果没设置,self-chat 会用名字前缀,像告诉你“这句是机器人自己回的”。第五站
原文的 message normalization and context 这一段是在讲:WhatsApp 不只是看字,它还会把各种东西整理成给模型看的上下文。
如果你回的是别人的消息,OpenClaw 会把“我正在回复谁、被引用了什么”一起补进上下文。这样模型知道这不是一条孤零零的新消息。
图片、音频、文档、贴纸这些不会直接变成空白,它们会先变成像 <media:image> 这样的占位符,让模型知道“这里原来有个东西”。
地点和联系人信息会先变成文本,再送给模型。这样它不是只看“这是一张图”,而是知道“这张图里还带了什么”。
WhatsApp 不是只收一句话,它会把对话现场一起装进来。
第六站
原文里有 pending group history injection 和 chunking。意思都很实在:长对话不会一口气全吃进来,而是会按规则整理、切块、再送给模型。
群里如果还没触发运行,消息可以先放进一个小背包里。等机器人真正被叫醒时,再把这包历史拿出来做上下文。
textChunkLimit 和 chunkMode 像在告诉系统:太长的回复要分成几小段,优先按段落切,不行再按长度切。
channels.whatsapp.textChunkLimit = 4000:像给每一段回复定好纸张大小。channels.whatsapp.chunkMode = "newline":像先按段落换行来裁剪,再不够才硬切。channels.whatsapp.historyLimit = 50:像告诉它“群里前面那堆对话,先留 50 条左右”。WhatsApp 的长对话处理,核心不是“能不能发很多字”,而是“发很多字时还会不会乱”。
第七站
原文的 ack reaction 很短,但很有用。它像一个轻轻的“我看到了”,让对方知道消息已经被接住。
你可以配置一个表情,比如 👀,让 OpenClaw 收到消息后先亮一下。像点头示意,不代表回答完了,只代表它看到了。
群里可以按 always、mentions、never 控制这个动作。这样既能反馈,又不会把群聊搞得太吵。
ackReaction.emoji: "👀":像给“已收到”贴一个小眼睛表情。group: "mentions":像规定群里只有被点名时才眨眼。sendReadReceipts: false:像把“已读”这盏灯关掉,不让自己太显眼。Ack reaction 不是回答本身,它只是“我已经接到你了”的小提示。
最后总结
WhatsApp 通道的本质,就是先把账号扫进来,再把私聊和群聊分别看门,最后把图片、语音和长消息也整理成机器人看得懂的故事。
如果你下一页只继续看一页,我建议先看 /channels/pairing 或 /channels/troubleshooting。WhatsApp 真正最容易卡住的,通常不是“能不能连上”,而是“门禁、群规则和自聊天的边界有没有摆对”。