WhatsApp (Web channel)
Статус: готовий до використання у production через WhatsApp Web (Baileys). Gateway керує прив’язаними сесіями.Встановлення (за потреби)
- Під час onboarding (
openclaw onboard) іopenclaw channels add --channel whatsappз’являється запит на встановлення плагіна WhatsApp, коли ви вперше вибираєте цей канал. openclaw channels login --channel whatsappтакож пропонує процес встановлення, якщо плагін ще не встановлено.- Dev channel + git checkout: типово використовується локальний шлях до плагіна.
- Stable/Beta: типово використовується npm-пакет
@openclaw/whatsapp.
Підключення
Типова політика DM для невідомих відправників — pairing.
Усунення проблем із каналами
Кросканальна діагностика та сценарії відновлення.
Конфігурація Gateway
Повні шаблони та приклади конфігурації каналу.
Швидке налаштування
OpenClaw рекомендує за можливості запускати WhatsApp на окремому номері. (Метадані каналу та процес налаштування оптимізовано для такого варіанта, але конфігурації з особистим номером також підтримуються.)
Сценарії розгортання
Окремий номер (рекомендовано)
Окремий номер (рекомендовано)
Це найзручніший операційний режим:
- окрема ідентичність WhatsApp для OpenClaw
- чіткіші allowlist для DM та межі маршрутизації
- менша ймовірність плутанини з чатом із самим собою
Резервний варіант з особистим номером
Резервний варіант з особистим номером
Onboarding підтримує режим особистого номера і записує базову конфігурацію, зручну для чату із самим собою:
dmPolicy: "allowlist"allowFromмістить ваш особистий номерselfChatMode: true
allowFrom.Область каналу лише для WhatsApp Web
Область каналу лише для WhatsApp Web
Канал платформи обміну повідомленнями у поточній архітектурі каналів OpenClaw базується на WhatsApp Web (
Baileys).У вбудованому реєстрі чат-каналів немає окремого каналу повідомлень Twilio WhatsApp.Модель runtime
- Gateway керує сокетом WhatsApp і циклом повторного підключення.
- Вихідні надсилання потребують активного listener WhatsApp для цільового облікового запису.
- Чати status і broadcast ігноруються (
@status,@broadcast). - Прямі чати використовують правила DM-сесій (
session.dmScope; типове значенняmainзводить DM до основної сесії агента). - Групові сесії ізольовані (
agent:<agentId>:whatsapp:group:<jid>).
Контроль доступу та активація
- Політика DM
- Групова політика + allowlists
- Згадки + /activation
channels.whatsapp.dmPolicy керує доступом до прямих чатів:pairing(типово)allowlistopen(потребує, щобallowFromмістив"*")disabled
allowFrom приймає номери у форматі E.164 (внутрішньо нормалізуються).Перевизначення для кількох облікових записів: channels.whatsapp.accounts.<id>.dmPolicy (і allowFrom) мають пріоритет над значеннями канального рівня для цього облікового запису.Подробиці поведінки runtime:- pairings зберігаються в channel allow-store і об’єднуються з налаштованим
allowFrom - якщо allowlist не налаштовано, типово дозволяється прив’язаний власний номер
- вихідні DM
fromMeніколи не проходять auto-paired
Поведінка особистого номера та чату із самим собою
Коли прив’язаний власний номер також присутній уallowFrom, активуються запобіжники для чату із самим собою в WhatsApp:
- пропускати read receipts для ходів self-chat
- ігнорувати поведінку auto-trigger за mention-JID, яка інакше пінгувала б вас самих
- якщо
messages.responsePrefixне задано, відповіді self-chat типово використовують[{identity.name}]або[openclaw]
Нормалізація повідомлень і контекст
Вхідна envelope + контекст відповіді
Вхідна envelope + контекст відповіді
Вхідні повідомлення WhatsApp обгортаються в спільну inbound envelope.Якщо існує цитована відповідь, контекст додається в такому вигляді:Метадані відповіді також заповнюються, коли доступні (
ReplyToId, ReplyToBody, ReplyToSender, sender JID/E.164).Заповнювачі медіа та витягування location/contact
Заповнювачі медіа та витягування location/contact
Вхідні повідомлення лише з медіа нормалізуються за допомогою заповнювачів, наприклад:
<media:image><media:video><media:audio><media:document><media:sticker>
Відкладене додавання історії групи
Відкладене додавання історії групи
Для груп необроблені повідомлення можуть буферизуватися й додаватися як контекст, коли бот нарешті активується.
- типове обмеження:
50 - конфігурація:
channels.whatsapp.historyLimit - резервне значення:
messages.groupChat.historyLimit 0вимикає
[Chat messages since your last reply - for context][Current message - respond to this]
Read receipts
Read receipts
Read receipts типово ввімкнені для прийнятих вхідних повідомлень WhatsApp.Вимкнення глобально:Перевизначення для окремого облікового запису:Для self-chat read receipts пропускаються, навіть якщо глобально ввімкнені.
Доставка, розбиття на частини та медіа
Розбиття тексту
Розбиття тексту
- типове обмеження частини:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- режим
newlineнадає перевагу межам абзаців (порожнім рядкам), а потім резервно використовує безпечне за довжиною розбиття
Поведінка вихідних медіа
Поведінка вихідних медіа
- підтримуються image, video, audio (голосова PTT-нотатка) і payload document
audio/oggпереписується вaudio/ogg; codecs=opusдля сумісності з голосовими нотатками- анімоване відтворення GIF підтримується через
gifPlayback: trueпід час надсилання video - captions застосовуються до першого елемента медіа під час надсилання payload відповіді з кількома медіа
- джерелом медіа може бути HTTP(S),
file://або локальні шляхи
Обмеження розміру медіа та резервна поведінка
Обмеження розміру медіа та резервна поведінка
- обмеження збереження вхідних медіа:
channels.whatsapp.mediaMaxMb(типово50) - обмеження надсилання вихідних медіа:
channels.whatsapp.mediaMaxMb(типово50) - для перевизначень окремих облікових записів використовується
channels.whatsapp.accounts.<accountId>.mediaMaxMb - зображення автоматично оптимізуються (зміна розміру/підбір якості), щоб вкладатися в ліміти
- при збої надсилання медіа резервний варіант для першого елемента надсилає текстове попередження замість тихого відкидання відповіді
Рівень реакцій
channels.whatsapp.reactionLevel керує тим, наскільки широко агент використовує emoji-реакції в WhatsApp:
| Рівень | Ack reactions | Реакції, ініційовані агентом | Опис |
|---|---|---|---|
"off" | Ні | Ні | Жодних реакцій |
"ack" | Так | Ні | Лише ack reactions (підтвердження до відповіді) |
"minimal" | Так | Так (обмежено) | Ack + реакції агента з обережними вказівками |
"extensive" | Так | Так (заохочуються) | Ack + реакції агента з активним заохоченням |
"minimal".
Для перевизначень окремих облікових записів використовуйте channels.whatsapp.accounts.<id>.reactionLevel.
Реакції-підтвердження
WhatsApp підтримує негайні ack reactions після отримання вхідного повідомлення черезchannels.whatsapp.ackReaction.
Ack reactions залежать від reactionLevel — вони пригнічуються, коли reactionLevel дорівнює "off".
- надсилаються одразу після прийняття вхідного повідомлення (до відповіді)
- збої логуються, але не блокують звичайну доставку відповіді
- у груповому режимі
mentionsреакція ставиться для ходів, активованих згадкою; групова активаціяalwaysоминає цю перевірку - WhatsApp використовує
channels.whatsapp.ackReaction(застарілеmessages.ackReactionтут не використовується)
Кілька облікових записів і облікові дані
Вибір облікового запису та типові значення
Вибір облікового запису та типові значення
- ID облікових записів беруться з
channels.whatsapp.accounts - типове вибирання облікового запису:
default, якщо він є, інакше перший налаштований ID облікового запису (відсортований) - ID облікових записів внутрішньо нормалізуються для пошуку
Шляхи до облікових даних і сумісність із застарілими даними
Шляхи до облікових даних і сумісність із застарілими даними
- поточний шлях до auth:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - резервний файл:
creds.json.bak - застаріла default auth у
~/.openclaw/credentials/усе ще розпізнається/мігрує для сценаріїв з default account
Поведінка виходу
Поведінка виходу
openclaw channels logout --channel whatsapp [--account <id>] очищає стан auth WhatsApp для цього облікового запису.У каталогах застарілої auth oauth.json зберігається, тоді як файли auth Baileys видаляються.Інструменти, дії та записи конфігурації
- Підтримка інструментів агента включає дію реакції WhatsApp (
react). - Обмеження дій:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Записи конфігурації, ініційовані з каналу, типово ввімкнені (вимкнення через
channels.whatsapp.configWrites=false).
Усунення проблем
Не прив’язано (потрібен QR)
Не прив’язано (потрібен QR)
Симптом: статус каналу повідомляє, що прив’язку не виконано.Виправлення:
Прив’язано, але відключено / цикл повторного підключення
Прив’язано, але відключено / цикл повторного підключення
Симптом: прив’язаний обліковий запис із повторюваними відключеннями або спробами повторного підключення.Виправлення:За потреби прив’яжіть заново через
channels login.Немає активного listener під час надсилання
Немає активного listener під час надсилання
Вихідні надсилання швидко завершуються помилкою, якщо для цільового облікового запису немає активного listener gateway.Переконайтеся, що gateway працює і обліковий запис прив’язано.
Групові повідомлення неочікувано ігноруються
Групові повідомлення неочікувано ігноруються
Перевіряйте в такому порядку:
groupPolicygroupAllowFrom/allowFrom- записи allowlist у
groups - вимогу згадки (
requireMention+ шаблони згадок) - дубльовані ключі в
openclaw.json(JSON5): пізніші записи перевизначають попередні, тому залишайте лише одинgroupPolicyдля кожної області
Попередження про runtime Bun
Попередження про runtime Bun
Runtime gateway WhatsApp має використовувати Node. Bun позначено як несумісний для стабільної роботи gateway WhatsApp/Telegram.
Вказівники на довідник конфігурації
Основний довідник: Важливі поля WhatsApp:- доступ:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - доставка:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - кілька облікових записів:
accounts.<id>.enabled,accounts.<id>.authDir, перевизначення на рівні облікового запису - операції:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.* - поведінка сесії:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit