Zalo (Bot API)
Statut : experimental. Les DMs sont pris en charge ; la gestion des groupes est disponible avec des controles de politique de groupe explicites.
Plugin requis
Zalo est fourni comme plugin et nâest pas inclus dans lâinstallation de base.
- Installation via CLI :
openclaw plugins install @openclaw/zalo - Ou selectionnez Zalo pendant lâonboarding et confirmez lâinvite dâinstallation
- Details : Plugins
Configuration rapide (debutant)
- Installez le plugin Zalo :
- Depuis un checkout source :
openclaw plugins install ./extensions/zalo - Depuis npm (si publie) :
openclaw plugins install @openclaw/zalo - Ou choisissez Zalo dans lâonboarding et confirmez lâinvite dâinstallation
- Depuis un checkout source :
- Definissez le jeton :
- Env :
ZALO_BOT_TOKEN=... - Ou config :
channels.zalo.botToken: "...".
- Env :
- Redemarrez la gateway (ou terminez lâonboarding).
- Lâacces DM est en mode appairage par defaut ; approuvez le code dâappairage au premier contact.
Configuration minimale :
{
channels: {
zalo: {
enabled: true,
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
}
Description
Zalo est une application de messagerie centree sur le Vietnam ; son Bot API permet a la Gateway dâexecuter un bot pour les conversations 1:1. Câest un bon choix pour le support ou les notifications ou vous souhaitez un routage deterministe vers Zalo.
- Un canal Zalo Bot API gere par la Gateway.
- Routage deterministe : les reponses retournent a Zalo ; le modele ne choisit jamais les canaux.
- Les DMs partagent la session principale de lâagent.
- Les groupes sont pris en charge avec des controles de politique (
groupPolicy+groupAllowFrom) et utilisent par defaut un comportement de liste dâautorisation ferme.
Configuration (chemin rapide)
1) Creer un jeton de bot (Zalo Bot Platform)
- Allez sur https://bot.zaloplatforms.com et connectez-vous.
- Creez un nouveau bot et configurez ses parametres.
- Copiez le jeton du bot (format :
12345689:abc-xyz).
2) Configurer le jeton (env ou config)
Exemple :
{
channels: {
zalo: {
enabled: true,
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
}
Option env : ZALO_BOT_TOKEN=... (fonctionne uniquement pour le compte par defaut).
Support multi-comptes : utilisez channels.zalo.accounts avec des jetons par compte et un name optionnel.
- Redemarrez la gateway. Zalo demarre quand un jeton est resolu (env ou config).
- Lâacces DM est par defaut en mode appairage. Approuvez le code quand le bot est contacte pour la premiere fois.
Fonctionnement (comportement)
- Les messages entrants sont normalises dans lâenveloppe de canal partagee avec des espaces reserves pour les medias.
- Les reponses retournent toujours a la meme conversation Zalo.
- Long-polling par defaut ; mode webhook disponible avec
channels.zalo.webhookUrl.
Limites
- Le texte sortant est decoupe a 2000 caracteres (limite API Zalo).
- Les telechargements/envois de medias sont limites par
channels.zalo.mediaMaxMb(par defaut 5). - Le streaming est bloque par defaut car la limite de 2000 caracteres rend le streaming moins utile.
Controle dâacces (DMs)
Acces DM
- Par defaut :
channels.zalo.dmPolicy = "pairing". Les expediteurs inconnus recoivent un code dâappairage ; les messages sont ignores jusquâa approbation (les codes expirent apres 1 heure). - Approbation via :
openclaw pairing list zaloopenclaw pairing approve zalo <CODE>
- Lâappairage est lâechange de jetons par defaut. Details : Appairage
channels.zalo.allowFromaccepte les IDs utilisateur numeriques (pas de recherche par nom dâutilisateur disponible).
Controle dâacces (Groupes)
channels.zalo.groupPolicycontrole le traitement des groupes entrants :open | allowlist | disabled.- Le comportement par defaut est ferme :
allowlist. channels.zalo.groupAllowFromrestreint quels IDs dâexpediteur peuvent declencher le bot dans les groupes.- Si
groupAllowFromnâest pas defini, Zalo se replie surallowFrompour les verifications dâexpediteur. groupPolicy: "disabled"bloque tous les messages de groupe.groupPolicy: "open"autorise tout membre de groupe (filtre par mention).- Remarque dâexecution : si
channels.zaloest completement absent, lâexecution se replie quand meme surgroupPolicy="allowlist"pour la securite.
Long-polling vs webhook
- Par defaut : long-polling (pas dâURL publique requise).
- Mode webhook : definissez
channels.zalo.webhookUrletchannels.zalo.webhookSecret.- Le secret du webhook doit faire 8-256 caracteres.
- LâURL du webhook doit utiliser HTTPS.
- Zalo envoie les evenements avec lâen-tete
X-Bot-Api-Secret-Tokenpour la verification. - La gateway HTTP traite les requetes webhook a
channels.zalo.webhookPath(par defaut le chemin de lâURL du webhook). - Les requetes doivent utiliser
Content-Type: application/json(ou des types media+json). - Les evenements dupliques (
event_name + message_id) sont ignores pendant une courte fenetre de relecture. - Le trafic en rafale est limite en debit par chemin/source et peut retourner HTTP 429.
Remarque : getUpdates (polling) et webhook sont mutuellement exclusifs selon la documentation de lâAPI Zalo.
Types de messages pris en charge
- Messages texte : Support complet avec decoupe a 2000 caracteres.
- Messages image : Telechargement et traitement des images entrantes ; envoi dâimages via
sendPhoto. - Stickers : Enregistres mais pas entierement traites (pas de reponse de lâagent).
- Types non pris en charge : Enregistres (ex : messages dâutilisateurs proteges).
Fonctionnalites
| Fonctionnalite | Statut |
|---|---|
| Messages prives | Pris en charge |
| Groupes | Pris en charge avec controles de politique (allowlist par defaut) |
| Media (images) | Pris en charge |
| Reactions | Non pris en charge |
| Fils | Non pris en charge |
| Sondages | Non pris en charge |
| Commandes natives | Non pris en charge |
| Streaming | Bloque (limite de 2000 caracteres) |
Cibles de livraison (CLI/cron)
- Utilisez un ID de chat comme cible.
- Exemple :
openclaw message send --channel zalo --target 123456789 --message "hi".
Depannage
Le bot ne repond pas :
- Verifiez que le jeton est valide :
openclaw channels status --probe - Verifiez que lâexpediteur est approuve (appairage ou allowFrom)
- Verifiez les logs de la gateway :
openclaw logs --follow
Le webhook ne recoit pas dâevenements :
- Assurez-vous que lâURL du webhook utilise HTTPS
- Verifiez que le jeton secret fait 8-256 caracteres
- Confirmez que lâendpoint HTTP de la gateway est accessible sur le chemin configure
- Verifiez que le polling getUpdates nâest pas en cours (ils sont mutuellement exclusifs)
Reference de configuration (Zalo)
Configuration complete : Configuration
Options du fournisseur :
channels.zalo.enabled: activer/desactiver le demarrage du canal.channels.zalo.botToken: jeton de bot de la Zalo Bot Platform.channels.zalo.tokenFile: lire le jeton depuis un chemin de fichier regulier. Les liens symboliques sont rejetes.channels.zalo.dmPolicy:pairing | allowlist | open | disabled(par defaut : pairing).channels.zalo.allowFrom: liste dâautorisation DM (IDs utilisateur).opennecessite"*". Lâassistant demandera des IDs numeriques.channels.zalo.groupPolicy:open | allowlist | disabled(par defaut : allowlist).channels.zalo.groupAllowFrom: liste dâautorisation dâexpediteurs de groupe (IDs utilisateur). Se replie surallowFromquand non defini.channels.zalo.mediaMaxMb: limite de media entrant/sortant (Mo, par defaut 5).channels.zalo.webhookUrl: activer le mode webhook (HTTPS requis).channels.zalo.webhookSecret: secret du webhook (8-256 caracteres).channels.zalo.webhookPath: chemin du webhook sur le serveur HTTP de la gateway.channels.zalo.proxy: URL du proxy pour les requetes API.
Options multi-comptes :
channels.zalo.accounts.<id>.botToken: jeton par compte.channels.zalo.accounts.<id>.tokenFile: fichier de jeton regulier par compte. Les liens symboliques sont rejetes.channels.zalo.accounts.<id>.name: nom dâaffichage.channels.zalo.accounts.<id>.enabled: activer/desactiver le compte.channels.zalo.accounts.<id>.dmPolicy: politique DM par compte.channels.zalo.accounts.<id>.allowFrom: liste dâautorisation par compte.channels.zalo.accounts.<id>.groupPolicy: politique de groupe par compte.channels.zalo.accounts.<id>.groupAllowFrom: liste dâautorisation dâexpediteurs de groupe par compte.channels.zalo.accounts.<id>.webhookUrl: URL du webhook par compte.channels.zalo.accounts.<id>.webhookSecret: secret du webhook par compte.channels.zalo.accounts.<id>.webhookPath: chemin du webhook par compte.channels.zalo.accounts.<id>.proxy: URL du proxy par compte.