Перейти до основного вмісту

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.
Ручне встановлення також доступне:
openclaw plugins install @openclaw/whatsapp

Підключення

Типова політика DM для невідомих відправників — pairing.

Усунення проблем із каналами

Кросканальна діагностика та сценарії відновлення.

Конфігурація Gateway

Повні шаблони та приклади конфігурації каналу.

Швидке налаштування

1

Налаштуйте політику доступу WhatsApp

{
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      allowFrom: ["+15551234567"],
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15551234567"],
    },
  },
}
2

Прив’яжіть WhatsApp (QR)

openclaw channels login --channel whatsapp
Для конкретного облікового запису:
openclaw channels login --channel whatsapp --account work
3

Запустіть gateway

openclaw gateway
4

Схваліть перший запит на pairing (якщо використовується режим pairing)

openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
Термін дії запитів на pairing спливає через 1 годину. Для кожного каналу може бути не більше 3 незавершених запитів.
OpenClaw рекомендує за можливості запускати WhatsApp на окремому номері. (Метадані каналу та процес налаштування оптимізовано для такого варіанта, але конфігурації з особистим номером також підтримуються.)

Сценарії розгортання

Це найзручніший операційний режим:
  • окрема ідентичність WhatsApp для OpenClaw
  • чіткіші allowlist для DM та межі маршрутизації
  • менша ймовірність плутанини з чатом із самим собою
Мінімальний шаблон політики:
{
  channels: {
    whatsapp: {
      dmPolicy: "allowlist",
      allowFrom: ["+15551234567"],
    },
  },
}
Onboarding підтримує режим особистого номера і записує базову конфігурацію, зручну для чату із самим собою:
  • dmPolicy: "allowlist"
  • allowFrom містить ваш особистий номер
  • selfChatMode: true
Під час runtime захист чату із самим собою спирається на прив’язаний власний номер і allowFrom.
Канал платформи обміну повідомленнями у поточній архітектурі каналів 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>).

Контроль доступу та активація

channels.whatsapp.dmPolicy керує доступом до прямих чатів:
  • pairing (типово)
  • allowlist
  • open (потребує, щоб allowFrom містив "*")
  • disabled
allowFrom приймає номери у форматі E.164 (внутрішньо нормалізуються).Перевизначення для кількох облікових записів: channels.whatsapp.accounts.<id>.dmPolicyallowFrom) мають пріоритет над значеннями канального рівня для цього облікового запису.Подробиці поведінки 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]

Нормалізація повідомлень і контекст

Вхідні повідомлення WhatsApp обгортаються в спільну inbound envelope.Якщо існує цитована відповідь, контекст додається в такому вигляді:
[Replying to <sender> id:<stanzaId>]
<quoted body or media placeholder>
[/Replying]
Метадані відповіді також заповнюються, коли доступні (ReplyToId, ReplyToBody, ReplyToSender, sender JID/E.164).
Вхідні повідомлення лише з медіа нормалізуються за допомогою заповнювачів, наприклад:
  • <media:image>
  • <media:video>
  • <media:audio>
  • <media:document>
  • <media:sticker>
Дані location і contact нормалізуються в текстовий контекст перед маршрутизацією.
Для груп необроблені повідомлення можуть буферизуватися й додаватися як контекст, коли бот нарешті активується.
  • типове обмеження: 50
  • конфігурація: channels.whatsapp.historyLimit
  • резервне значення: messages.groupChat.historyLimit
  • 0 вимикає
Маркери додавання:
  • [Chat messages since your last reply - for context]
  • [Current message - respond to this]
Read receipts типово ввімкнені для прийнятих вхідних повідомлень WhatsApp.Вимкнення глобально:
{
  channels: {
    whatsapp: {
      sendReadReceipts: false,
    },
  },
}
Перевизначення для окремого облікового запису:
{
  channels: {
    whatsapp: {
      accounts: {
        work: {
          sendReadReceipts: false,
        },
      },
    },
  },
}
Для 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.
{
  channels: {
    whatsapp: {
      reactionLevel: "ack",
    },
  },
}

Реакції-підтвердження

WhatsApp підтримує негайні ack reactions після отримання вхідного повідомлення через channels.whatsapp.ackReaction. Ack reactions залежать від reactionLevel — вони пригнічуються, коли reactionLevel дорівнює "off".
{
  channels: {
    whatsapp: {
      ackReaction: {
        emoji: "👀",
        direct: true,
        group: "mentions", // always | mentions | never
      },
    },
  },
}
Примітки щодо поведінки:
  • надсилаються одразу після прийняття вхідного повідомлення (до відповіді)
  • збої логуються, але не блокують звичайну доставку відповіді
  • у груповому режимі 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.reactions
    • channels.whatsapp.actions.polls
  • Записи конфігурації, ініційовані з каналу, типово ввімкнені (вимкнення через channels.whatsapp.configWrites=false).

Усунення проблем

Симптом: статус каналу повідомляє, що прив’язку не виконано.Виправлення:
openclaw channels login --channel whatsapp
openclaw channels status
Симптом: прив’язаний обліковий запис із повторюваними відключеннями або спробами повторного підключення.Виправлення:
openclaw doctor
openclaw logs --follow
За потреби прив’яжіть заново через channels login.
Вихідні надсилання швидко завершуються помилкою, якщо для цільового облікового запису немає активного listener gateway.Переконайтеся, що gateway працює і обліковий запис прив’язано.
Перевіряйте в такому порядку:
  • groupPolicy
  • groupAllowFrom / allowFrom
  • записи allowlist у groups
  • вимогу згадки (requireMention + шаблони згадок)
  • дубльовані ключі в openclaw.json (JSON5): пізніші записи перевизначають попередні, тому залишайте лише один groupPolicy для кожної області
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

Пов’язане