Passer au contenu principal

WhatsApp (canal web)

Statut : prêt pour la production via WhatsApp Web (Baileys). La passerelle possède la ou les sessions liées.

Installation (à la demande)

  • L’onboarding (openclaw onboard) et openclaw channels add --channel whatsapp proposent d’installer le plugin WhatsApp la première fois que vous le sélectionnez.
  • openclaw channels login --channel whatsapp propose également le flux d’installation lorsque le plugin n’est pas encore présent.
  • Canal de développement + extraction git : utilise par défaut le chemin du plugin local.
  • Stable/Beta : utilise par défaut le package npm @openclaw/whatsapp.
L’installation manuelle reste disponible :
openclaw plugins install @openclaw/whatsapp

Appairage

La stratégie DM par défaut est l’appairage pour les expéditeurs inconnus.

Dépannage des canaux

Diagnostics inter-canaux et procédures de réparation.

Configuration de la passerelle

Modèles et exemples complets de configuration de canal.

Configuration rapide

1

Configurer la stratégie d'accès WhatsApp

{
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      allowFrom: ["+15551234567"],
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15551234567"],
    },
  },
}
2

Lier WhatsApp (QR)

openclaw channels login --channel whatsapp
Pour un compte spécifique :
openclaw channels login --channel whatsapp --account work
3

Démarrer la passerelle

openclaw gateway
4

Approuver la première demande d'appairage (si vous utilisez le mode appairage)

openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
Les demandes d’appairage expirent après 1 heure. Les demandes en attente sont limitées à 3 par canal.
OpenClaw recommande d’exécuter WhatsApp sur un numéro séparé lorsque c’est possible. (Les métadonnées du canal et le flux de configuration sont optimisés pour cette configuration, mais les configurations avec numéro personnel sont également prises en charge.)

Modèles de déploiement

Il s’agit du mode opérationnel le plus propre :
  • identité WhatsApp distincte pour OpenClaw
  • listes d’autorisation DM et limites de routage plus claires
  • risque réduit de confusion avec l’auto-conversation
Modèle de stratégie minimal :
{
  channels: {
    whatsapp: {
      dmPolicy: "allowlist",
      allowFrom: ["+15551234567"],
    },
  },
}
L’onboarding prend en charge le mode numéro personnel et écrit une base adaptée à l’auto-conversation :
  • dmPolicy: "allowlist"
  • allowFrom inclut votre numéro personnel
  • selfChatMode: true
À l’exécution, les protections d’auto-conversation s’appuient sur le numéro personnel lié et allowFrom.
Le canal de plateforme de messagerie est basé sur WhatsApp Web (Baileys) dans l’architecture actuelle des canaux OpenClaw.Il n’existe pas de canal de messagerie WhatsApp Twilio distinct dans le registre intégré des canaux de chat.

Modèle d’exécution

  • La passerelle possède le socket WhatsApp et la boucle de reconnexion.
  • Les envois sortants nécessitent un écouteur WhatsApp actif pour le compte cible.
  • Les discussions de statut et de diffusion sont ignorées (@status, @broadcast).
  • Les discussions directes utilisent les règles de session DM (session.dmScope ; main par défaut regroupe les DM dans la session principale de l’agent).
  • Les sessions de groupe sont isolées (agent:<agentId>:whatsapp:group:<jid>).
  • Le transport WhatsApp Web respecte les variables d’environnement proxy standard sur l’hôte de la passerelle (HTTPS_PROXY, HTTP_PROXY, NO_PROXY / variantes en minuscules). Préférez une configuration proxy au niveau de l’hôte plutôt que des paramètres proxy WhatsApp spécifiques au canal.

Contrôle d’accès et activation

channels.whatsapp.dmPolicy contrôle l’accès aux discussions directes :
  • pairing (par défaut)
  • allowlist
  • open (nécessite que allowFrom inclue "*")
  • disabled
