Plataformas de mensajería
Estado: listo para producción vía WhatsApp Web (Baileys). El gateway posee la(s) sesión(es) vinculada(s).
Configuración rápida
Paso 1: Configurar la política de acceso de WhatsApp
{
channels: {
whatsapp: {
dmPolicy: "pairing",
allowFrom: ["+15551234567"],
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
},
},
}
Paso 2: Vincular WhatsApp (QR)
openclaw channels login --channel whatsapp
Para una cuenta específica:
openclaw channels login --channel whatsapp --account work
Paso 3: Iniciar el gateway
openclaw gateway
Paso 4: Aprobar la primera solicitud de vinculación (si se usa el modo pairing)
openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
Las solicitudes de vinculación expiran después de 1 hora. Las solicitudes pendientes están limitadas a 3 por canal.
ℹ️ OpenClaw recomienda ejecutar WhatsApp en un número separado cuando sea posible. (Los metadatos del canal y el flujo de incorporación están optimizados para esa configuración, pero también se admiten configuraciones con número personal.)
Patrones de despliegue
Este es el modo operativo más limpio:
- identidad de WhatsApp separada para OpenClaw
- límites de listas de permitidos y enrutamiento más claros
- menor probabilidad de confusión con chats propios
Patrón de política mínimo:
{
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551234567"],
},
},
}
La incorporación admite el modo de número personal y escribe una línea base compatible con chats propios:
dmPolicy: "allowlist"allowFromincluye tu número personalselfChatMode: true
En tiempo de ejecución, las protecciones de chat propio se activan con base en el número propio vinculado y allowFrom.
El canal de plataforma de mensajería está basado en WhatsApp Web (Baileys) en la arquitectura actual de canales de OpenClaw. No existe un canal de mensajería WhatsApp de Twilio separado en el registro de canales de chat integrado.
Modelo de tiempo de ejecución
- El gateway posee el socket de WhatsApp y el bucle de reconexión.
- Los envíos salientes requieren un listener de WhatsApp activo para la cuenta objetivo.
- Los chats de estado y difusión se ignoran (
@status,@broadcast). - Los chats directos usan reglas de sesión DM (
session.dmScope; por defectomaincolapsa los DMs a la sesión principal del agente). - Las sesiones de grupo están aisladas (
agent::whatsapp:group:).
Control de acceso y activación
channels.whatsapp.dmPolicy controla el acceso a chats directos:
pairing(predeterminado)allowlistopen(requiere queallowFromincluya"*")disabled
allowFrom acepta números en formato E.164 (normalizados internamente).Anulación multi-cuenta: channels.whatsapp.accounts..dmPolicy (y allowFrom) tienen prioridad sobre los valores predeterminados a nivel de canal para esa cuenta.Detalles del comportamiento en tiempo de ejecución:
- las vinculaciones se persisten en el almacén de permitidos del canal y se fusionan con
allowFromconfigurado - si no se configura ninguna lista de permitidos, el número propio vinculado se permite por defecto
- los DMs salientes
fromMenunca se vinculan automáticamente
El acceso a grupos tiene dos capas:
- Lista de permitidos de membresía de grupo (
channels.whatsapp.groups)- si se omite
groups, todos los grupos son elegibles - si
groupsestá presente, actúa como una lista de permitidos de grupo ("*"permitido)
- si se omite
- Política de remitente de grupo (
channels.whatsapp.groupPolicy+groupAllowFrom)open: se omite la lista de permitidos del remitenteallowlist: el remitente debe coincidir congroupAllowFrom(o*)disabled: bloquear todas las entradas de grupo
Lista de permitidos de remitente alternativa:
- si
groupAllowFromno está configurado, el tiempo de ejecución recurre aallowFromcuando está disponible - las listas de permitidos del remitente se evalúan antes de la activación por mención/respuesta
Nota: si no existe ningún bloque channels.whatsapp en absoluto, la política de grupo alternativa en tiempo de ejecución es allowlist (con un registro de advertencia), incluso si channels.defaults.groupPolicy está configurado.
Las respuestas en grupo requieren mención por defecto.La detección de menciones incluye:
- menciones explícitas de WhatsApp a la identidad del bot
- patrones de expresión regular de mención configurados (
agents.list[].groupChat.mentionPatterns, alternativamessages.groupChat.mentionPatterns) - detección implícita de respuesta-al-bot (el remitente de la respuesta coincide con la identidad del bot)
Nota de seguridad:
- la cita/respuesta solo satisface la compuerta de mención; no otorga autorización de remitente
- con
groupPolicy: "allowlist", los remitentes no permitidos aún se bloquean incluso si responden a un mensaje de un usuario permitido
Comando de activación a nivel de sesión:
/activation mention/activation always
activation actualiza el estado de la sesión (no la configuración global). Está controlado por el propietario.
Comportamiento de número personal y chat propio
Cuando el número propio vinculado también está presente en allowFrom, se activan las salvaguardas de chat propio de WhatsApp:
- omitir recibos de lectura para turnos de chat propio
- ignorar el comportamiento de activación automática por mención-JID que de otro modo se enviaría a ti mismo
- si
messages.responsePrefixno está configurado, las respuestas de chat propio usan por defecto[{identity.name}]o[openclaw]
Normalización de mensajes y contexto
Los mensajes entrantes de WhatsApp se envuelven en el sobre de entrada compartido.Si existe una respuesta citada, el contexto se agrega en esta forma:
[Respondiendo a <remitente> id:<stanzaId>]
<cuerpo citado o marcador de posición de medios>
[/Respondiendo]
Los campos de metadatos de respuesta también se completan cuando están disponibles (ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 del remitente).
Los mensajes entrantes que solo contienen medios se normalizan con marcadores de posición como:
<media:image><media:video><media:audio><media:document><media:sticker>
Las cargas útiles de ubicación y contacto se normalizan en contexto textual antes del enrutamiento.
Para grupos, los mensajes no procesados pueden almacenarse en búfer e inyectarse como contexto cuando finalmente se activa el bot.
- límite predeterminado:
50 - configuraci ón:
channels.whatsapp.historyLimit - alternativa:
messages.groupChat.historyLimit 0desactiva
Marcadores de inyección:
[Mensajes del chat desde tu última respuesta - para contexto][Mensaje actual - responde a esto]
Los recibos de lectura están habilitados por defecto para los mensajes entrantes de WhatsApp aceptados.Desactivar globalmente:
{
channels: {
whatsapp: {
sendReadReceipts: false,
},
},
}
Anulación por cuenta:
{
channels: {
whatsapp: {
accounts: {
work: {
sendReadReceipts: false,
},
},
},
},
}
Los turnos de chat propio omiten los recibos de lectura incluso cuando están habilitados globalmente.
Entrega, fragmentación y medios
-
límite de fragmento predeterminado:
channels.whatsapp.textChunkLimit = 4000 -
channels.whatsapp.chunkMode = "length" | "newline" -
el modo
newlineprefiere límites de párrafo (líneas en blanco), luego recurre a fragmentación segura por longitud -
admite cargas útiles de imagen, video, audio (nota de voz PTT) y documento
-
audio/oggse reescribe aaudio/ogg; codecs=opuspara compatibilidad con notas de voz -
la reproducción de GIF animados es compatible mediante
gifPlayback: trueen envíos de video -
los subtítulos se aplican al primer elemento multimedia al enviar cargas útiles de respuesta multi-media
-
la fuente de medios puede ser HTTP(S),
file://o rutas locales -
límite de guardado de medios entrantes:
channels.whatsapp.mediaMaxMb(predeterminado50) -
límite de envío de medios salientes:
channels.whatsapp.mediaMaxMb(predeterminado50) -
las anulaciones por cuenta usan
channels.whatsapp.accounts..mediaMaxMb -
las imágenes se optimizan automáticamente (redimensionamiento/ajuste de calidad) para ajustarse a los límites
-
en caso de fallo de envío de medios, la alternativa del primer elemento envía una advertencia de texto en lugar de descartar la respuesta en silencio
Reacciones de acuse de recibo
WhatsApp admite reacciones de acuse de recibo inmediatas en la recepción entrante mediante channels.whatsapp.ackReaction.
{
channels: {
whatsapp: {
ackReaction: {
emoji: "👀",
direct: true,
group: "mentions", // always | mentions | never
},
},
},
}
Notas de comportamiento:
- se envía inmediatamente después de aceptar la entrada (antes de la respuesta)
- los fallos se registran pero no bloquean la entrega normal de la respuesta
- el modo de grupo
mentionsreacciona en turnos activados por mención; la activación de grupoalwaysactúa como omisión para esta verificación - WhatsApp usa
channels.whatsapp.ackReaction(el legadomessages.ackReactionno se usa aquí)
Multi-cuenta y credenciales
-
los ids 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 ids de cuenta se normalizan internamente para búsqueda
-
ruta de autenticación actual:
~/.openclaw/credentials/whatsapp//creds.json -
archivo de respaldo:
creds.json.bak -
la autenticación predeterminada anterior en
~/.openclaw/credentials/aún se reconoce/migra para flujos de cuenta predeterminada
openclaw channels logout --channel whatsapp [--account ] borra el estado de autenticación de WhatsApp para esa cuenta.En directorios de autenticación anteriores, se preserva oauth.json mientras se eliminan los archivos de autenticación de Baileys.
Herramientas, acciones y escrituras de configuración
- El soporte de herramientas del agente incluye la acción de reacción de WhatsApp (
react). - Compuertas de acción:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Las escrituras de configuración iniciadas por el canal están habilitadas por defecto (desactivar mediante
channels.whatsapp.configWrites=false).
Solución de problemas
Síntoma: el estado del canal reporta "no vinculado".Solución:
openclaw channels login --channel whatsapp
openclaw channels status
Síntoma: cuenta vinculada con desconexiones repetidas o intentos de reconexión.Solución:
openclaw doctor
openclaw logs --follow
Si es necesario, volver a vincular con channels login.
Los envíos salientes fallan rápidamente cuando no existe un listener de gateway activo para la cuenta objetivo.Asegúrate de que el gateway esté en ejecución y la cuenta esté vinculada.
Verificar en este orden:
groupPolicygroupAllowFrom/allowFrom- entradas de la lista de permitidos
groups - compuerta de mención (
requireMention+ patrones de mención) - claves duplicadas en
openclaw.json(JSON5): las entradas posteriores anulan las anteriores, así que mantén un sologroupPolicypor alcance
El tiempo de ejecución del gateway de WhatsApp debe usar Node. Bun se marca como incompatible para una operación estable del gateway de WhatsApp/Telegram.
Puntos de referencia de configuración
Referencia principal:
Campos de WhatsApp de alta señal:
- acceso:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - entrega:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction - multi-cuenta:
accounts..enabled,accounts..authDir, anulaciones a nivel de cuenta - operaciones:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.* - comportamiento de sesión:
session.dmScope,historyLimit,dmHistoryLimit,dms..historyLimit