iMessage (legacy : imsg)
Recommandé : Utilisez BlueBubbles pour les nouvelles configurations iMessage.
Le canal imsg est une intégration CLI externe legacy et peut être supprimé dans une version future.
Statut : intégration CLI externe legacy. La Gateway (passerelle) lance imsg rpc (JSON-RPC sur stdio).
Demarrage rapide (debutant)
- Assurez-vous que Messages est connecté sur ce Mac.
- Installez
imsg:brew install steipete/tap/imsg
- Configurez OpenClaw avec
channels.imessage.cliPathetchannels.imessage.dbPath. - Démarrez la passerelle et approuvez toutes les invites macOS (Automatisation + Accès complet au disque).
Qu’est-ce que c’est
- Canal iMessage adossé à
imsgsur macOS. - Routage déterministe : les réponses reviennent toujours vers iMessage.
- Les Messages prives partagent la session principale de l’agent ; les groupes sont isolés (
agent:<agentId>:imessage:group:<chat_id>). - Si un fil à plusieurs participants arrive avec
is_group=false, vous pouvez quand même l’isoler enchat_idà l’aide dechannels.imessage.groups(voir « Fils de type groupe » ci-dessous).
Écritures de configuration
Par défaut, iMessage est autorisé à écrire des mises à jour de configuration déclenchées par/config set|unset (nécessite commands.config: true).
Désactiver avec :
Exigences
- macOS avec Messages connecté.
- Accès complet au disque pour OpenClaw +
imsg(accès à la base de données Messages). - Autorisation d’automatisation lors de l’envoi.
channels.imessage.cliPathpeut pointer vers toute commande qui proxifie stdin/stdout (par exemple, un script wrapper qui se connecte en SSH à un autre Mac et exécuteimsg rpc).
Dépannage de la confidentialité et de la sécurité macOS TCC
Si l’envoi/la réception échoue (par exemple,imsg rpc quitte non-zéro, les temps écoulés, ou la passerelle semble se suspendre), une cause courante est une invite de permission macOS qui n’a jamais été approuvée.
macOS accorde les permissions TCC par contexte application/processus. Approuver les invites dans le même contexte que imsg (par exemple, Terminal/iTerm, une session LaunchAgent ou un processus lancé par SSH).
Checklist:
- Full Disk Access : autorise l’accès pour le processus qui exécute OpenClaw (et n’importe quel wrapper shell/SSH qui exécute
imsg). Ceci est nécessaire pour lire la base de données des messages (chat.db). - Automatisation → Messages : permet au processus utilisant OpenClaw (et/ou votre terminal) de contrôler Messages.app pour les envois sortants.
imsgCLI health: vérifiez queimsgest installé et prend en charge RPC (imsg rpc --help).
Configuration (chemin rapide)
- Assurez-vous que Messages est connecté sur ce Mac.
- Configurez iMessage et démarrez la passerelle.
Utilisateur macOS de bot dédié (pour une identité isolée)
Si vous voulez que le bot envoie depuis une identité iMessage distincte (et garder vos Messages personnels propres), utilisez un identifiant Apple dédié + un utilisateur macOS dédié.- Créez un identifiant Apple dédié (exemple :
[email protected]).- Apple peut exiger un numéro de téléphone pour la vérification / 2FA.
- Créez un utilisateur macOS (exemple :
openclawhome) et connectez-vous avec. - Ouvrez Messages dans cet utilisateur macOS et connectez-vous à iMessage avec l’identifiant Apple du bot.
- Activez la connexion à distance (Réglages Système → Général → Partage → Connexion à distance).
- Installez
imsg:brew install steipete/tap/imsg
- Configurez SSH pour que
ssh <bot-macos-user>@localhost truefonctionne sans mot de passe. - Faites pointer
channels.imessage.accounts.bot.cliPathvers un wrapper SSH qui exécuteimsgen tant qu’utilisateur bot.
imsg rpc semble bloqué ou s’arrête, connectez-vous à cet utilisateur (le partage d’écran aide), lancez une fois imsg chats --limit 1 / imsg send ..., approuvez les invites, puis réessayez. Voir Dépannage macOS Privacy and Security TCC.
Exemple de wrapper (chmod +x). Remplacez <bot-macos-user> par votre nom d’utilisateur macOS réel :
channels.imessage.cliPath, channels.imessage.dbPath) au lieu de la map accounts.
Variante distante/SSH (optionnelle)
Si vous voulez iMessage sur un autre Mac, définissezchannels.imessage.cliPath vers un wrapper qui exécute imsg sur l’hôte macOS distant via SSH. OpenClaw n’a besoin que de stdio.
Exemple de wrapper :
cliPath pointe vers un hôte distant via SSH, les chemins des pièces jointes dans la base de données Messages référencent des fichiers sur la machine distante. OpenClaw peut les récupérer automatiquement via SCP en définissant channels.imessage.remoteHost :
remoteHost n’est pas défini, OpenClaw tente de l’auto-détecter en analysant la commande SSH dans votre script wrapper. Une configuration explicite est recommandée pour la fiabilité.
Mac distant via Tailscale (exemple)
Si la Gateway (passerelle) s’exécute sur un hôte/VM Linux mais qu’iMessage doit s’exécuter sur un Mac, Tailscale est le pont le plus simple : la passerelle communique avec le Mac via le tailnet, exécuteimsg via SSH et récupère les pièces jointes via SCP.
Architecture :
Exemple concret de configuration (nom d’hôte Tailscale) :
~/.openclaw/scripts/imsg-ssh) :
- Assurez-vous que le Mac est connecté à Messages et que la connexion à distance est activée.
- Utilisez des clés SSH pour que
ssh [email protected]fonctionne sans invites. remoteHostdoit correspondre à la cible SSH afin que SCP puisse récupérer les pièces jointes.
channels.imessage.accounts avec une configuration par compte et name optionnel. Voir gateway/configuration pour le modèle partagé. Ne committez pas ~/.openclaw/openclaw.json (il contient souvent des jetons).
Contrôle d’accès (Messages prives + groupes)
DMs:- Par défaut :
channels.imessage.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).
- Approuver via :
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>
- L’appairage est l’échange de jetons par défaut pour les Messages prives iMessage. Détails : Appairage
channels.imessage.groupPolicy = open | allowlist | disabled.channels.imessage.groupAllowFromcontrôle qui peut déclencher dans les groupes lorsqueallowlistest défini.- Le filtrage par mention utilise
agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns) car iMessage n’a pas de métadonnées de mention natives. - Surcharge multi-agents : définissez des motifs par agent sur
agents.list[].groupChat.mentionPatterns.
Comment ça marche (comportement)
imsgdiffuse les événements de messages ; la passerelle les normalise dans l’enveloppe de canal partagée.- Les réponses reviennent toujours vers le même identifiant de discussion ou handle.
Fils de type groupe (is_group=false)
Certains fils iMessage peuvent avoir plusieurs participants mais arriver quand même avec is_group=false selon la manière dont Messages stocke l’identifiant de discussion.
Si vous configurez explicitement un chat_id sous channels.imessage.groups, OpenClaw traite ce fil comme un « groupe » pour :
- l’isolation de session (clé de session
agent:<agentId>:imessage:group:<chat_id>distincte) - les comportements de liste d’autorisation de groupe / filtrage par mention
Médias + limites
- Ingestion optionnelle des pièces jointes via
channels.imessage.includeAttachments. - Plafond média via
channels.imessage.mediaMaxMb.
Limites
- Le texte sortant est découpé à
channels.imessage.textChunkLimit(par défaut 4000). - Découpage optionnel par nouvelle ligne : définissez
channels.imessage.chunkMode="newline"pour découper sur les lignes vides (frontières de paragraphes) avant le découpage par longueur. - Les envois de médias sont plafonnés par
channels.imessage.mediaMaxMb(par défaut 16).
Adressage / cibles de livraison
Préférezchat_id pour un routage stable :
chat_id:123(préféré)chat_guid:...chat_identifier:...- handles directs :
imessage:+1555/sms:+1555/[email protected]
Référence de configuration (iMessage)
Configuration complète : Configuration Options du fournisseur :channels.imessage.enabled: activer/désactiver le démarrage du canal.channels.imessage.cliPath: chemin versimsg.channels.imessage.dbPath: chemin de la base de données Messages.channels.imessage.remoteHost: hôte SSH pour le transfert SCP des pièces jointes lorsquecliPathpointe vers un Mac distant (par ex.,user@gateway-host). Auto-détecté depuis le wrapper SSH s’il n’est pas défini.channels.imessage.service:imessage | sms | auto.channels.imessage.region: région SMS.channels.imessage.dmPolicy:pairing | allowlist | open | disabled(par défaut : appairage).channels.imessage.allowFrom: liste d’autorisation des Messages prives (handles, e-mails, numéros E.164 ouchat_id:*).opennécessite"*". iMessage n’a pas de noms d’utilisateur ; utilisez des handles ou des cibles de discussion.channels.imessage.groupPolicy:open | allowlist | disabled(par défaut : allowlist).channels.imessage.groupAllowFrom: liste d’autorisation des expéditeurs de groupe.channels.imessage.historyLimit/channels.imessage.accounts.*.historyLimit: nombre maximal de messages de groupe à inclure comme contexte (0 désactive).channels.imessage.dmHistoryLimit: limite d’historique DM en tours utilisateur. Surcharges par utilisateur :channels.imessage.dms["<handle>"].historyLimit.channels.imessage.groups: valeurs par défaut par groupe + allowlist (utilisez"*"pour les valeurs globales).channels.imessage.includeAttachments: ingérer les pièces jointes dans le contexte.channels.imessage.mediaMaxMb: plafond média entrant/sortant (Mo).channels.imessage.textChunkLimit: taille des segments sortants (caractères).channels.imessage.chunkMode:length(par défaut) ounewlinepour découper sur les lignes vides (frontières de paragraphes) avant le découpage par longueur.
agents.list[].groupChat.mentionPatterns(oumessages.groupChat.mentionPatterns).messages.responsePrefix.