allowFrom accepte les numéros au format E.164 (normalisés en interne).Remplacement multi-comptes : channels.whatsapp.accounts.<id>.dmPolicy (et allowFrom) est prioritaire sur les valeurs par défaut au niveau du canal pour ce compte.Détails du comportement à l’exécution :
  • les appairages sont conservés dans le magasin d’autorisations du canal et fusionnés avec allowFrom configuré
  • si aucune liste d’autorisation n’est configurée, le numéro personnel lié est autorisé par défaut
  • les DM sortants fromMe ne sont jamais appairés automatiquement

Comportement avec numéro personnel et auto-conversation

Lorsque le numéro personnel lié est également présent dans allowFrom, les protections d’auto-conversation WhatsApp s’activent :
  • ignorer les accusés de lecture pour les tours d’auto-conversation
  • ignorer le comportement de déclenchement automatique par mention-JID qui vous interpellerait autrement vous-même
  • si messages.responsePrefix n’est pas défini, les réponses d’auto-conversation utilisent par défaut [{identity.name}] ou [openclaw]

Normalisation des messages et contexte

Les messages WhatsApp entrants sont enveloppés dans l’enveloppe entrante partagée.Si une réponse citée existe, le contexte est ajouté sous cette forme :
[En réponse à <sender> id:<stanzaId>]
<corps cité ou espace réservé de média>
[/En réponse]
Les champs de métadonnées de réponse sont également renseignés quand ils sont disponibles (ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 de l’expéditeur).
Les messages entrants contenant uniquement des médias sont normalisés avec des espaces réservés tels que :
  • <media:image>
  • <media:video>
  • <media:audio>
  • <media:document>
  • <media:sticker>
Les charges utiles de position et de contact sont normalisées en contexte textuel avant le routage.
Pour les groupes, les messages non traités peuvent être mis en mémoire tampon et injectés comme contexte lorsque le bot est finalement déclenché.
  • limite par défaut : 50
  • configuration : channels.whatsapp.historyLimit
  • repli : messages.groupChat.historyLimit
  • 0 désactive
Marqueurs d’injection :
  • [Messages du chat depuis votre dernière réponse - pour le contexte]
  • [Message actuel - répondez à celui-ci]
Les accusés de lecture sont activés par défaut pour les messages WhatsApp entrants acceptés.Désactiver globalement :
{
  channels: {
    whatsapp: {
      sendReadReceipts: false,
    },
  },
}
Remplacement par compte :
{
  channels: {
    whatsapp: {
      accounts: {
        work: {
          sendReadReceipts: false,
        },
      },
    },
  },
}
Les tours d’auto-conversation ignorent les accusés de lecture même lorsqu’ils sont activés globalement.

Livraison, segmentation et médias

  • limite de segment par défaut : channels.whatsapp.textChunkLimit = 4000
  • channels.whatsapp.chunkMode = "length" | "newline"
  • le mode newline privilégie les limites de paragraphe (lignes vides), puis se replie sur une segmentation sûre par longueur
  • prend en charge les charges utiles image, vidéo, audio (note vocale PTT) et document
  • audio/ogg est réécrit en audio/ogg; codecs=opus pour la compatibilité avec les notes vocales
  • la lecture des GIF animés est prise en charge via gifPlayback: true sur les envois vidéo
  • les légendes sont appliquées au premier élément média lors de l’envoi de charges utiles de réponse multi-médias
  • la source du média peut être HTTP(S), file:// ou des chemins locaux
  • plafond d’enregistrement des médias entrants : channels.whatsapp.mediaMaxMb (par défaut 50)
  • plafond d’envoi des médias sortants : channels.whatsapp.mediaMaxMb (par défaut 50)
  • les remplacements par compte utilisent channels.whatsapp.accounts.<accountId>.mediaMaxMb
  • les images sont automatiquement optimisées (redimensionnement/balayage de qualité) pour respecter les limites
  • en cas d’échec d’envoi de média, le repli du premier élément envoie un avertissement textuel au lieu d’abandonner silencieusement la réponse

Niveau de réaction

