Plugin incluido
Zalo se distribuye como un Plugin incluido en las versiones actuales de OpenClaw, por lo que las compilaciones empaquetadas no necesitan una instalación aparte. En una compilación anterior o una instalación personalizada que excluya Zalo, instala directamente el paquete npm:- Instalar:
openclaw plugins install @openclaw/zalo - Versión fijada:
openclaw plugins install @openclaw/zalo@2026.6.11 - Desde un checkout local:
openclaw plugins install ./path/to/local/zalo-plugin - Detalles: Plugins
Configuración rápida
- Crea un token de bot en https://bot.zaloplatforms.com (inicia sesión, crea un bot, configura los ajustes). El token es
numeric_id:secret; en los bots de Marketplace, el token utilizable en tiempo de ejecución puede aparecer en el mensaje de bienvenida del bot. - Define el token, ya sea como env
ZALO_BOT_TOKEN=...(solo cuenta predeterminada) o en la configuración. - Reinicia el Gateway.
- Aprueba el código de emparejamiento en el primer contacto por mensaje directo (la política predeterminada de mensajes directos es emparejamiento).
channels.zalo.accounts.<id>, cada una con su propio botToken/name. channels.zalo.botToken (plano, sin accounts) es una abreviatura heredada para una sola cuenta; prefiere accounts.<id>.* para configuraciones nuevas.
Qué es
Zalo es una aplicación de mensajería enfocada en Vietnam. Su Bot API permite que el Gateway ejecute un bot tanto para conversaciones 1:1 como para chats grupales, con enrutamiento determinista de vuelta a Zalo (el modelo nunca elige canales). Esta página cubre bots de Zalo Bot Creator / Marketplace. Los bots de Zalo Official Account (OA) son una superficie de producto distinta y pueden comportarse de forma diferente; esta página no los cubre.Cómo funciona
- Los mensajes entrantes se normalizan en el sobre de canal compartido con marcadores de posición para medios.
- Las respuestas siempre se enrutan de vuelta al mismo chat de Zalo; no se usa respuesta con cita (
replyToModeestá fijo como desactivado). - Long-polling (
getUpdates) de forma predeterminada; el modo Webhook está disponible mediantechannels.zalo.webhookUrl. - Los grupos requieren una @mención para activar el bot; esto no es configurable por canal.
Límites
| Límite | Valor |
|---|---|
| Tamaño de fragmento de texto saliente | 2000 caracteres (límite de la API de Zalo) |
| Tamaño de medios (entrante/saliente) | channels.zalo.mediaMaxMb, valor predeterminado 5 MB |
| Cuerpo de solicitud Webhook | 1 MB, tiempo de espera de lectura de 30 s |
| Límite de frecuencia Webhook | 120 solicitudes / 60 s por ruta+IP de cliente, luego HTTP 429 |
| Ventana de eventos duplicados Webhook | 5 minutos (indexada por ruta + cuenta + nombre de evento + chat + remitente + id de mensaje) |
Control de acceso
Mensajes directos
channels.zalo.dmPolicy:pairing(predeterminado) |allowlist|open|disabled.- Emparejamiento: los remitentes desconocidos reciben un código de emparejamiento; los mensajes se ignoran hasta que se apruebe. Los códigos caducan después de 1 hora.
openclaw pairing list zaloopenclaw pairing approve zalo <CODE>- Detalles: Emparejamiento
channels.zalo.allowFromacepta IDs numéricos de usuario de Zalo (sin búsqueda de nombre de usuario).openrequiere"*".
Grupos
Los chats grupales son compatibles con el Plugin (chatTypes: ["direct", "group"]) y están protegidos por mención más política de grupo:
channels.zalo.groupPolicy:open|allowlist|disabled.channels.zalo.groupAllowFromrestringe qué IDs de remitente pueden activar el bot en grupos; recurre aallowFromcuando no está definido.- Resolución predeterminada: cuando
channels.zaloestá configurado, ungroupPolicyno definido se resuelve comoopen. Cuandochannels.zalofalta por completo, el runtime falla de forma cerrada aallowlist. - Advertencia reportada en el mundo real: en algunas configuraciones de bots de Marketplace, el bot no se pudo agregar a ningún grupo. Si te ocurre, verifica la configuración de Zalo Bot Platform de tu bot; es una restricción del lado de la plataforma, no una política de OpenClaw.
Long-polling frente a Webhook
- Predeterminado: long-polling (no requiere URL pública).
- Modo Webhook: define
channels.zalo.webhookUrlychannels.zalo.webhookSecret.- La URL del Webhook debe usar HTTPS.
- El secreto del Webhook debe tener entre 8 y 256 caracteres.
- Zalo envía eventos con un encabezado
X-Bot-Api-Secret-Token, comprobado con una comparación en tiempo constante. - HTTP del Gateway gestiona las solicitudes Webhook en
channels.zalo.webhookPath(de forma predeterminada, la ruta de la URL del Webhook). - Las solicitudes deben usar
Content-Type: application/json(o un tipo de medio+json). - El sondeo getUpdates y el Webhook son mutuamente excluyentes según la documentación de la API de Zalo.
Tipos de mensaje compatibles
- Texto: compatibilidad completa, fragmentado en 2000 caracteres.
- Medios: entrantes/salientes, limitados por
mediaMaxMb. - Reacciones, hilos, encuestas, comandos nativos: no compatibles con el Plugin.
- Streaming: el Plugin declara capacidad de streaming por bloques, pero Zalo no tiene controles dedicados de cola saliente/fusión de texto (a diferencia de algunos otros canales regionales); verifica el comportamiento actual en tu entorno si esto importa para tu caso de uso.
Capacidades
| Función | Estado |
|---|---|
| Mensajes directos | Compatible |
| Grupos | Compatible (protegido por mención) |
| Medios (entrantes/salientes) | Compatible, limitado por mediaMaxMb |
| Reacciones | No compatible |
| Hilos | No compatible |
| Encuestas | No compatible |
| Comandos nativos | No compatible |
| Responder a / citar | No se usa (fijo como desactivado) |
Destinos de entrega (CLI/Cron)
Usa un ID de chat como destino:Solución de problemas
El bot no responde:- Comprueba el token:
openclaw channels status --probe - Verifica que el remitente esté aprobado (emparejamiento o
allowFrom) - Revisa los registros del Gateway:
openclaw logs --follow
- Confirma que la URL del Webhook use HTTPS
- Confirma que el secreto tenga entre 8 y 256 caracteres
- Confirma que el endpoint HTTP del Gateway sea accesible en la ruta configurada
- Confirma que el sondeo getUpdates no se esté ejecutando también (son mutuamente excluyentes)
- Una ráfaga de solicitudes puede devolver HTTP 429 (120 solicitudes / 60 s por ruta+IP); espera y reintenta
Referencia de configuración
Configuración completa: Configuración| Ajuste | Descripción | Predeterminado |
|---|---|---|
channels.zalo.enabled | Habilitar/deshabilitar el inicio del canal | true |
channels.zalo.accounts.<id>.botToken | Token del bot desde Zalo Bot Platform | - |
channels.zalo.accounts.<id>.tokenFile | Leer token desde un archivo (se rechazan symlinks) | - |
channels.zalo.accounts.<id>.name | Nombre para mostrar | - |
channels.zalo.accounts.<id>.enabled | Habilitar/deshabilitar esta cuenta | true |
channels.zalo.accounts.<id>.dmPolicy | Política de mensajes directos por cuenta | pairing |
channels.zalo.accounts.<id>.allowFrom | Lista de permitidos de mensajes directos (IDs de usuario) | - |
channels.zalo.accounts.<id>.groupPolicy | Política de grupos por cuenta | ver Grupos |
channels.zalo.accounts.<id>.groupAllowFrom | Lista de permitidos de remitentes de grupo; recurre a allowFrom | - |
channels.zalo.accounts.<id>.mediaMaxMb | Límite de medios entrantes/salientes (MB) | 5 |
channels.zalo.accounts.<id>.webhookUrl | Habilitar modo Webhook (HTTPS requerido) | - |
channels.zalo.accounts.<id>.webhookSecret | Secreto del Webhook (8-256 caracteres) | - |
channels.zalo.accounts.<id>.webhookPath | Ruta del Webhook en el servidor HTTP del Gateway | ruta de la URL del Webhook |
channels.zalo.accounts.<id>.proxy | URL de proxy para solicitudes de API | - |
channels.zalo.accounts.<id>.responsePrefix | Anulación del prefijo de respuesta saliente | - |
channels.zalo.defaultAccount | Cuenta predeterminada cuando hay varias configuradas | default |
channels.zalo.botToken, channels.zalo.dmPolicy y otras claves planas de nivel superior son la abreviatura heredada de una sola cuenta para los campos anteriores; ambas formas son compatibles.
Opción env: ZALO_BOT_TOKEN=... resuelve solo el token de la cuenta predeterminada.
Relacionado
- Descripción general de canales - todos los canales compatibles
- Emparejamiento - autenticación de mensajes directos y flujo de emparejamiento
- Grupos - comportamiento de chats grupales y activación por mención
- Enrutamiento de canales - enrutamiento de sesiones para mensajes
- Seguridad - modelo de acceso y hardening