Saltar al contenido principal
Estado: experimental. Los mensajes directos y los chats grupales están implementados; la tabla de Capacidades siguiente refleja el comportamiento verificado en bots de Zalo Bot Creator / Marketplace.

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

  1. 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.
  2. Define el token, ya sea como env ZALO_BOT_TOKEN=... (solo cuenta predeterminada) o en la configuración.
  3. Reinicia el Gateway.
  4. Aprueba el código de emparejamiento en el primer contacto por mensaje directo (la política predeterminada de mensajes directos es emparejamiento).
Configuración mínima:
{
  channels: {
    zalo: {
      enabled: true,
      accounts: {
        default: {
          botToken: "12345689:abc-xyz",
          dmPolicy: "pairing",
        },
      },
    },
  },
}
Varias cuentas: agrega más entradas bajo 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 (replyToMode está fijo como desactivado).
  • Long-polling (getUpdates) de forma predeterminada; el modo Webhook está disponible mediante channels.zalo.webhookUrl.
  • Los grupos requieren una @mención para activar el bot; esto no es configurable por canal.

Límites

LímiteValor
Tamaño de fragmento de texto saliente2000 caracteres (límite de la API de Zalo)
Tamaño de medios (entrante/saliente)channels.zalo.mediaMaxMb, valor predeterminado 5 MB
Cuerpo de solicitud Webhook1 MB, tiempo de espera de lectura de 30 s
Límite de frecuencia Webhook120 solicitudes / 60 s por ruta+IP de cliente, luego HTTP 429
Ventana de eventos duplicados Webhook5 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 zalo
    • openclaw pairing approve zalo <CODE>
    • Detalles: Emparejamiento
  • channels.zalo.allowFrom acepta IDs numéricos de usuario de Zalo (sin búsqueda de nombre de usuario). open requiere "*".

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.groupAllowFrom restringe qué IDs de remitente pueden activar el bot en grupos; recurre a allowFrom cuando no está definido.
  • Resolución predeterminada: cuando channels.zalo está configurado, un groupPolicy no definido se resuelve como open. Cuando channels.zalo falta por completo, el runtime falla de forma cerrada a allowlist.
  • 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.webhookUrl y channels.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ónEstado
Mensajes directosCompatible
GruposCompatible (protegido por mención)
Medios (entrantes/salientes)Compatible, limitado por mediaMaxMb
ReaccionesNo compatible
HilosNo compatible
EncuestasNo compatible
Comandos nativosNo compatible
Responder a / citarNo se usa (fijo como desactivado)

Destinos de entrega (CLI/Cron)

Usa un ID de chat como destino:
openclaw message send --channel zalo --target 123456789 --message "hi"

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
El Webhook no recibe eventos:
  • 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
AjusteDescripciónPredeterminado
channels.zalo.enabledHabilitar/deshabilitar el inicio del canaltrue
channels.zalo.accounts.<id>.botTokenToken del bot desde Zalo Bot Platform-
channels.zalo.accounts.<id>.tokenFileLeer token desde un archivo (se rechazan symlinks)-
channels.zalo.accounts.<id>.nameNombre para mostrar-
channels.zalo.accounts.<id>.enabledHabilitar/deshabilitar esta cuentatrue
channels.zalo.accounts.<id>.dmPolicyPolítica de mensajes directos por cuentapairing
channels.zalo.accounts.<id>.allowFromLista de permitidos de mensajes directos (IDs de usuario)-
channels.zalo.accounts.<id>.groupPolicyPolítica de grupos por cuentaver Grupos
channels.zalo.accounts.<id>.groupAllowFromLista de permitidos de remitentes de grupo; recurre a allowFrom-
channels.zalo.accounts.<id>.mediaMaxMbLímite de medios entrantes/salientes (MB)5
channels.zalo.accounts.<id>.webhookUrlHabilitar modo Webhook (HTTPS requerido)-
channels.zalo.accounts.<id>.webhookSecretSecreto del Webhook (8-256 caracteres)-
channels.zalo.accounts.<id>.webhookPathRuta del Webhook en el servidor HTTP del Gatewayruta de la URL del Webhook
channels.zalo.accounts.<id>.proxyURL de proxy para solicitudes de API-
channels.zalo.accounts.<id>.responsePrefixAnulación del prefijo de respuesta saliente-
channels.zalo.defaultAccountCuenta predeterminada cuando hay varias configuradasdefault
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