Платформы обмена сообщениями
Статус: готов к работе в production через WhatsApp Web (Baileys). Шлюз владеет связанными сессиями.
Быстрая настройка
Шаг 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: Запустите шлюз
openclaw gateway
Шаг 4: Одобрите первый запрос на спаривание (если используется режим спаривания)
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
Запросы на спаривание истекают через 1 час. Ожидающие запросы ограничены 3 на канал.
ℹ️ OpenClaw рекомендует по возможности использовать для WhatsApp отдельный номер. (Метаданные канала и процесс подключения оптимизированы для такой настройки, но также поддерживается использо вание личного номера.)
Паттерны развертывания
Это самый чистый режим работы:
- отдельная идентичность WhatsApp для OpenClaw
- более четкие списки разрешений для DM и границы маршрутизации
- меньшая вероятность путаницы с собственными чатами
Минимальный шаблон политики:
{
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551234567"],
},
},
}
Процесс подключения поддерживает режим личного номера и создает базовую конфигурацию, удобную для собственных чатов:
dmPolicy: "allowlist"allowFromвключает ваш личный номерselfChatMode: true
Во время выполнения защита от собственных чатов использует привязанный собственный номер и allowFrom.
Канал платформы обмена сообщениями в текущей архитектуре каналов OpenClaw основан на WhatsApp Web (Baileys). Встроенный реестр чат-каналов не содержит отдельного канала обмена сообщениями WhatsApp от Twilio.
Модель выполнения
- Шлюз владеет сокетом WhatsApp и циклом переподключения.
- Для исходящих отправок требуется активный слушатель WhatsApp для целевого аккаунта.
- Статусные и широковещательные чаты игнорируются (
@status,@broadcast). - Прямые чаты используют правила сессии DM (
session.dmScope; по умолчаниюmainобъединяет DM в основную сессию агента). - Групповые сессии изолированы (
agent::whatsapp:group:).
Контроль доступа и активация
channels.whatsapp.dmPolicy управляет доступом к прямым чатам:
pairing(по умолчанию)allowlistopen(требует, чтобыallowFromвключал"*")disabled
allowFrom принимает номера в формате E.164 (нормализуются внутренне).Переопределение для нескольких аккаунтов: channels.whatsapp.accounts..dmPolicy (и allowFrom) имеют приоритет над настройками уровня канала по умолчанию для этого аккаунта.Детали поведения во время выполнения:
- спаривания сохраняются в хранилище разрешений канала и объединяются с настроенным
allowFrom - если список разрешений не настроен, привязанный собственный номер разрешен по умолчанию
- исходящие DM
fromMeникогда не спариваются автоматически
Доступ к группам имеет два уровня:
- Список разрешенных участников группы (
channels.whatsapp.groups)- если
groupsопущен, все группы подходят - если
groupsприсутствует, он действует как список разрешенных групп ("*"разрешено)
- если
- Политика отправителя в группе (
channels.whatsapp.groupPolicy+groupAllowFrom)open: список разрешений отправителя обходитсяallowlist: отправитель должен соответствоватьgroupAllowFrom(или*)disabled: блокировать все входящие сообщения из групп
Резервный список разрешений отправителя:
- если
groupAllowFromне задан, во время выполнения используетсяallowFrom, если он доступен - списки разрешений отправителя оцениваются до активации упоминания/ответа
Примечание: если блок channels.whatsapp вообще отсутствует, резервная политика группы во время выполнения — allowlist (с предупреждением в логе), даже если задан channels.defaults.groupPolicy.
Ответы в группах по умолчанию требуют упоминания.Обнаружение упоминаний включает:
- явные упоминания идентичности бота в WhatsApp
- настроенные шаблоны регулярных выражений для упоминаний (
agents.list[].groupChat.mentionPatterns, резервный вариантmessages.groupChat.mentionPatterns) - неявное обнаружение ответа-боту (отправитель ответа соответствует идентичности бота)
Примечание по безопасности:
- цитирование/ответ удовлетворяет только условию упоминания; оно не предоставляет авторизацию отправителя
- при
groupPolicy: "allowlist"отправители, не входящие в список разрешений, все равно блокируются, даже если они отвечают на сообщение пользователя из списка разрешений
Команда активации на уровне сессии:
/activation mention/activation always
activation обновляет состояние сессии (не глобальную конфигурацию). Она доступна только владельцу.
Личный номер и поведение в собственных чатах
Когда привязанный собственный номер также присутствует в allowFrom, активируются защитные механизмы собственных чатов WhatsApp:
- пропускать квитанции о прочтении для ходов в собственном чате
- игнорировать поведение автоматического срабатывания по JID упоминания, которое в противном случае отправляло бы пинг вам самому
- если
messages.responsePrefixне задан, ответы в собственном чате по умолчанию имеют вид[{identity.name}]или[openclaw]
Нормализация сообщений и контекст
Входящие сообщения WhatsApp оборачиваются в общий входящий конверт.Если существует цитируемый ответ, контекст добавляется в такой форме:
[Ответ <sender> id:<stanzaId>]
<цитируемый текст или заполнитель медиа>
[/Ответ]
Метаданные ответа также заполняются, когда доступны (ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 отправителя).
Входящие сообщения, содержащие только медиа, нормализуются с заполнителями, такими как:
<media:image><media:video><media:audio><media:document><media:sticker>
Полезные нагрузки местоположения и контактов нормализуются в текстовый контекст перед маршрутизацией.
Для групп необработанные сообщения могут буферизоваться и вводиться как контекст, когда бот наконец срабатывает.
- лимит по умолчанию:
50 - конфигурация:
channels.whatsapp.historyLimit - резервный вариант:
messages.groupChat.historyLimit 0отключает
Маркеры инъекции:
[Сообщения в чате с момента вашего последнего ответа - для контекста][Текущее сообщение - ответьте на него]
Квитанции о прочтении в ключены по умолчанию для принятых входящих сообщений WhatsApp.Отключить глобально:
{
channels: {
whatsapp: {
sendReadReceipts: false,
},
},
}
Переопределение для конкретного аккаунта:
{
channels: {
whatsapp: {
accounts: {
work: {
sendReadReceipts: false,
},
},
},
},
}
Ходы в собственном чате пропускают квитанции о прочтении, даже если они включены глобально.