BlueBubbles (REST macOS)
Statut : plugin intégré qui communique avec le serveur macOS BlueBubbles via HTTP. Recommandé pour l’intégration iMessage grâce à son API plus riche et à sa configuration plus simple par rapport à l’ancien canal imsg.Plugin intégré
Les versions actuelles d’OpenClaw intègrent BlueBubbles, donc les builds packagés normaux n’ont pas besoin d’une étapeopenclaw plugins install séparée.
Vue d’ensemble
- Fonctionne sur macOS via l’application d’assistance BlueBubbles (bluebubbles.app).
- Recommandé/testé : macOS Sequoia (15). macOS Tahoe (26) fonctionne ; la modification est actuellement cassée sur Tahoe, et les mises à jour d’icône de groupe peuvent signaler une réussite sans se synchroniser.
- OpenClaw communique avec lui via son API REST (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - Les messages entrants arrivent via des webhooks ; les réponses sortantes, indicateurs de saisie, accusés de lecture et tapbacks sont des appels REST.
- Les pièces jointes et autocollants sont ingérés comme médias entrants (et transmis à l’agent lorsque c’est possible).
- L’appairage/la liste d’autorisation fonctionne de la même manière que pour les autres canaux (
/channels/pairing, etc.) avecchannels.bluebubbles.allowFrom+ codes d’appairage. - Les réactions sont exposées comme événements système, comme pour Slack/Telegram, afin que les agents puissent les « mentionner » avant de répondre.
- Fonctionnalités avancées : modifier, annuler l’envoi, fils de réponse, effets de message, gestion des groupes.
Démarrage rapide
- Installez le serveur BlueBubbles sur votre Mac (suivez les instructions sur bluebubbles.app/install).
- Dans la configuration BlueBubbles, activez l’API web et définissez un mot de passe.
-
Exécutez
openclaw onboardet sélectionnez BlueBubbles, ou configurez-le manuellement : -
Pointez les webhooks BlueBubbles vers votre passerelle (exemple :
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). - Démarrez la passerelle ; elle enregistrera le gestionnaire de webhook et lancera l’appairage.
- Définissez toujours un mot de passe de webhook.
- L’authentification du webhook est toujours requise. OpenClaw rejette les requêtes de webhook BlueBubbles sauf si elles incluent un mot de passe/guid correspondant à
channels.bluebubbles.password(par exemple?password=<password>oux-password), quelle que soit la topologie loopback/proxy. - L’authentification par mot de passe est vérifiée avant la lecture/l’analyse des corps complets de webhook.
Garder Messages.app actif (configurations VM / headless)
Certaines configurations macOS VM / toujours actives peuvent entraîner une mise en « veille » de Messages.app (les événements entrants s’arrêtent jusqu’à ce que l’application soit ouverte ou remise au premier plan). Une solution simple consiste à solliciter Messages toutes les 5 minutes à l’aide d’un AppleScript + LaunchAgent.1) Enregistrer l’AppleScript
Enregistrez-le sous :~/Scripts/poke-messages.scpt
2) Installer un LaunchAgent
Enregistrez-le sous :~/Library/LaunchAgents/com.user.poke-messages.plist
- Cela s’exécute toutes les 300 secondes et à la connexion.
- La première exécution peut déclencher les invites macOS Automation (
osascript→ Messages). Approuvez-les dans la même session utilisateur qui exécute le LaunchAgent.
Intégration guidée
BlueBubbles est disponible dans l’intégration interactive :- URL du serveur (obligatoire) : adresse du serveur BlueBubbles (par ex.
http://192.168.1.100:1234) - Mot de passe (obligatoire) : mot de passe de l’API depuis les paramètres BlueBubbles Server
- Chemin du webhook (facultatif) : valeur par défaut
/bluebubbles-webhook - Politique des messages privés : pairing, allowlist, open ou disabled
- Liste d’autorisation : numéros de téléphone, e-mails ou cibles de chat
Contrôle d’accès (messages privés + groupes)
Messages privés :- Par défaut :
channels.bluebubbles.dmPolicy = "pairing". - Les expéditeurs inconnus reçoivent un code d’appairage ; les messages sont ignorés jusqu’à approbation (les codes expirent après 1 heure).
- Approuvez via :
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- L’appairage est l’échange de jeton par défaut. Détails : Appairage
channels.bluebubbles.groupPolicy = open | allowlist | disabled(par défaut :allowlist).channels.bluebubbles.groupAllowFromcontrôle qui peut déclencher dans les groupes lorsqueallowlistest défini.
Enrichissement des noms de contacts (macOS, facultatif)
Les webhooks de groupe BlueBubbles incluent souvent uniquement les adresses brutes des participants. Si vous souhaitez que le contexteGroupMembers affiche à la place les noms des contacts locaux, vous pouvez activer l’enrichissement local Contacts sur macOS :
channels.bluebubbles.enrichGroupParticipantsFromContacts = trueactive la recherche. Par défaut :false.- Les recherches ne s’exécutent qu’après que l’accès au groupe, l’autorisation des commandes et le filtrage des mentions ont autorisé le message.
- Seuls les participants téléphoniques sans nom sont enrichis.
- Les numéros de téléphone bruts restent la solution de repli lorsqu’aucune correspondance locale n’est trouvée.
Filtrage par mention (groupes)
BlueBubbles prend en charge le filtrage par mention pour les discussions de groupe, conformément au comportement iMessage/WhatsApp :- Utilise
agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns) pour détecter les mentions. - Lorsque
requireMentionest activé pour un groupe, l’agent ne répond que lorsqu’il est mentionné. - Les commandes de contrôle provenant d’expéditeurs autorisés contournent le filtrage par mention.
Filtrage des commandes
- Les commandes de contrôle (par ex.
/config,/model) nécessitent une autorisation. - Utilise
allowFrometgroupAllowFrompour déterminer l’autorisation des commandes. - Les expéditeurs autorisés peuvent exécuter des commandes de contrôle même sans mention dans les groupes.
Liaisons de conversation ACP
Les discussions BlueBubbles peuvent être transformées en espaces de travail ACP durables sans modifier la couche de transport. Flux opérateur rapide :- Exécutez
/acp spawn codex --bind heredans le message privé ou le groupe autorisé. - Les futurs messages dans cette même conversation BlueBubbles sont acheminés vers la session ACP démarrée.
/newet/resetréinitialisent en place cette même session ACP liée./acp closeferme la session ACP et supprime la liaison.
bindings[] de niveau supérieur avec type: "acp" et match.channel: "bluebubbles".
match.peer.id peut utiliser toute forme de cible BlueBubbles prise en charge :
- identifiant de message privé normalisé tel que
+15555550123ouuser@example.com chat_id:<id>chat_guid:<guid>chat_identifier:<identifier>
chat_id:* ou chat_identifier:*.
Exemple :
Saisie + accusés de lecture
- Indicateurs de saisie : envoyés automatiquement avant et pendant la génération de la réponse.
- Accusés de lecture : contrôlés par
channels.bluebubbles.sendReadReceipts(par défaut :true). - Indicateurs de saisie : OpenClaw envoie des événements de début de saisie ; BlueBubbles efface automatiquement l’état de saisie lors de l’envoi ou après expiration (l’arrêt manuel via DELETE n’est pas fiable).
Actions avancées
BlueBubbles prend en charge des actions de message avancées lorsqu’elles sont activées dans la configuration :- react : ajouter/supprimer des réactions tapback (
messageId,emoji,remove) - edit : modifier un message envoyé (
messageId,text) - unsend : annuler l’envoi d’un message (
messageId) - reply : répondre à un message spécifique (
messageId,text,to) - sendWithEffect : envoyer avec un effet iMessage (
text,to,effectId) - renameGroup : renommer une discussion de groupe (
chatGuid,displayName) - setGroupIcon : définir l’icône/photo d’une discussion de groupe (
chatGuid,media) — instable sur macOS 26 Tahoe (l’API peut signaler une réussite mais l’icône ne se synchronise pas). - addParticipant : ajouter quelqu’un à un groupe (
chatGuid,address) - removeParticipant : supprimer quelqu’un d’un groupe (
chatGuid,address) - leaveGroup : quitter une discussion de groupe (
chatGuid) - upload-file : envoyer des médias/fichiers (
to,buffer,filename,asVoice)- Mémos vocaux : définissez
asVoice: trueavec de l’audio MP3 ou CAF pour envoyer un message vocal iMessage. BlueBubbles convertit MP3 → CAF lors de l’envoi de mémos vocaux.
- Mémos vocaux : définissez
- Alias historique :
sendAttachmentfonctionne toujours, maisupload-fileest le nom d’action canonique.
Identifiants de message (courts vs complets)
OpenClaw peut exposer des identifiants de message courts (par ex.1, 2) pour économiser des jetons.
MessageSid/ReplyToIdpeuvent être des identifiants courts.MessageSidFull/ReplyToIdFullcontiennent les identifiants complets du fournisseur.- Les identifiants courts sont en mémoire ; ils peuvent expirer après un redémarrage ou une éviction du cache.
- Les actions acceptent un
messageIdcourt ou complet, mais les identifiants courts généreront une erreur s’ils ne sont plus disponibles.
- Templates :
{{MessageSidFull}},{{ReplyToIdFull}} - Contexte :
MessageSidFull/ReplyToIdFulldans les charges utiles entrantes
Diffusion par blocs
Contrôlez si les réponses sont envoyées sous forme d’un seul message ou diffusées par blocs :Médias + limites
- Les pièces jointes entrantes sont téléchargées et stockées dans le cache média.
- Limite média via
channels.bluebubbles.mediaMaxMbpour les médias entrants et sortants (par défaut : 8 Mo). - Le texte sortant est découpé selon
channels.bluebubbles.textChunkLimit(par défaut : 4000 caractères).
Référence de configuration
Configuration complète : Configuration Options du fournisseur :channels.bluebubbles.enabled: activer/désactiver le canal.channels.bluebubbles.serverUrl: URL de base de l’API REST BlueBubbles.channels.bluebubbles.password: mot de passe API.channels.bluebubbles.webhookPath: chemin du point de terminaison webhook (par défaut :/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(par défaut :pairing).channels.bluebubbles.allowFrom: liste d’autorisation des messages privés (identifiants, e-mails, numéros E.164,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(par défaut :allowlist).channels.bluebubbles.groupAllowFrom: liste d’autorisation des expéditeurs dans les groupes.channels.bluebubbles.enrichGroupParticipantsFromContacts: sur macOS, enrichir facultativement les participants de groupe sans nom à partir des Contacts locaux une fois le filtrage passé. Par défaut :false.channels.bluebubbles.groups: configuration par groupe (requireMention, etc.).channels.bluebubbles.sendReadReceipts: envoyer des accusés de lecture (par défaut :true).channels.bluebubbles.blockStreaming: activer la diffusion par blocs (par défaut :false; requis pour les réponses en streaming).channels.bluebubbles.textChunkLimit: taille de découpage sortant en caractères (par défaut : 4000).channels.bluebubbles.chunkMode:length(par défaut) découpe uniquement en cas de dépassement detextChunkLimit;newlinedécoupe sur les lignes vides (limites de paragraphe) avant le découpage par longueur.channels.bluebubbles.mediaMaxMb: limite des médias entrants/sortants en Mo (par défaut : 8).channels.bluebubbles.mediaLocalRoots: liste d’autorisation explicite des répertoires locaux absolus autorisés pour les chemins de médias locaux sortants. Les envois par chemin local sont refusés par défaut sauf si cela est configuré. Remplacement par compte :channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: nombre maximal de messages de groupe pour le contexte (0 désactive).channels.bluebubbles.dmHistoryLimit: limite d’historique des messages privés.channels.bluebubbles.actions: activer/désactiver des actions spécifiques.channels.bluebubbles.accounts: configuration multi-comptes.
agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns).messages.responsePrefix.
Adressage / cibles de distribution
Préférezchat_guid pour un routage stable :
chat_guid:iMessage;-;+15555550123(préféré pour les groupes)chat_id:123chat_identifier:...- Identifiants directs :
+15555550123,user@example.com- Si un identifiant direct n’a pas de discussion privée existante, OpenClaw en créera une via
POST /api/v1/chat/new. Cela nécessite l’activation de l’API privée BlueBubbles.
- Si un identifiant direct n’a pas de discussion privée existante, OpenClaw en créera une via
Sécurité
- Les requêtes de webhook sont authentifiées en comparant les paramètres de requête ou en-têtes
guid/passwordàchannels.bluebubbles.password. - Gardez secrets le mot de passe API et le point de terminaison webhook (traitez-les comme des identifiants).
- Il n’existe aucun contournement localhost pour l’authentification des webhooks BlueBubbles. Si vous proxifiez le trafic webhook, conservez le mot de passe BlueBubbles de bout en bout dans la requête.
gateway.trustedProxiesne remplace paschannels.bluebubbles.passwordici. Voir Sécurité de la passerelle. - Activez HTTPS + des règles de pare-feu sur le serveur BlueBubbles si vous l’exposez en dehors de votre LAN.
Dépannage
- Si les événements de saisie/lecture cessent de fonctionner, consultez les journaux de webhook BlueBubbles et vérifiez que le chemin de la passerelle correspond à
channels.bluebubbles.webhookPath. - Les codes d’appairage expirent après une heure ; utilisez
openclaw pairing list bluebubblesetopenclaw pairing approve bluebubbles <code>. - Les réactions nécessitent l’API privée BlueBubbles (
POST /api/v1/message/react) ; assurez-vous que la version du serveur l’expose. - Modifier/annuler l’envoi nécessitent macOS 13+ et une version compatible du serveur BlueBubbles. Sur macOS 26 (Tahoe), la modification est actuellement cassée en raison de changements dans l’API privée.
- Les mises à jour d’icône de groupe peuvent être instables sur macOS 26 (Tahoe) : l’API peut signaler une réussite mais la nouvelle icône ne se synchronise pas.
- OpenClaw masque automatiquement les actions connues comme cassées en fonction de la version macOS du serveur BlueBubbles. Si la modification apparaît encore sur macOS 26 (Tahoe), désactivez-la manuellement avec
channels.bluebubbles.actions.edit=false. - Pour les informations d’état/santé :
openclaw status --allouopenclaw status --deep.
Lié
- Vue d’ensemble des canaux — tous les canaux pris en charge
- Appairage — authentification des messages privés et flux d’appairage
- Groupes — comportement des discussions de groupe et filtrage par mention
- Routage des canaux — routage des sessions pour les messages
- Sécurité — modèle d’accès et durcissement