Установка
openclaw onboard и openclaw channels add --channel whatsapp предлагают установить плагин при его первом выборе; openclaw channels login --channel whatsapp предлагает тот же процесс установки, если плагин отсутствует. В рабочих копиях для разработки используется локальный путь к плагину; при стабильной или бета-установке сначала устанавливается @openclaw/whatsapp из ClawHub, а при неудаче используется npm. Среда выполнения WhatsApp поставляется вне основного npm-пакета OpenClaw, поэтому её зависимости среды выполнения остаются во внешнем плагине. Установка вручную:
@openclaw/whatsapp) только как резервный вариант для реестра; закрепляйте точную версию только для воспроизводимой установки.
Связывание
Устранение неполадок каналов
Настройка Gateway
Быстрая настройка
Настройте политику доступа
Свяжите WhatsApp (QR-код)
Запустите Gateway
Одобрите первый запрос на связывание (режим связывания)
Схемы развёртывания
Выделенный номер (рекомендуется)
Выделенный номер (рекомендуется)
- отдельная идентичность WhatsApp для OpenClaw
- более чёткие списки разрешённых отправителей личных сообщений и границы маршрутизации
- меньше вероятность путаницы с чатом с самим собой
Резервный вариант с личным номером
Резервный вариант с личным номером
dmPolicy: "allowlist", allowFrom, включая ваш собственный номер, selfChatMode: true. Защита среды выполнения для чата с самим собой опирается на связанный собственный номер и allowFrom.Модель среды выполнения
- Gateway управляет сокетом WhatsApp и циклом повторного подключения.
- Сторожевой механизм независимо отслеживает два сигнала: активность транспорта WhatsApp Web на низком уровне и активность сообщений приложения. Тихий, но подключённый сеанс не перезапускается только из-за того, что в последнее время не поступали сообщения; принудительное повторное подключение происходит, только если транспортные кадры перестают поступать в течение фиксированного внутреннего интервала (не настраивается пользователем) или сообщения приложения отсутствуют дольше четырёхкратного обычного тайм-аута сообщений. Сразу после повторного подключения недавно активного сеанса для первого интервала используется более короткий обычный тайм-аут сообщений вместо четырёхкратного интервала. OpenClaw может автоматически отвечать на офлайн-сообщения, которые Baileys доставляет в начале такого повторного подключения, в пределах срока дедупликации идентификаторов входящих сообщений; при первоначальном запуске сохраняется короткая защита от устаревшей истории.
- Временные параметры сокета Baileys явно задаются в
web.whatsapp.*:keepAliveIntervalMs(интервал проверки связи приложения),connectTimeoutMs(тайм-аут начального рукопожатия),defaultQueryTimeoutMs(ожидание запросов Baileys, а также тайм-ауты OpenClaw для исходящей отправки, статуса присутствия и входящих подтверждений прочтения). - Для исходящей отправки требуется активный слушатель WhatsApp для целевой учётной записи; в противном случае отправка немедленно завершается ошибкой.
- При отправке в группы добавляются собственные метаданные упоминаний для токенов
@+<digits>и@<digits>(в тексте и подписях к медиафайлам), если токен соответствует текущим метаданным участника, включая группы на основе LID. - Чаты статусов и рассылок (
@status,@broadcast) игнорируются. - В личных чатах применяются правила сеансов личных сообщений (
session.dmScope; значение по умолчаниюmainобъединяет личные сообщения в основном сеансе агента). Групповые сеансы изолируются по JID (agent:<agentId>:whatsapp:group:<jid>). - Каналы и рассылки WhatsApp могут быть явно указаны в качестве целей исходящей отправки через их собственный JID
@newsletter, при этом используются метаданные сеанса канала (agent:<agentId>:whatsapp:channel:<jid>), а не семантика личных сообщений. - Транспорт WhatsApp Web учитывает стандартные переменные среды прокси на узле Gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXYи варианты в нижнем регистре). Предпочитайте настройку прокси на уровне узла параметрам отдельных каналов. - Если включён
messages.removeAckAfterReply, OpenClaw удаляет реакцию подтверждения после доставки видимого ответа.
Вызов текущего отправителя с помощью MeowCaller (экспериментальная функция)
Плагин может предоставлятьwhatsapp_call в запусках агента, инициированных из WhatsApp. Он использует MeowCaller, чтобы совершить голосовой вызов WhatsApp текущему авторизованному отправителю и воспроизвести сообщение OpenClaw, синтезированное посредством TTS, после ответа. У инструмента нет параметра номера назначения, поэтому запрос не может перенаправить вызов. По умолчанию отключено.
Включите экспериментальные вызовы
actions.calls: true в конфигурацию канала WhatsApp и перезапустите Gateway:false, OpenClaw не предоставляет инструмент whatsapp_call.Установите проверенный CLI MeowCaller
meowcaller в PATH на узле Gateway. До слияния PR MeowCaller № 7 соберите проверенную ветку:$HOME/.local/bin входит в PATH службы Gateway. В этой редакции явно предусмотрены команды pair и notify только для отправки; notify не открывает микрофон, динамик, видеоустройство или диагностический захват. Не заменяйте её командой play из примера CLI вышестоящего проекта.Свяжите подключённое устройство MeowCaller
whatsapp_call сообщает каталог состояния для конкретной учётной записи и команду связывания). Для учётной записи по умолчанию:MeowCaller linked device ready. Храните wa-voip.db в тайне — это сеанс MeowCaller. Для учётных записей не по умолчанию действие состояния предоставляет отдельный путь к хранилищу; в Windows выполните соответствующую команду PowerShell.Настройте TTS и совершите вызов из WhatsApp
Call me and say the build finished.. Инструмент определяет отправителя из доверенного входящего контекста, синтезирует временный закрытый WAV-файл, запускает MeowCaller на ограниченное время вызова и после этого удаляет аудиофайл. OpenClaw явно передаёт хранилище учётной записи, ожидает нулевой код завершения после ответа, воспроизведения и завершения вызова и считает тайм-аут или ненулевой код завершения неудачным вызовом инструмента.Запросы на одобрение
WhatsApp может отображать запросы на одобрение выполнения команд и действий плагинов в виде реакций👍/👎, управляемых конфигурацией пересылки одобрений верхнего уровня:
approvals.exec и approvals.plugin независимы друг от друга; включение WhatsApp в качестве канала только подключает транспорт и ничего не отправляет, если соответствующий тип одобрений не включён и не направлен туда. Режим сеанса доставляет собственные одобрения с помощью эмодзи только для запросов на одобрение, поступивших из WhatsApp. Режим целей использует общий конвейер пересылки для явно заданных целей и не создаёт отдельную рассылку личных сообщений утверждающим лицам.
Для реакций одобрения WhatsApp требуется явно указать утверждающих лиц в allowFrom (или "*"). defaultTo задаёт обычные цели сообщений по умолчанию, а не список утверждающих лиц. Команды /approve, введённые вручную, по-прежнему проходят обычную проверку авторизации отправителя WhatsApp перед обработкой одобрения.
Хуки плагинов и конфиденциальность
Входящие сообщения WhatsApp могут содержать личные сведения, номера телефонов, идентификаторы групп, имена отправителей и поля корреляции сеансов. WhatsApp не рассылает входящие полезные нагрузки хукаmessage_received плагинам, если вы явно не разрешите это:
channels.whatsapp.accounts.<id>.pluginHooks.messageReceived. Включайте его только для плагинов, которым вы доверяете содержимое и идентификаторы входящих сообщений WhatsApp.
Управление доступом и активация
- Политика личных сообщений
- Политика групп и списки разрешений
- Упоминания и /activation
channels.whatsapp.dmPolicy:allowFrom принимает номера в формате E.164 (с внутренней нормализацией). Это только список управления доступом отправителей личных сообщений — он не ограничивает явную исходящую отправку в групповые JID или JID каналов @newsletter.Переопределение для нескольких учётных записей: channels.whatsapp.accounts.<id>.dmPolicy (и .allowFrom) имеют приоритет над значениями канала по умолчанию для соответствующей учётной записи.Примечания о среде выполнения:- сопряжения сохраняются в хранилище разрешений канала и объединяются с настроенными
allowFrom - запланированная автоматизация и резервный выбор получателя Heartbeat используют явные цели доставки или настроенные
allowFrom; одобрения сопряжения в личных сообщениях не становятся неявными получателями Cron/Heartbeat - если список разрешений не настроен, привязанный собственный номер разрешён по умолчанию
- OpenClaw никогда автоматически не сопрягает исходящие личные сообщения
fromMe(сообщения, которые вы отправляете себе с привязанного устройства)
Настроенные привязки ACP
WhatsApp поддерживает постоянные привязки ACP черезbindings[] верхнего уровня:
Поведение личного номера и чата с собой
Когда привязанный собственный номер также присутствует вallowFrom, активируются защитные меры для чата с собой: отключаются уведомления о прочтении для сообщений в чате с собой, игнорируется автоматический запуск по JID упоминания, который привёл бы к упоминанию самого себя, а ответы по умолчанию направляются в [{identity.name}] (или [openclaw]), если messages.responsePrefix не задан.
Нормализация сообщений и контекст
Оболочка входящего сообщения и контекст ответа
Оболочка входящего сообщения и контекст ответа
ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 отправителя) заполняются при наличии. Если цитируемый объект является доступным для скачивания медиафайлом, OpenClaw сохраняет его через обычное хранилище входящих медиафайлов и предоставляет MediaPath/MediaType, чтобы агент мог просмотреть его напрямую, а не видеть только <media:image>.Заполнители медиафайлов и извлечение местоположения и контактов
Заполнители медиафайлов и извлечение местоположения и контактов
<media:image>, <media:video>, <media:audio>, <media:document>, <media:sticker>.Авторизованные групповые голосовые сообщения расшифровываются до проверки упоминания, если тело содержит только <media:audio>, поэтому произнесённое в голосовом сообщении упоминание бота может вызвать ответ. Если расшифровка по-прежнему не упоминает бота, она сохраняется в ожидающей истории группы вместо необработанного заполнителя.Данные о местоположении отображаются как краткий текст с координатами. Метки и комментарии местоположения, а также сведения о контактах и vCard отображаются как ограждённые недоверенные метаданные, а не как встроенный текст запроса.Добавление ожидающей истории группы
Добавление ожидающей истории группы
- ограничение по умолчанию:
50 - конфигурация:
channels.whatsapp.historyLimit, резервный вариант —messages.groupChat.historyLimit 0отключает эту функцию
[Chat messages since your last reply - for context] и [Current message - respond to this].Уведомления о прочтении
Уведомления о прочтении
channels.whatsapp.accounts.<id>.sendReadReceipts. Для сообщений в чате с собой уведомления о прочтении пропускаются, даже если они включены глобально.Доставка, разбиение на части и медиафайлы
Разбиение текста на части
Разбиение текста на части
- ограничение размера части по умолчанию:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.streaming.chunkMode = "length" | "newline";newlineпредпочитает границы абзацев (пустые строки), а затем использует безопасное разбиение по длине
Поведение исходящих медиафайлов
Поведение исходящих медиафайлов
- поддерживаются изображения, видео, аудио (голосовые сообщения PTT) и документы
- аудио отправляется как полезная нагрузка Baileys
audioсptt: trueи отображается как голосовое сообщение push-to-talk;audioAsVoiceсохраняется в полезной нагрузке ответа, поэтому голосовой вывод TTS остаётся на этом пути независимо от исходного формата провайдера - аудио в собственном формате Ogg/Opus отправляется как
audio/ogg; codecs=opus; всё остальное (включая вывод Microsoft Edge TTS в MP3/WebM) перед доставкой PTT перекодируется с помощьюffmpegв монофонический Ogg/Opus с частотой 48 кГц /tts latestотправляет последний ответ ассистента как одно голосовое сообщение и предотвращает повторную отправку того же ответа;/tts chat on|off|defaultуправляет автоматическим TTS для текущего чата- включение
gifPlayback: trueдля видео активирует воспроизведение анимированных GIF forceDocument/asDocumentнаправляет исходящие изображения, GIF и видео через полезную нагрузку документа Baileys, чтобы избежать сжатия медиафайлов в WhatsApp и сохранить определённые имя файла и MIME-тип- подписи применяются к первому медиафайлу в ответе с несколькими медиафайлами, кроме голосовых сообщений PTT: аудио отправляется первым без подписи, затем подпись отправляется отдельным текстовым сообщением (клиенты WhatsApp отображают подписи к голосовым сообщениям непоследовательно)
- источником медиафайла может быть HTTP(S),
file://или локальный путь
Ограничения размера медиафайлов и резервное поведение
Ограничения размера медиафайлов и резервное поведение
- ограничение сохранения входящих и отправки исходящих медиафайлов:
channels.whatsapp.mediaMaxMb(по умолчанию50) - переопределение для отдельной учётной записи:
channels.whatsapp.accounts.<id>.mediaMaxMb - изображения автоматически оптимизируются (изменение размера и перебор качества) для соответствия ограничениям, если
forceDocument/asDocumentне запрашивает доставку в виде документа - при ошибке отправки медиафайла резервный вариант для первого элемента отправляет текстовое предупреждение вместо молчаливого удаления ответа
Цитирование при ответе
channels.whatsapp.replyToMode управляет встроенным цитированием ответов (исходящие ответы визуально цитируют входящее сообщение):
channels.whatsapp.accounts.<id>.replyToMode.
Уровень реакций
channels.whatsapp.reactionLevel определяет, насколько широко агент использует реакции с эмодзи:
channels.whatsapp.accounts.<id>.reactionLevel.
Реакции подтверждения
channels.whatsapp.ackReaction отправляет немедленную реакцию при получении входящего сообщения с учётом reactionLevel (подавляется при "off"):
ackReaction присутствует без emoji, WhatsApp использует эмодзи идентификатора назначенного агента, а при его отсутствии — ”👀” (не указывайте ackReaction или задайте emoji: "", чтобы отключить подтверждение); ошибки регистрируются в журнале, но не блокируют доставку ответа; групповой режим mentions реагирует только на ходы, запущенные упоминанием, а групповая активация always обходит эту проверку; WhatsApp использует только channels.whatsapp.ackReaction (устаревший messages.ackReaction здесь не применяется).
Реакции состояния жизненного цикла
Задайтеmessages.statusReactions.enabled: true, чтобы WhatsApp во время хода заменял реакцию подтверждения вместо сохранения статичного эмодзи получения, последовательно переключаясь между такими состояниями, как ожидание в очереди, размышление, активность инструментов, Compaction, завершение и ошибка:
channels.whatsapp.ackReaction по-прежнему определяет доступность для личных сообщений и групп; состояние ожидания в очереди использует тот же фактический эмодзи, что и обычные реакции подтверждения; WhatsApp предоставляет один слот реакции бота на сообщение, поэтому обновления жизненного цикла заменяют текущую реакцию на месте; messages.removeAckAfterReply: true удаляет финальную реакцию состояния после настроенного периода удержания состояния завершения или ошибки; категории эмодзи инструментов включают tool, coding, web, deploy, build и concierge.
Несколько учётных записей и учётные данные
Выбор учётной записи и значения по умолчанию
Выбор учётной записи и значения по умолчанию
channels.whatsapp.accounts. Если присутствует default, по умолчанию выбирается он; иначе выбирается первый настроенный идентификатор учётной записи (в алфавитном порядке). Для внутреннего поиска идентификаторы учётных записей нормализуются.Пути к учётным данным и совместимость с устаревшими версиями
Пути к учётным данным и совместимость с устаревшими версиями
- текущий путь аутентификации:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json(резервная копия:creds.json.bak) - устаревшие данные аутентификации по умолчанию в
~/.openclaw/credentials/по-прежнему распознаются и переносятся для сценариев с учётной записью по умолчанию
Поведение при выходе
Поведение при выходе
openclaw channels logout --channel whatsapp [--account <id>] очищает состояние аутентификации WhatsApp для этой учётной записи. Если Gateway доступен, при выходе сначала останавливается активный слушатель этой учётной записи, поэтому связанный сеанс перестаёт получать сообщения ещё до следующего перезапуска. openclaw channels remove --channel whatsapp также останавливает активный слушатель перед отключением или удалением конфигурации учётной записи.В устаревших каталогах аутентификации oauth.json сохраняется, а файлы аутентификации Baileys удаляются.Инструменты, действия и запись конфигурации
- Инструменты агента поддерживают действие реакции WhatsApp (
react). - Ограничители действий:
channels.whatsapp.actions.reactions,channels.whatsapp.actions.polls(для существующих действий по умолчанию используетсяtrue),channels.whatsapp.actions.calls(по умолчаниюfalse, см. MeowCaller выше). - Запись конфигурации, инициированная каналом, по умолчанию включена; отключите её через
channels.whatsapp.configWrites: false.
Устранение неполадок
Связь не установлена (требуется QR-код)
Связь не установлена (требуется QR-код)
Связь установлена, но соединение разорвано / цикл переподключения
Связь установлена, но соединение разорвано / цикл переподключения
status=408 Request Time-out Connection was lost, настройте временные параметры сокета Baileys в web.whatsapp. Сначала уменьшите keepAliveIntervalMs до значения ниже тайм-аута простоя вашей сети и увеличьте connectTimeoutMs для медленных соединений или соединений с потерями:~/.openclaw/logs/whatsapp-health.log сообщает Gateway inactive, но openclaw gateway status и openclaw channels status --probe показывают исправное состояние, выполните openclaw doctor. В Linux doctor предупреждает об устаревших записях crontab, вызывающих выведенный из эксплуатации скрипт ~/.openclaw/bin/ensure-whatsapp.sh; удалите эти записи с помощью crontab -e — в окружении Cron может отсутствовать пользовательская шина systemd, из-за чего старый скрипт неверно сообщает о состоянии Gateway.Вход по QR-коду завершается по тайм-ауту при работе через прокси
Вход по QR-коду завершается по тайм-ауту при работе через прокси
openclaw channels login --channel whatsapp завершается с ошибкой до отображения пригодного QR-кода, сообщая status=408 Request Time-out или разрыв TLS-соединения сокета.Для входа в WhatsApp Web используется стандартное прокси-окружение хоста Gateway (HTTPS_PROXY, HTTP_PROXY, варианты в нижнем регистре, NO_PROXY). Убедитесь, что процесс Gateway наследует переменные окружения прокси и что NO_PROXY не соответствует mmg.whatsapp.net.При отправке отсутствует активный слушатель
При отправке отсутствует активный слушатель
Ответ отображается в расшифровке, но отсутствует в WhatsApp
Ответ отображается в расшифровке, но отсутствует в WhatsApp
auto-reply delivery failed или auto-reply was not accepted by WhatsApp provider.Сообщения группы неожиданно игнорируются
Сообщения группы неожиданно игнорируются
groupPolicy, groupAllowFrom/allowFrom, записи списка разрешений groups, фильтрацию по упоминаниям (requireMention + шаблоны упоминаний) и повторяющиеся ключи в openclaw.json (в JSON5 более поздние записи переопределяют предыдущие — оставляйте только один groupPolicy для каждой области).Если присутствует channels.whatsapp.groups, WhatsApp по-прежнему может видеть сообщения из других групп, но OpenClaw отбрасывает их до маршрутизации сеанса. Добавьте JID группы в channels.whatsapp.groups или добавьте groups["*"], чтобы разрешить все группы, сохранив авторизацию отправителей через groupPolicy/groupAllowFrom.Предупреждение среды выполнения Bun
Предупреждение среды выполнения Bun
node:sqlite, используемый каноническим хранилищем состояния, а doctor переносит устаревшие службы Bun на Node.Системные промпты
WhatsApp поддерживает системные промпты в стиле Telegram для групп и личных чатов через картыgroups и direct.
Разрешение для групповых сообщений: сначала определяется действующая карта groups — если в учётной записи вообще определён собственный ключ groups, он полностью заменяет корневую карту groups (без глубокого слияния). Затем поиск промпта выполняется в единственной результирующей карте:
- Промпт для конкретной группы (
groups["<groupId>"].systemPrompt): используется, когда запись группы существует и в ней определён ключsystemPrompt. Пустая строка ("") подавляет подстановочный знак, и промпт не применяется. - Промпт с подстановочным знаком для групп (
groups["*"].systemPrompt): используется, когда запись конкретной группы отсутствует или существует без ключаsystemPrompt.
direct и direct["*"].
dms остаётся упрощённым контейнером переопределений истории для отдельных личных сообщений (dms.<id>.historyLimit). Переопределения промптов находятся в direct.groups/direct учётной записи, включая явно заданный пустой объект, заменяет корневую карту. Это отличается от описанной выше проверки списка разрешений для членства в группах, где для единственной учётной записи предусмотрена защита от случайно пустого groups: {}.groups для каждой учётной записи в конфигурации с несколькими учётными записями (даже если у учётной записи нет собственного groups), чтобы бот не получал сообщения из групп, в которых он не состоит. WhatsApp не применяет эту защиту — корневые groups/direct наследуются любой учётной записью без собственного переопределения независимо от количества учётных записей. Если в конфигурации WhatsApp с несколькими учётными записями нужны отдельные промпты для каждой учётной записи, явно определите полную карту в каждой из них.
Важные особенности поведения:
channels.whatsapp.groupsодновременно является картой конфигурации для отдельных групп и списком разрешений групп на уровне чата. Как в корневой области, так и в области учётной записиgroups["*"]означает «разрешены все группы» для этой области.- Добавляйте подстановочный знак
systemPrompt, только если вы уже хотите разрешить все группы в этой области. Чтобы оставить доступным только фиксированный набор идентификаторов групп, повторите промпт в каждой явно разрешённой записи вместо использованияgroups["*"]. - Допуск группы и авторизация отправителя проверяются отдельно.
groups["*"]расширяет перечень групп, сообщения из которых передаются в обработку групп; это не авторизует всех отправителей в этих группах — их авторизация по-прежнему управляется черезgroupPolicy/groupAllowFrom. channels.whatsapp.directне имеет аналогичного побочного эффекта для личных сообщений:direct["*"]лишь предоставляет конфигурацию по умолчанию после того, как личное сообщение уже допущено согласноdmPolicyсовместно сallowFromили правилами хранилища сопряжений.