channels.whatsapp.reactionLevel contrôle dans quelle mesure l’agent utilise les réactions emoji sur WhatsApp :
NiveauRéactions d’accusé de réceptionRéactions initiées par l’agentDescription
"off"NonNonAucune réaction
"ack"OuiNonRéactions d’accusé de réception uniquement (pré-réponse)
"minimal"OuiOui (conservatrices)Accusé de réception + réactions agent avec directives conservatrices
"extensive"OuiOui (encouragées)Accusé de réception + réactions agent avec directives encourageantes
Par défaut : "minimal". Les remplacements par compte utilisent channels.whatsapp.accounts.<id>.reactionLevel.
{
  channels: {
    whatsapp: {
      reactionLevel: "ack",
    },
  },
}

Réactions d’accusé de réception

WhatsApp prend en charge les réactions d’accusé de réception immédiates à la réception d’un message entrant via channels.whatsapp.ackReaction. Les réactions d’accusé de réception sont conditionnées par reactionLevel — elles sont supprimées lorsque reactionLevel vaut "off".
{
  channels: {
    whatsapp: {
      ackReaction: {
        emoji: "👀",
        direct: true,
        group: "mentions", // always | mentions | never
      },
    },
  },
}
Notes sur le comportement :
  • envoyées immédiatement après l’acceptation d’un message entrant (pré-réponse)
  • les échecs sont consignés dans les journaux mais ne bloquent pas la livraison normale des réponses
  • le mode groupe mentions réagit sur les tours déclenchés par mention ; l’activation de groupe always contourne cette vérification
  • WhatsApp utilise channels.whatsapp.ackReaction (l’ancien messages.ackReaction n’est pas utilisé ici)

Multi-comptes et identifiants

  • les identifiants de compte proviennent de channels.whatsapp.accounts
  • sélection du compte par défaut : default s’il est présent, sinon le premier identifiant de compte configuré (trié)
  • les identifiants de compte sont normalisés en interne pour la recherche
  • chemin d’authentification actuel : ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • fichier de sauvegarde : creds.json.bak
  • l’ancienne authentification par défaut dans ~/.openclaw/credentials/ est toujours reconnue/migrée pour les flux de compte par défaut
openclaw channels logout --channel whatsapp [--account <id>] efface l’état d’authentification WhatsApp pour ce compte.Dans les anciens répertoires d’authentification, oauth.json est conservé tandis que les fichiers d’authentification Baileys sont supprimés.

Outils, actions et écritures de configuration

  • La prise en charge des outils de l’agent inclut l’action de réaction WhatsApp (react).
  • Contrôles des actions :
    • channels.whatsapp.actions.reactions
    • channels.whatsapp.actions.polls
  • Les écritures de configuration initiées par le canal sont activées par défaut (désactivez via channels.whatsapp.configWrites=false).

Dépannage

Symptôme : l’état du canal indique qu’il n’est pas lié.Correctif :
openclaw channels login --channel whatsapp
openclaw channels status
Symptôme : compte lié avec déconnexions répétées ou tentatives de reconnexion.Correctif :
openclaw doctor
openclaw logs --follow
Si nécessaire, reliez avec channels login.
Les envois sortants échouent immédiatement lorsqu’aucun écouteur de passerelle actif n’existe pour le compte cible.Assurez-vous que la passerelle est en cours d’exécution et que le compte est lié.
Vérifiez dans cet ordre :
  • groupPolicy
  • groupAllowFrom / allowFrom
  • les entrées de liste d’autorisation groups
  • le filtrage par mention (requireMention + motifs de mention)
  • les clés dupliquées dans openclaw.json (JSON5) : les entrées ultérieures remplacent les précédentes, donc conservez un seul groupPolicy par portée
L’exécution de la passerelle WhatsApp doit utiliser Node. Bun est signalé comme incompatible pour un fonctionnement stable de la passerelle WhatsApp/Telegram.

Pointeurs de référence de configuration

Référence principale : Champs WhatsApp à fort impact :
  • accès : dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups
  • livraison : textChunkLimit, chunkMode, mediaMaxMb, sendReadReceipts, ackReaction, reactionLevel
  • multi-comptes : accounts.<id>.enabled, accounts.<id>.authDir, remplacements au niveau du compte
  • opérations : configWrites, debounceMs, web.enabled, web.heartbeatSeconds, web.reconnect.*
  • comportement de session : session.dmScope, historyLimit, dmHistoryLimit, dms.<id>.historyLimit

Associé