Trạng thái: sẵn sàng cho production qua WhatsApp Web (Baileys). Gateway sở hữu phiên đã liên kết.Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Cài đặt (theo nhu cầu)
- Onboarding (
openclaw onboard) vàopenclaw channels add --channel whatsappsẽ nhắc cài đặt Plugin WhatsApp vào lần đầu bạn chọn nó. openclaw channels login --channel whatsappcũng cung cấp luồng cài đặt khi Plugin chưa có.- Kênh dev + git checkout: mặc định dùng đường dẫn Plugin cục bộ.
- Stable/Beta: dùng gói npm
@openclaw/whatsapptrên tag bản phát hành chính thức hiện tại.
PATH trong khi cài đặt npm vì
một trong các dependency Baileys/libsignal của nó được lấy từ một URL git. Cài đặt
Git for Windows, rồi khởi động lại shell và chạy lại cài đặt:
bin của nó nằm trên PATH.
Ghép đôi
Khắc phục sự cố kênh
Cấu hình Gateway
Thiết lập nhanh
Liên kết WhatsApp (QR)
Mẫu triển khai
Số chuyên dụng (được khuyến nghị)
Số chuyên dụng (được khuyến nghị)
- danh tính WhatsApp riêng cho OpenClaw
- danh sách cho phép DM và ranh giới định tuyến rõ ràng hơn
- giảm khả năng nhầm lẫn do tự chat
Phương án dự phòng bằng số cá nhân
Phương án dự phòng bằng số cá nhân
dmPolicy: "allowlist"allowFrombao gồm số cá nhân của bạnselfChatMode: true
allowFrom.Phạm vi kênh chỉ WhatsApp Web
Phạm vi kênh chỉ WhatsApp Web
Baileys) trong kiến trúc kênh OpenClaw hiện tại.Không có kênh nhắn tin Twilio WhatsApp riêng trong registry kênh chat tích hợp sẵn.Mô hình runtime
- Gateway sở hữu socket WhatsApp và vòng lặp kết nối lại.
- Watchdog kết nối lại dùng hoạt động transport WhatsApp Web, không chỉ khối lượng tin nhắn ứng dụng inbound, nên một phiên thiết bị đã liên kết đang yên lặng sẽ không bị khởi động lại chỉ vì gần đây không ai gửi tin nhắn. Một ngưỡng im lặng ứng dụng dài hơn vẫn buộc kết nối lại nếu các frame transport vẫn đến nhưng không có tin nhắn ứng dụng nào được xử lý trong cửa sổ watchdog; sau một lần kết nối lại tạm thời cho phiên hoạt động gần đây, kiểm tra im lặng ứng dụng đó dùng timeout tin nhắn bình thường cho cửa sổ khôi phục đầu tiên.
- Thời điểm socket Baileys được đặt rõ dưới
web.whatsapp.*:keepAliveIntervalMsđiều khiển ping ứng dụng WhatsApp Web,connectTimeoutMsđiều khiển timeout bắt tay mở kết nối, vàdefaultQueryTimeoutMsđiều khiển timeout truy vấn Baileys. - Gửi outbound yêu cầu một listener WhatsApp đang hoạt động cho tài khoản đích.
- Gửi nhóm đính kèm metadata nhắc đến gốc cho các token
@+<digits>và@<digits>trong văn bản và chú thích media khi token khớp metadata người tham gia WhatsApp hiện tại, bao gồm các nhóm dựa trên LID. - Chat trạng thái và broadcast bị bỏ qua (
@status,@broadcast). - Watchdog kết nối lại theo dõi hoạt động transport WhatsApp Web, không chỉ khối lượng tin nhắn ứng dụng inbound: phiên thiết bị đã liên kết yên lặng vẫn duy trì khi các frame transport tiếp tục, nhưng transport bị treo sẽ buộc kết nối lại trước rất lâu so với đường ngắt kết nối từ xa muộn hơn.
- Chat trực tiếp dùng quy tắc phiên DM (
session.dmScope; mặc địnhmaingom DM vào phiên chính của agent). - Phiên nhóm được cô lập (
agent:<agentId>:whatsapp:group:<jid>). - WhatsApp Channels/Newsletters có thể là đích outbound tường minh bằng JID
@newslettergốc của chúng. Gửi outbound newsletter dùng metadata phiên kênh (agent:<agentId>:whatsapp:channel:<jid>) thay vì ngữ nghĩa phiên DM. - Transport WhatsApp Web tôn trọng các biến môi trường proxy chuẩn trên host Gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ các biến chữ thường tương ứng). Ưu tiên cấu hình proxy cấp host hơn cài đặt proxy WhatsApp riêng theo kênh. - Khi bật
messages.removeAckAfterReply, OpenClaw xóa phản ứng ack của WhatsApp sau khi một phản hồi hiển thị được gửi.
Hook Plugin và quyền riêng tư
Tin nhắn inbound WhatsApp có thể chứa nội dung tin nhắn cá nhân, số điện thoại, định danh nhóm, tên người gửi và các trường tương quan phiên. Vì lý do đó, WhatsApp không broadcast payload hook inboundmessage_received đến các Plugin
trừ khi bạn chọn tham gia rõ ràng:
Kiểm soát truy cập và kích hoạt
- Chính sách DM
- Chính sách nhóm + danh sách cho phép
- Nhắc đến + /activation
channels.whatsapp.dmPolicy điều khiển truy cập chat trực tiếp:pairing(mặc định)allowlistopen(yêu cầuallowFrombao gồm"*")disabled
allowFrom chấp nhận số kiểu E.164 (được chuẩn hóa nội bộ).allowFrom là danh sách kiểm soát truy cập người gửi DM. Nó không chặn gửi outbound tường minh đến JID nhóm WhatsApp hoặc JID kênh @newsletter.Ghi đè nhiều tài khoản: channels.whatsapp.accounts.<id>.dmPolicy (và allowFrom) được ưu tiên hơn mặc định cấp kênh cho tài khoản đó.Chi tiết hành vi runtime:- các ghép đôi được lưu trong kho cho phép của kênh và được gộp với
allowFromđã cấu hình - tự động hóa đã lên lịch và fallback người nhận Heartbeat dùng đích gửi rõ ràng hoặc
allowFromđã cấu hình; phê duyệt ghép đôi DM không mặc nhiên là người nhận Cron hoặc Heartbeat - nếu không cấu hình allowlist, số tự thân đã liên kết được cho phép theo mặc định
- OpenClaw không bao giờ tự động ghép đôi DM outbound
fromMe(tin nhắn bạn gửi cho chính mình từ thiết bị đã liên kết)
Hành vi số cá nhân và tự chat
Khi số tự thân đã liên kết cũng có trongallowFrom, các biện pháp bảo vệ tự chat WhatsApp được kích hoạt:
- bỏ qua biên nhận đã đọc cho lượt tự chat
- bỏ qua hành vi tự kích hoạt bằng JID nhắc đến vốn sẽ ping chính bạn
- nếu chưa đặt
messages.responsePrefix, trả lời tự chat mặc định là[{identity.name}]hoặc[openclaw]
Chuẩn hóa tin nhắn và ngữ cảnh
Envelope inbound + ngữ cảnh trả lời
Envelope inbound + ngữ cảnh trả lời
ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 người gửi).
Khi mục tiêu trả lời được trích dẫn là media có thể tải xuống, OpenClaw lưu nó qua
kho media inbound bình thường và hiển thị nó dưới dạng MediaPath/MediaType để
agent có thể kiểm tra hình ảnh được tham chiếu thay vì chỉ thấy
<media:image>.Placeholder media và trích xuất vị trí/liên hệ
Placeholder media và trích xuất vị trí/liên hệ
<media:image><media:video><media:audio><media:document><media:sticker>
<media:audio>, nên việc nói lời nhắc đến bot trong voice note có thể
kích hoạt phản hồi. Nếu bản chép lời vẫn không nhắc đến bot, bản chép lời
được giữ trong lịch sử nhóm đang chờ thay vì placeholder thô.Body vị trí dùng văn bản tọa độ ngắn gọn. Nhãn/bình luận vị trí và chi tiết liên hệ/vCard được render dưới dạng metadata không đáng tin cậy có rào chắn, không phải văn bản prompt inline.Chèn lịch sử nhóm đang chờ
Chèn lịch sử nhóm đang chờ
- giới hạn mặc định:
50 - cấu hình:
channels.whatsapp.historyLimit - dự phòng:
messages.groupChat.historyLimit 0vô hiệu hóa
[Chat messages since your last reply - for context][Current message - respond to this]
Biên nhận đã đọc
Biên nhận đã đọc
Phân phối, chia đoạn và phương tiện
Chia đoạn văn bản
Chia đoạn văn bản
- giới hạn đoạn mặc định:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- chế độ
newlineưu tiên ranh giới đoạn văn (dòng trống), sau đó dự phòng về cách chia đoạn an toàn theo độ dài
Hành vi phương tiện gửi ra
Hành vi phương tiện gửi ra
- hỗ trợ payload hình ảnh, video, âm thanh (ghi chú thoại PTT) và tài liệu
- phương tiện âm thanh được gửi qua payload
audiocủa Baileys vớiptt: true, để các client WhatsApp hiển thị dưới dạng ghi chú thoại nhấn-để-nói - payload trả lời giữ nguyên
audioAsVoice; đầu ra ghi chú thoại TTS cho WhatsApp vẫn đi theo đường PTT này ngay cả khi nhà cung cấp trả về MP3 hoặc WebM - âm thanh Ogg/Opus gốc được gửi dưới dạng
audio/ogg; codecs=opusđể tương thích với ghi chú thoại - âm thanh không phải Ogg, bao gồm đầu ra Microsoft Edge TTS MP3/WebM, được chuyển mã bằng
ffmpegsang Ogg/Opus đơn âm 48 kHz trước khi phân phối PTT /tts latestgửi phản hồi mới nhất của trợ lý thành một ghi chú thoại và ngăn gửi lặp lại cho cùng phản hồi;/tts chat on|off|defaultđiều khiển auto-TTS cho cuộc trò chuyện WhatsApp hiện tại- hỗ trợ phát GIF động qua
gifPlayback: truekhi gửi video - chú thích được áp dụng cho mục phương tiện đầu tiên khi gửi payload trả lời nhiều phương tiện, ngoại trừ ghi chú thoại PTT sẽ gửi âm thanh trước và văn bản hiển thị riêng vì các client WhatsApp không hiển thị chú thích ghi chú thoại một cách nhất quán
- nguồn phương tiện có thể là HTTP(S),
file://, hoặc đường dẫn cục bộ
Giới hạn kích thước phương tiện và hành vi dự phòng
Giới hạn kích thước phương tiện và hành vi dự phòng
- mức trần lưu phương tiện gửi vào:
channels.whatsapp.mediaMaxMb(mặc định50) - mức trần gửi phương tiện ra:
channels.whatsapp.mediaMaxMb(mặc định50) - ghi đè theo từng tài khoản dùng
channels.whatsapp.accounts.<accountId>.mediaMaxMb - hình ảnh được tự động tối ưu hóa (quét đổi kích thước/chất lượng) để phù hợp với giới hạn
- khi gửi phương tiện thất bại, dự phòng cho mục đầu tiên sẽ gửi cảnh báo văn bản thay vì âm thầm bỏ phản hồi
Trích dẫn trả lời
WhatsApp hỗ trợ trích dẫn trả lời gốc, trong đó các phản hồi gửi ra hiển thị phần trích dẫn tin nhắn gửi vào. Điều khiển bằngchannels.whatsapp.replyToMode.
| Giá trị | Hành vi |
|---|---|
"off" | Không bao giờ trích dẫn; gửi như một tin nhắn thường |
"first" | Chỉ trích dẫn đoạn phản hồi gửi ra đầu tiên |
"all" | Trích dẫn mọi đoạn phản hồi gửi ra |
"batched" | Trích dẫn các phản hồi theo lô trong hàng đợi, còn phản hồi tức thì không trích dẫn |
"off". Ghi đè theo từng tài khoản dùng channels.whatsapp.accounts.<id>.replyToMode.
Mức phản ứng
channels.whatsapp.reactionLevel điều khiển phạm vi agent sử dụng phản ứng emoji trên WhatsApp:
| Mức | Phản ứng xác nhận | Phản ứng do agent khởi tạo | Mô tả |
|---|---|---|---|
"off" | Không | Không | Không có phản ứng nào |
"ack" | Có | Không | Chỉ phản ứng xác nhận (biên nhận trước trả lời) |
"minimal" | Có | Có (thận trọng) | Xác nhận + phản ứng của agent với hướng dẫn thận trọng |
"extensive" | Có | Có (được khuyến khích) | Xác nhận + phản ứng của agent với hướng dẫn được khuyến khích |
"minimal".
Ghi đè theo từng tài khoản dùng channels.whatsapp.accounts.<id>.reactionLevel.
Phản ứng xác nhận
WhatsApp hỗ trợ phản ứng xác nhận tức thì khi nhận tin nhắn gửi vào quachannels.whatsapp.ackReaction.
Phản ứng xác nhận bị chặn bởi reactionLevel — chúng bị bỏ qua khi reactionLevel là "off".
- được gửi ngay sau khi tin nhắn gửi vào được chấp nhận (trước trả lời)
- lỗi được ghi log nhưng không chặn việc phân phối phản hồi bình thường
- chế độ nhóm
mentionsphản ứng trong các lượt được kích hoạt bằng nhắc đến; kích hoạt nhómalwaysđóng vai trò bỏ qua bước kiểm tra này - WhatsApp dùng
channels.whatsapp.ackReaction(legacymessages.ackReactionkhông được dùng ở đây)
Nhiều tài khoản và thông tin xác thực
Chọn tài khoản và mặc định
Chọn tài khoản và mặc định
- id tài khoản đến từ
channels.whatsapp.accounts - chọn tài khoản mặc định:
defaultnếu có, nếu không thì dùng id tài khoản được cấu hình đầu tiên (đã sắp xếp) - id tài khoản được chuẩn hóa nội bộ để tra cứu
Đường dẫn thông tin xác thực và tương thích legacy
Đường dẫn thông tin xác thực và tương thích legacy
- đường dẫn xác thực hiện tại:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - tệp sao lưu:
creds.json.bak - xác thực mặc định legacy trong
~/.openclaw/credentials/vẫn được nhận diện/di chuyển cho các luồng tài khoản mặc định
Hành vi đăng xuất
Hành vi đăng xuất
openclaw channels logout --channel whatsapp [--account <id>] xóa trạng thái xác thực WhatsApp cho tài khoản đó.Khi có thể truy cập Gateway, thao tác đăng xuất trước tiên dừng listener WhatsApp trực tiếp cho tài khoản đã chọn để phiên đã liên kết không tiếp tục nhận tin nhắn cho đến lần khởi động lại tiếp theo. openclaw channels remove --channel whatsapp cũng dừng listener trực tiếp trước khi vô hiệu hóa hoặc xóa cấu hình tài khoản.Trong các thư mục xác thực legacy, oauth.json được giữ lại trong khi các tệp xác thực Baileys bị xóa.Công cụ, hành động và ghi cấu hình
- Hỗ trợ công cụ agent bao gồm hành động phản ứng WhatsApp (
react). - Cổng hành động:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Ghi cấu hình do kênh khởi tạo được bật mặc định (vô hiệu hóa qua
channels.whatsapp.configWrites=false).
Khắc phục sự cố
Chưa liên kết (cần QR)
Chưa liên kết (cần QR)
Đã liên kết nhưng bị ngắt kết nối / vòng lặp kết nối lại
Đã liên kết nhưng bị ngắt kết nối / vòng lặp kết nối lại
status=408 Request Time-out Connection was lost, hãy tinh chỉnh
thời gian socket Baileys trong web.whatsapp. Bắt đầu bằng cách rút ngắn
keepAliveIntervalMs xuống thấp hơn thời gian chờ nhàn rỗi của mạng và tăng
connectTimeoutMs trên các kết nối chậm hoặc mất gói:~/.openclaw/logs/whatsapp-health.log ghi Gateway inactive nhưng
openclaw gateway status và openclaw channels status --probe cho thấy
Gateway và WhatsApp vẫn khỏe mạnh, hãy chạy openclaw doctor. Trên Linux, doctor
cảnh báo về các mục crontab legacy vẫn gọi
~/.openclaw/bin/ensure-whatsapp.sh; hãy xóa các mục cũ đó bằng
crontab -e vì cron có thể thiếu môi trường systemd user-bus và
khiến script cũ đó báo sai tình trạng Gateway.Nếu cần, liên kết lại bằng channels login.Đăng nhập QR hết thời gian chờ sau proxy
Đăng nhập QR hết thời gian chờ sau proxy
openclaw channels login --channel whatsapp thất bại trước khi hiển thị mã QR có thể dùng được với status=408 Request Time-out hoặc ngắt kết nối socket TLS.Đăng nhập WhatsApp Web dùng môi trường proxy tiêu chuẩn của máy chủ Gateway (HTTPS_PROXY, HTTP_PROXY, các biến viết thường tương ứng và NO_PROXY). Xác minh quy trình Gateway kế thừa env proxy và NO_PROXY không khớp với mmg.whatsapp.net.Không có listener hoạt động khi gửi
Không có listener hoạt động khi gửi
Phản hồi xuất hiện trong transcript nhưng không có trong WhatsApp
Phản hồi xuất hiện trong transcript nhưng không có trong WhatsApp
auto-reply delivery failed hoặc auto-reply was not accepted by WhatsApp provider.Tin nhắn nhóm bị bỏ qua ngoài dự kiến
Tin nhắn nhóm bị bỏ qua ngoài dự kiến
groupPolicygroupAllowFrom/allowFrom- các mục danh sách cho phép
groups - cổng nhắc đến (
requireMention+ mẫu nhắc đến) - khóa trùng lặp trong
openclaw.json(JSON5): các mục sau ghi đè mục trước, vì vậy hãy giữ mộtgroupPolicyduy nhất cho mỗi phạm vi
Cảnh báo runtime Bun
Cảnh báo runtime Bun
System prompts
WhatsApp hỗ trợ system prompts kiểu Telegram cho nhóm và cuộc trò chuyện trực tiếp qua các mapgroups và direct.
Thứ bậc phân giải cho tin nhắn nhóm:
Map groups hiệu lực được xác định trước: nếu tài khoản định nghĩa groups riêng, nó thay thế hoàn toàn map groups gốc (không deep merge). Sau đó việc tra cứu prompt chạy trên một map duy nhất thu được:
- System prompt dành riêng cho nhóm (
groups["<groupId>"].systemPrompt): được dùng khi mục nhóm cụ thể tồn tại trong map và khóasystemPromptcủa nó được định nghĩa. NếusystemPromptlà chuỗi rỗng (""), ký tự đại diện bị bỏ qua và không áp dụng system prompt nào. - System prompt ký tự đại diện nhóm (
groups["*"].systemPrompt): được dùng khi mục nhóm cụ thể hoàn toàn không có trong map, hoặc khi mục đó tồn tại nhưng không định nghĩa khóasystemPrompt.
direct hiệu lực được xác định trước: nếu tài khoản định nghĩa direct riêng, nó thay thế hoàn toàn map direct gốc (không deep merge). Sau đó việc tra cứu prompt chạy trên một map duy nhất thu được:
- Prompt hệ thống dành riêng cho trò chuyện trực tiếp (
direct["<peerId>"].systemPrompt): được dùng khi mục peer cụ thể tồn tại trong map và khóasystemPromptcủa mục đó được định nghĩa. NếusystemPromptlà chuỗi rỗng (""), wildcard sẽ bị chặn và không áp dụng prompt hệ thống nào. - Prompt hệ thống wildcard cho trò chuyện trực tiếp (
direct["*"].systemPrompt): được dùng khi mục peer cụ thể hoàn toàn không có trong map, hoặc khi mục đó tồn tại nhưng không định nghĩa khóasystemPrompt.
dms vẫn là bucket ghi đè lịch sử nhẹ theo từng DM (dms.<id>.historyLimit). Các ghi đè prompt nằm dưới direct.groups ở root được chủ ý chặn cho tất cả tài khoản trong thiết lập đa tài khoản — kể cả những tài khoản không tự định nghĩa groups — để ngăn bot nhận tin nhắn nhóm từ các nhóm mà nó không thuộc về. WhatsApp không áp dụng cơ chế bảo vệ này: groups ở root và direct ở root luôn được kế thừa bởi các tài khoản không định nghĩa ghi đè ở cấp tài khoản, bất kể có bao nhiêu tài khoản được cấu hình. Trong thiết lập WhatsApp đa tài khoản, nếu bạn muốn prompt nhóm hoặc trò chuyện trực tiếp theo từng tài khoản, hãy định nghĩa rõ toàn bộ map dưới từng tài khoản thay vì dựa vào mặc định ở cấp root.
Hành vi quan trọng:
channels.whatsapp.groupsvừa là map cấu hình theo từng nhóm vừa là allowlist nhóm ở cấp chat. Ở phạm vi root hoặc tài khoản,groups["*"]nghĩa là “tất cả nhóm đều được chấp nhận” cho phạm vi đó.- Chỉ thêm wildcard nhóm
systemPromptkhi bạn đã muốn phạm vi đó chấp nhận tất cả nhóm. Nếu bạn vẫn chỉ muốn một tập ID nhóm cố định đủ điều kiện, đừng dùnggroups["*"]làm mặc định prompt. Thay vào đó, hãy lặp lại prompt trên từng mục nhóm được allowlist rõ ràng. - Việc chấp nhận nhóm và ủy quyền người gửi là các kiểm tra riêng biệt.
groups["*"]mở rộng tập nhóm có thể đi tới xử lý nhóm, nhưng bản thân nó không ủy quyền cho mọi người gửi trong các nhóm đó. Quyền truy cập của người gửi vẫn được kiểm soát riêng bởichannels.whatsapp.groupPolicyvàchannels.whatsapp.groupAllowFrom. channels.whatsapp.directkhông có tác dụng phụ tương tự đối với DM.direct["*"]chỉ cung cấp cấu hình trò chuyện trực tiếp mặc định sau khi một DM đã được chấp nhận bởidmPolicycộng vớiallowFromhoặc các quy tắc pairing-store.
Con trỏ tham chiếu cấu hình
Tham chiếu chính: Các trường WhatsApp có tín hiệu cao:- truy cập:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - gửi nhận:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - đa tài khoản:
accounts.<id>.enabled,accounts.<id>.authDir, các ghi đè cấp tài khoản - vận hành:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - hành vi phiên:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - prompt:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt