WhatsApp (canal web)
Estado: listo para producción mediante WhatsApp Web (Baileys). Gateway posee las sesiones vinculadas.Instalación (bajo demanda)
- La incorporación (
openclaw onboard) yopenclaw channels add --channel whatsappsolicitan instalar el plugin de WhatsApp la primera vez que lo seleccionas. openclaw channels login --channel whatsapptambién ofrece el flujo de instalación cuando el plugin aún no está presente.- Canal de desarrollo + checkout de git: usa de forma predeterminada la ruta local del plugin.
- Stable/Beta: usa de forma predeterminada el paquete npm
@openclaw/whatsapp.
Vinculación
La política predeterminada de mensajes directos es la vinculación para remitentes desconocidos.
Solución de problemas del canal
Diagnósticos multicanal y guías de reparación.
Configuración de Gateway
Patrones y ejemplos completos de configuración del canal.
Configuración rápida
OpenClaw recomienda ejecutar WhatsApp en un número separado cuando sea posible. (Los metadatos del canal y el flujo de configuración están optimizados para esa configuración, pero también se admiten configuraciones con número personal).
Patrones de implementación
Número dedicado (recomendado)
Número dedicado (recomendado)
Este es el modo operativo más limpio:
- identidad de WhatsApp separada para OpenClaw
- listas de permitidos de mensajes directos y límites de enrutamiento más claros
- menor probabilidad de confusión con el chat propio
Alternativa con número personal
Alternativa con número personal
La incorporación admite el modo de número personal y escribe una base compatible con chat propio:
dmPolicy: "allowlist"allowFromincluye tu número personalselfChatMode: true
allowFrom.Alcance del canal solo de WhatsApp Web
Alcance del canal solo de WhatsApp Web
El canal de la plataforma de mensajería está basado en WhatsApp Web (
Baileys) en la arquitectura actual de canales de OpenClaw.No hay un canal de mensajería de WhatsApp separado de Twilio en el registro integrado de canales de chat.Modelo de tiempo de ejecución
- Gateway posee el socket de WhatsApp y el bucle de reconexión.
- Los envíos salientes requieren un listener activo de WhatsApp para la cuenta de destino.
- Los chats de estado y difusión se ignoran (
@status,@broadcast). - Los chats directos usan reglas de sesión de mensajes directos (
session.dmScope; el valor predeterminadomaincolapsa los mensajes directos en la sesión principal del agente). - Las sesiones de grupo están aisladas (
agent:<agentId>:whatsapp:group:<jid>). - El transporte de WhatsApp Web respeta las variables de entorno de proxy estándar en el host de Gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ variantes en minúsculas). Prefiere la configuración de proxy a nivel de host en lugar de ajustes de proxy de WhatsApp específicos del canal.
Control de acceso y activación
- Política de mensajes directos
- Política de grupos + listas de permitidos
- Menciones + /activation
channels.whatsapp.dmPolicy controla el acceso a chats directos:pairing(predeterminado)allowlistopen(requiere queallowFromincluya"*")disabled
allowFrom acepta números con formato E.164 (normalizados internamente).Anulación para varias cuentas: channels.whatsapp.accounts.<id>.dmPolicy (y allowFrom) tienen prioridad sobre los valores predeterminados a nivel del canal para esa cuenta.Detalles del comportamiento en tiempo de ejecución:- las vinculaciones se conservan en el almacén de permitidos del canal y se combinan con
allowFromconfigurado - si no se configura ninguna lista de permitidos, el número propio vinculado se permite de forma predeterminada
- los mensajes directos salientes
fromMenunca se vinculan automáticamente
Comportamiento de número personal y chat propio
Cuando el número propio vinculado también está presente enallowFrom, se activan las protecciones de chat propio de WhatsApp:
- omitir confirmaciones de lectura para turnos de chat propio
- ignorar el comportamiento de activación automática por mention-JID que de otro modo te mencionaría a ti mismo
- si
messages.responsePrefixno está definido, las respuestas de chat propio usan de forma predeterminada[{identity.name}]o[openclaw]
Normalización de mensajes y contexto
Sobre de entrada + contexto de respuesta
Sobre de entrada + contexto de respuesta
Los mensajes entrantes de WhatsApp se encapsulan en el sobre de entrada compartido.Si existe una respuesta citada, el contexto se agrega en esta forma:Los campos de metadatos de respuesta también se rellenan cuando están disponibles (
ReplyToId, ReplyToBody, ReplyToSender, remitente JID/E.164).Marcadores de posición de multimedia y extracción de ubicación/contacto
Marcadores de posición de multimedia y extracción de ubicación/contacto
Los mensajes entrantes que solo contienen multimedia se normalizan con marcadores de posición como:
<media:image><media:video><media:audio><media:document><media:sticker>
Inyección del historial pendiente de grupos
Inyección del historial pendiente de grupos
Para los grupos, los mensajes no procesados pueden almacenarse temporalmente e inyectarse como contexto cuando finalmente se activa el bot.
- límite predeterminado:
50 - configuración:
channels.whatsapp.historyLimit - alternativa:
messages.groupChat.historyLimit 0desactiva
[Mensajes del chat desde tu última respuesta - para contexto][Mensaje actual - responde a este]
Confirmaciones de lectura
Confirmaciones de lectura
Las confirmaciones de lectura están habilitadas de forma predeterminada para los mensajes entrantes de WhatsApp aceptados.Desactivar globalmente:Anulación por cuenta:Los turnos de chat propio omiten las confirmaciones de lectura incluso cuando están habilitadas globalmente.
Entrega, fragmentación y multimedia
Fragmentación de texto
Fragmentación de texto
- límite predeterminado de fragmento:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- el modo
newlineprefiere límites de párrafo (líneas en blanco), y luego recurre a una fragmentación segura por longitud
Comportamiento de multimedia saliente
Comportamiento de multimedia saliente
- admite cargas de imagen, video, audio (nota de voz PTT) y documento
audio/oggse reescribe comoaudio/ogg; codecs=opuspara compatibilidad con notas de voz- la reproducción de GIF animados se admite mediante
gifPlayback: trueen envíos de video - los subtítulos se aplican al primer elemento multimedia al enviar cargas de respuesta con varios elementos multimedia
- el origen del multimedia puede ser HTTP(S),
file://o rutas locales
Límites de tamaño de multimedia y comportamiento alternativo
Límites de tamaño de multimedia y comportamiento alternativo
- límite de guardado de multimedia entrante:
channels.whatsapp.mediaMaxMb(predeterminado50) - límite de envío de multimedia saliente:
channels.whatsapp.mediaMaxMb(predeterminado50) - las anulaciones por cuenta usan
channels.whatsapp.accounts.<accountId>.mediaMaxMb - las imágenes se optimizan automáticamente (barrido de tamaño/calidad) para ajustarse a los límites
- en caso de error al enviar multimedia, la alternativa del primer elemento envía una advertencia de texto en lugar de omitir la respuesta en silencio
Nivel de reacciones
channels.whatsapp.reactionLevel controla cuán ampliamente usa el agente las reacciones con emoji en WhatsApp:
| Nivel | Reacciones de acuse | Reacciones iniciadas por el agente | Descripción |
|---|---|---|---|
"off" | No | No | Sin reacciones en absoluto |
"ack" | Sí | No | Solo reacciones de acuse (recepción previa a respuesta) |
"minimal" | Sí | Sí (conservadoras) | Acuse + reacciones del agente con guía conservadora |
"extensive" | Sí | Sí (fomentadas) | Acuse + reacciones del agente con guía fomentada |
"minimal".
Las anulaciones por cuenta usan channels.whatsapp.accounts.<id>.reactionLevel.
Reacciones de acuse
WhatsApp admite reacciones de acuse inmediatas al recibir mensajes entrantes mediantechannels.whatsapp.ackReaction.
Las reacciones de acuse están controladas por reactionLevel: se suprimen cuando reactionLevel es "off".
- se envían inmediatamente después de que se acepta la entrada (antes de la respuesta)
- los fallos se registran, pero no bloquean la entrega normal de respuestas
- el modo de grupo
mentionsreacciona en turnos activados por mención; la activación de grupoalwaysactúa como omisión de esta comprobación - WhatsApp usa
channels.whatsapp.ackReaction(aquí no se usa el heredadomessages.ackReaction)
Varias cuentas y credenciales
Selección de cuenta y valores predeterminados
Selección de cuenta y valores predeterminados
- los ID de cuenta provienen de
channels.whatsapp.accounts - selección de cuenta predeterminada:
defaultsi está presente; de lo contrario, el primer ID de cuenta configurado (ordenado) - los ID de cuenta se normalizan internamente para la búsqueda
Rutas de credenciales y compatibilidad heredada
Rutas de credenciales y compatibilidad heredada
- ruta de autenticación actual:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - archivo de respaldo:
creds.json.bak - la autenticación heredada predeterminada en
~/.openclaw/credentials/aún se reconoce/migra para los flujos de cuenta predeterminada
Comportamiento de cierre de sesión
Comportamiento de cierre de sesión
openclaw channels logout --channel whatsapp [--account <id>] borra el estado de autenticación de WhatsApp para esa cuenta.En los directorios de autenticación heredados, oauth.json se conserva mientras se eliminan los archivos de autenticación de Baileys.Herramientas, acciones y escrituras de configuración
- La compatibilidad de herramientas del agente incluye la acción de reacción de WhatsApp (
react). - Restricciones de acciones:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Las escrituras de configuración iniciadas por el canal están habilitadas de forma predeterminada (desactívalas mediante
channels.whatsapp.configWrites=false).
Solución de problemas
No vinculado (se requiere QR)
No vinculado (se requiere QR)
Síntoma: el estado del canal indica que no está vinculado.Solución:
Vinculado pero desconectado / bucle de reconexión
Vinculado pero desconectado / bucle de reconexión
Síntoma: cuenta vinculada con desconexiones repetidas o intentos de reconexión.Solución:Si es necesario, vuelve a vincular con
channels login.Sin listener activo al enviar
Sin listener activo al enviar
Los envíos salientes fallan rápidamente cuando no existe un listener activo de Gateway para la cuenta de destino.Asegúrate de que Gateway esté en ejecución y de que la cuenta esté vinculada.
Mensajes de grupo ignorados inesperadamente
Mensajes de grupo ignorados inesperadamente
Comprueba en este orden:
groupPolicygroupAllowFrom/allowFrom- entradas de la lista de permitidos
groups - restricción por mención (
requireMention+ patrones de mención) - claves duplicadas en
openclaw.json(JSON5): las entradas posteriores reemplazan a las anteriores, así que mantén un únicogroupPolicypor alcance
Advertencia del entorno de ejecución Bun
Advertencia del entorno de ejecución Bun
El entorno de ejecución de Gateway para WhatsApp debe usar Node. Bun está marcado como incompatible para un funcionamiento estable de Gateway con WhatsApp/Telegram.
Punteros de referencia de configuración
Referencia principal: Campos de WhatsApp de alta relevancia:- acceso:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - entrega:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - varias cuentas:
accounts.<id>.enabled,accounts.<id>.authDir, anulaciones a nivel de cuenta - operaciones:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.* - comportamiento de sesión:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit