Zalo (Bot API)
Status: experimental. Apenas mensagens diretas; grupos em breve, conforme a documentação do Zalo.Plugin necessário
O Zalo é distribuído como um plugin e não vem incluído na instalação principal.- Instale via CLI:
openclaw plugins install @openclaw/zalo - Ou selecione Zalo durante a integração inicial e confirme o prompt de instalação
- Detalhes: Plugins
Configuração rápida (iniciante)
- Instale o plugin do Zalo:
- A partir de um checkout do código-fonte:
openclaw plugins install ./extensions/zalo - A partir do npm (se publicado):
openclaw plugins install @openclaw/zalo - Ou escolha Zalo na integração inicial e confirme o prompt de instalação
- A partir de um checkout do código-fonte:
- Defina o token:
- Ambiente:
ZALO_BOT_TOKEN=... - Ou configuração:
channels.zalo.botToken: "...".
- Ambiente:
- Reinicie o gateway (ou conclua a integração inicial).
- O acesso por DM usa pareamento por padrão; aprove o código de pareamento no primeiro contato.
O que é
Zalo é um aplicativo de mensagens focado no Vietnã; sua Bot API permite que o Gateway execute um bot para conversas 1:1. É uma boa opção para suporte ou notificações quando você deseja roteamento determinístico de volta para o Zalo.- Um canal da Zalo Bot API pertencente ao Gateway.
- Roteamento determinístico: as respostas voltam para o Zalo; o modelo nunca escolhe canais.
- DMs compartilham a sessão principal do agente.
- Grupos ainda não são suportados (a documentação do Zalo indica “em breve”).
Configuração (caminho rápido)
1. Criar um token de bot (Zalo Bot Platform)
- Acesse https://bot.zaloplatforms.com e faça login.
- Crie um novo bot e configure suas opções.
- Copie o token do bot (formato:
12345689:abc-xyz).
2) Configurar o token (env ou configuração)
Exemplo:ZALO_BOT_TOKEN=... (funciona apenas para a conta padrão).
Suporte a múltiplas contas: use channels.zalo.accounts com tokens por conta e name opcional.
- Reinicie o gateway. O Zalo inicia quando um token é resolvido (env ou configuração).
- O acesso por DM usa pareamento por padrão. Aprove o código quando o bot for contatado pela primeira vez.
Como funciona (comportamento)
- Mensagens de entrada são normalizadas no envelope de canal compartilhado com placeholders de mídia.
- As respostas sempre retornam para o mesmo chat do Zalo.
- Long-polling por padrão; modo webhook disponível com
channels.zalo.webhookUrl.
Limites
- Texto de saída é dividido em blocos de 2000 caracteres (limite da API do Zalo).
- Downloads/uploads de mídia são limitados por
channels.zalo.mediaMaxMb(padrão 5). - Streaming é bloqueado por padrão devido ao limite de 2000 caracteres tornar o streaming menos útil.
Controle de acesso (DMs)
Acesso por DM
- Padrão:
channels.zalo.dmPolicy = "pairing". Remetentes desconhecidos recebem um código de pareamento; as mensagens são ignoradas até a aprovação (os códigos expiram após 1 hora). - Aprovar via:
openclaw pairing list zaloopenclaw pairing approve zalo <CODE>
- O pareamento é a troca de token padrão. Detalhes: Pairing
channels.zalo.allowFromaceita IDs numéricos de usuários (não há busca por nome de usuário).
Long-polling vs webhook
- Padrão: long-polling (não requer URL pública).
- Modo webhook: defina
channels.zalo.webhookUrlechannels.zalo.webhookSecret.- O segredo do webhook deve ter de 8 a 256 caracteres.
- A URL do webhook deve usar HTTPS.
- O Zalo envia eventos com o cabeçalho
X-Bot-Api-Secret-Tokenpara verificação. - O HTTP do Gateway trata requisições de webhook em
channels.zalo.webhookPath(padrão é o caminho da URL do webhook).
Tipos de mensagens suportados
- Mensagens de texto: Suporte completo com divisão em blocos de 2000 caracteres.
- Mensagens de imagem: Baixar e processar imagens de entrada; enviar imagens via
sendPhoto. - Figurinhas: Registradas em log, mas não totalmente processadas (sem resposta do agente).
- Tipos não suportados: Registrados em log (por exemplo, mensagens de usuários protegidos).
Capacidades
| Funcionalidade | Status |
|---|---|
| Mensagens diretas | ✅ Suportado |
| Grupos | ❌ Em breve (conforme docs do Zalo) |
| Mídia (imagens) | ✅ Suportado |
| Reações | ❌ Não suportado |
| Tópicos | ❌ Não suportado |
| Enquetes | ❌ Não suportado |
| Comandos nativos | ❌ Não suportado |
| Streaming | ⚠️ Bloqueado (limite de 2000 caracteres) |
Destinos de entrega (CLI/cron)
- Use um ID de chat como destino.
- Exemplo:
openclaw message send --channel zalo --target 123456789 --message "hi".
Solução de problemas
O bot não responde:- Verifique se o token é válido:
openclaw channels status --probe - Confirme se o remetente está aprovado (pareamento ou allowFrom)
- Verifique os logs do gateway:
openclaw logs --follow
- Garanta que a URL do webhook use HTTPS
- Verifique se o token secreto tem de 8 a 256 caracteres
- Confirme que o endpoint HTTP do gateway está acessível no caminho configurado
- Verifique se o polling getUpdates não está em execução (são mutuamente exclusivos)
Referência de configuração (Zalo)
Configuração completa: Configuration Opções do provedor:channels.zalo.enabled: habilitar/desabilitar a inicialização do canal.channels.zalo.botToken: token do bot da Zalo Bot Platform.channels.zalo.tokenFile: ler o token a partir de um caminho de arquivo.channels.zalo.dmPolicy:pairing | allowlist | open | disabled(padrão: pareamento).channels.zalo.allowFrom: lista de permissões de DM (IDs de usuários).openrequer"*". O assistente solicitará IDs numéricos.channels.zalo.mediaMaxMb: limite de mídia de entrada/saída (MB, padrão 5).channels.zalo.webhookUrl: habilitar modo webhook (HTTPS obrigatório).channels.zalo.webhookSecret: segredo do webhook (8-256 caracteres).channels.zalo.webhookPath: caminho do webhook no servidor HTTP do gateway.channels.zalo.proxy: URL de proxy para requisições da API.
channels.zalo.accounts.<id>.botToken: token por conta.channels.zalo.accounts.<id>.tokenFile: arquivo de token por conta.channels.zalo.accounts.<id>.name: nome de exibição.channels.zalo.accounts.<id>.enabled: habilitar/desabilitar a conta.channels.zalo.accounts.<id>.dmPolicy: política de DM por conta.channels.zalo.accounts.<id>.allowFrom: lista de permissões por conta.channels.zalo.accounts.<id>.webhookUrl: URL de webhook por conta.channels.zalo.accounts.<id>.webhookSecret: segredo de webhook por conta.channels.zalo.accounts.<id>.webhookPath: caminho de webhook por conta.channels.zalo.accounts.<id>.proxy: URL de proxy por conta.