Zalo (Bot API)
Estado: experimental. Los DMs son compatibles; el manejo de grupos está disponible con controles explícitos de política de grupo.
Plugin requerido
Zalo se distribuye como plugin y no viene incluido en la instalación base.
- Instalar vía CLI:
openclaw plugins install @openclaw/zalo - O selecciona Zalo durante el onboarding y confirma el prompt de instalación
- Detalles: Plugins
Configuración rápida (principiante)
- Instala el plugin de Zalo:
- Desde un checkout de código fuente:
openclaw plugins install ./extensions/zalo - Desde npm (si está publicado):
openclaw plugins install @openclaw/zalo - O elige Zalo en el onboarding y confirma el prompt de instalación
- Desde un checkout de código fuente:
- Configura el token:
- Variable de entorno:
ZALO_BOT_TOKEN=... - O en configuración:
channels.zalo.botToken: "...".
- Variable de entorno:
- Reinicia el gateway (o termina el onboarding).
- El acceso a DMs usa emparejamiento de forma predeterminada; aprueba el código de emparejamiento en el primer contacto.
Configuración mínima:
{
channels: {
zalo: {
enabled: true,
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
}
Qué es
Zalo es una app de mensajería enfocada en Vietnam; su Bot API permite al Gateway ejecutar un bot para conversaciones 1:1. Es una buena opción para soporte o notificaciones donde quieres enrutamiento determinista de vuelta a Zalo.
- Un canal de Zalo Bot API propiedad del Gateway.
- Enrutamiento determinista: las respuestas van de vuelta a Zalo; el modelo nunca elige canales.
- Los DMs comparten la sesión principal del agente.
- Los grupos son compatibles con controles de política (
groupPolicy+groupAllowFrom) y por defecto usan comportamiento cerrado de lista de acceso.
Configuración (ruta rápida)
1) Crear un token de bot (Zalo Bot Platform)
- Ve a https://bot.zaloplatforms.com e inicia sesión.
- Crea un nuevo bot y configura sus ajustes.
- Copia el token del bot (formato:
12345689:abc-xyz).
2) Configurar el token (env o configuración)
Ejemplo:
{
channels: {
zalo: {
enabled: true,
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
}
Opción de entorno: ZALO_BOT_TOKEN=... (funciona solo para la cuenta predeterminada).
Soporte multi-cuenta: usa channels.zalo.accounts con tokens por cuenta y name opcional.
- Reinicia el gateway. Zalo se inicia cuando se resuelve un token (env o configuración).
- El acceso a DMs usa emparejamiento de forma predeterminada. Aprueba el código cuando el bot sea contactado por primera vez.
Cómo funciona (comportamiento)
- Los mensajes entrantes se normalizan en el envelope compartido del canal con placeholders de multimedia.
- Las respuestas siempre se enrutan de vuelta al mismo chat de Zalo.
- Long-polling de forma predeterminada; modo webhook disponible con
channels.zalo.webhookUrl.
Límites
- El texto saliente se fragmenta a 2000 caracteres (límite de la API de Zalo).
- Las descargas/subidas de multimedia están limitadas por
channels.zalo.mediaMaxMb(predeterminado 5). - El streaming está bloqueado de forma predeterminada debido a que el límite de 2000 caracteres hace que sea poco útil.
Control de acceso (DMs)
Acceso a DMs
- Predeterminado:
channels.zalo.dmPolicy = "pairing". Los remitentes desconocidos reciben un código de emparejamiento; los mensajes se ignoran hasta que se aprueben (los códigos expiran después de 1 hora). - Aprobar vía:
openclaw pairing list zaloopenclaw pairing approve zalo <CODE>
- El emparejamiento es el intercambio de token predeterminado. Detalles: Emparejamiento
channels.zalo.allowFromacepta IDs numéricos de usuario (no hay búsqueda de nombre de usuario disponible).
Control de acceso (Grupos)
channels.zalo.groupPolicycontrola el manejo de mensajes entrantes de grupo:open | allowlist | disabled.- El comportamiento predeterminado es cerrado:
allowlist. channels.zalo.groupAllowFromrestringe qué IDs de remitente pueden activar al bot en grupos.- Si
groupAllowFromno está configurado, Zalo recurre aallowFrompara verificaciones de remitente. groupPolicy: "disabled"bloquea todos los mensajes de grupo.groupPolicy: "open"permite a cualquier miembro del grupo (con restricción de mención).- Nota de ejecución: si
channels.zalono existe en absoluto, el runtime aún recurre agroupPolicy="allowlist"por seguridad.
Long-polling vs webhook
- Predeterminado: long-polling (no se requiere URL pública).
- Modo webhook: configura
channels.zalo.webhookUrlychannels.zalo.webhookSecret.- El secreto del webhook debe tener entre 8 y 256 caracteres.
- La URL del webhook debe usar HTTPS.
- Zalo envía eventos con el encabezado
X-Bot-Api-Secret-Tokenpara verificación. - El HTTP del Gateway maneja solicitudes de webhook en
channels.zalo.webhookPath(por defecto la ruta de la URL del webhook). - Las solicitudes deben usar
Content-Type: application/json(o tipos de media+json). - Los eventos duplicados (
event_name + message_id) se ignoran durante una ventana corta de replay. - El tráfico en ráfaga tiene límite de velocidad por ruta/fuente y puede devolver HTTP 429.
Nota: getUpdates (polling) y webhook son mutuamente excluyentes según la documentación de la API de Zalo.
Tipos de mensajes soportados
- Mensajes de texto: Soporte completo con fragmentación a 2000 caracteres.
- Mensajes de imagen: Descarga y procesamiento de imágenes entrantes; envío de imágenes vía
sendPhoto. - Stickers: Se registran pero no se procesan completamente (sin respuesta del agente).
- Tipos no soportados: Se registran (ej. mensajes de usuarios protegidos).
Capacidades
| Característica | Estado |
|---|---|
| Mensajes directos | Soportado |
| Grupos | Soportado con controles de política (allowlist por defecto) |
| Multimedia (imágenes) | Soportado |
| Reacciones | No soportado |
| Hilos | No soportado |
| Encuestas | No soportado |
| Comandos nativos | No soportado |
| Streaming | Bloqueado (límite de 2000 caracteres) |
Destinos de entrega (CLI/cron)
- Usa un ID de chat como destino.
- Ejemplo:
openclaw message send --channel zalo --target 123456789 --message "hola".
Resolución de problemas
El bot no responde:
- Verifica que el token sea válido:
openclaw channels status --probe - Verifica que el remitente esté aprobado (emparejamiento o allowFrom)
- Revisa los logs del gateway:
openclaw logs --follow
El webhook no recibe eventos:
- Asegúrate de que la URL del webhook use HTTPS
- Verifica que el token secreto tenga entre 8 y 256 caracteres
- Confirma que el endpoint HTTP del gateway sea accesible en la ruta configurada
- Verifica que el polling getUpdates no esté ejecutándose (son mutuamente excluyentes)
Referencia de configuración (Zalo)
Configuración completa: Configuración
Opciones del proveedor:
channels.zalo.enabled: habilitar/deshabilitar inicio del canal.channels.zalo.botToken: token del bot de Zalo Bot Platform.channels.zalo.tokenFile: leer token desde una ruta de archivo regular. Los symlinks se rechazan.channels.zalo.dmPolicy:pairing | allowlist | open | disabled(predeterminado: pairing).channels.zalo.allowFrom: lista de acceso DM (IDs de usuario).openrequiere"*". El asistente pedirá IDs numéricos.channels.zalo.groupPolicy:open | allowlist | disabled(predeterminado: allowlist).channels.zalo.groupAllowFrom: lista de acceso de remitentes de grupo (IDs de usuario). Recurre aallowFromcuando no está configurado.channels.zalo.mediaMaxMb: límite de multimedia entrante/saliente (MB, predeterminado 5).channels.zalo.webhookUrl: habilitar modo webhook (se requiere HTTPS).channels.zalo.webhookSecret: secreto del webhook (8-256 caracteres).channels.zalo.webhookPath: ruta del webhook en el servidor HTTP del gateway.channels.zalo.proxy: URL del proxy para solicitudes API.
Opciones multi-cuenta:
channels.zalo.accounts.<id>.botToken: token por cuenta.channels.zalo.accounts.<id>.tokenFile: archivo de token regular por cuenta. Los symlinks se rechazan.channels.zalo.accounts.<id>.name: nombre para mostrar.channels.zalo.accounts.<id>.enabled: habilitar/deshabilitar cuenta.channels.zalo.accounts.<id>.dmPolicy: política de DM por cuenta.channels.zalo.accounts.<id>.allowFrom: lista de acceso por cuenta.channels.zalo.accounts.<id>.groupPolicy: política de grupo por cuenta.channels.zalo.accounts.<id>.groupAllowFrom: lista de acceso de remitentes de grupo por cuenta.channels.zalo.accounts.<id>.webhookUrl: URL de webhook por cuenta.channels.zalo.accounts.<id>.webhookSecret: secreto de webhook por cuenta.channels.zalo.accounts.<id>.webhookPath: ruta de webhook por cuenta.channels.zalo.accounts.<id>.proxy: URL de proxy por cuenta.