Signal (signal-cli)
Statut : intégration CLI externe. La Gateway communique avecsignal-cli via HTTP JSON-RPC + SSE.
Prérequis
- OpenClaw installé sur votre serveur (le flux Linux ci-dessous a été testé sur Ubuntu 24).
signal-clidisponible sur l’hôte où la gateway s’exécute.- Un numéro de téléphone pouvant recevoir un SMS de vérification (pour le parcours d’enregistrement par SMS).
- Accès à un navigateur pour le captcha Signal (
signalcaptchas.org) lors de l’enregistrement.
Configuration (chemin rapide)
- Utilisez un numero Signal distinct pour le bot (recommande).
- Installez
signal-cli(Java requis). - Choisissez un parcours d’installation :
signal-cli link -n "OpenClaw"- Parcours B (enregistrement SMS) : enregistrez un numéro dédié avec captcha + vérification SMS.
- Configurez OpenClaw et demarrez la Gateway.
- Envoyez un premier DM et approuvez l’appairage (
openclaw pairing approve signal <CODE>).
| Champ | Description |
|---|---|
account | Numéro de téléphone du bot au format E.164 (+15551234567) |
cliPath | Demarrage rapide (debutant) |
dmPolicy | Politique d’accès DM (pairing recommandé) |
allowFrom | Numéros de téléphone ou valeurs uuid:<id> autorisés à envoyer des DM |
Ce que c’est
- Canal Signal via
signal-cli(pas de libsignal embarquee). - Routage deterministe : les reponses reviennent toujours sur Signal.
- Les Messages prives partagent la session principale de l’agent ; les groupes sont isoles (
agent:<agentId>:signal:group:<groupId>).
Ecritures de configuration
Par defaut, Signal est autorise a ecrire des mises a jour de configuration declenchees par/config set|unset (necessite commands.config: true).
Desactiver avec :
Le modele de numeros (important)
- La Gateway se connecte a un appareil Signal (le compte
signal-cli). - Si vous executez le bot sur votre compte Signal personnel, il ignorera vos propres messages (protection contre les boucles).
- Pour « je texte le bot et il repond », utilisez un numero de bot distinct.
Parcours d’installation A : lier un compte Signal existant (QR)
- Installez
signal-cli(Java requis). - Liez un compte bot :
signal-cli link -n "OpenClaw"puis scannez le QR dans Signal.
- Configurez Signal et demarrez la Gateway.
channels.signal.accounts avec une configuration par compte et name en option. Voir gateway/configuration pour le modele partage.
Parcours d’installation B : enregistrer un numéro de bot dédié (SMS, Linux)
Utilisez cette option si vous souhaitez un numéro de bot dédié au lieu de lier un compte Signal existant.- Obtenez un numéro capable de recevoir des SMS (ou une vérification vocale pour les lignes fixes).
- Utilisez un numéro de bot dédié afin d’éviter les conflits de compte/session.
- Installez
signal-clisur l’hôte du gateway :
signal-cli-${VERSION}.tar.gz), installez d’abord JRE 25+.
Maintenez signal-cli à jour ; en amont, il est indiqué que les anciennes versions peuvent cesser de fonctionner lorsque les API serveur de Signal évoluent.
- Enregistrez et vérifiez le numéro :
- Ouvrez
https://signalcaptchas.org/registration/generate.html. - Complétez le captcha, puis copiez la cible du lien
signalcaptcha://...depuis « Open Signal ». - Exécutez depuis la même IP externe que la session du navigateur lorsque c’est possible.
- Relancez immédiatement l’enregistrement (les jetons captcha expirent rapidement) :
- Liez l’appareil du bot et demarrez le daemon :
- Associez votre expéditeur DM :
- Envoyez n’importe quel message au numéro du bot.
- Approuvez le code sur le serveur :
openclaw pairing approve signal <PAIRING_CODE>. - Enregistrez le numéro du bot comme contact sur votre téléphone pour éviter « Unknown contact ».
signal-cli peut déconnecter la session principale de l’application Signal pour ce numéro. Privilégiez un numéro de bot dédié, ou utilisez le mode de liaison par QR si vous devez conserver la configuration existante de votre application mobile.
Références en amont :
signal-cliREADME :https://github.com/AsamK/signal-cli- Flux captcha :
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Flux de liaison :
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Mode daemon externe (httpUrl)
Si vous souhaitez gerersignal-cli vous-meme (demarrages JVM a froid lents, initialisation de conteneur ou CPU partages), lancez le daemon separement et pointez OpenClaw dessus :
channels.signal.startupTimeoutMs.
Controle d’acces (Messages prives + groupes)
DMs:- Par defaut :
channels.signal.dmPolicy = "pairing". - Les expediteurs inconnus recoivent un code d’appairage ; les messages sont ignores jusqu’a approbation (les codes expirent apres 1 heure).
- Approuver via :
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- L’appairage est l’echange de jeton par defaut pour les Messages prives Signal. Details : Appairage
- Les expediteurs uniquement UUID (depuis
sourceUuid) sont stockes commeuuid:<id>danschannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromcontrole qui peut declencher dans les groupes lorsqueallowlistest defini.
Comment ça marche (comportement)
signal-clis’execute comme un daemon ; la Gateway lit les evenements via SSE.- Les messages entrants sont normalises dans l’enveloppe de canal partagee.
- Les reponses sont toujours renvoyees vers le meme numero ou groupe.
Medias + limites
- Le texte sortant est segmente en blocs de
channels.signal.textChunkLimit(par defaut 4000). - Segmentation optionnelle par sauts de ligne : definir
channels.signal.chunkMode="newline"pour decouper sur les lignes vides (frontieres de paragraphes) avant la segmentation par longueur. - Pieces jointes prises en charge (base64 recupere depuis
signal-cli). - Limite media par defaut :
channels.signal.mediaMaxMb(par defaut 8). - Utilisez
channels.signal.ignoreAttachmentspour ignorer le telechargement des medias. - Le contexte d’historique de groupe utilise
channels.signal.historyLimit(ouchannels.signal.accounts.*.historyLimit), avec repli versmessages.groupChat.historyLimit. Definir0pour desactiver (par defaut 50).
Indicateurs de saisie + accusés de lecture
- Indicateurs de saisie : OpenClaw envoie des signaux de saisie via
signal-cli sendTypinget les rafraichit pendant l’execution d’une reponse. - Accuses de lecture : lorsque
channels.signal.sendReadReceiptsest vrai, OpenClaw transmet les accuses de lecture pour les Messages prives autorises. - Signal-cli n’expose pas les accuses de lecture pour les groupes.
Reactions (outil message)
- Utilisez
message action=reactavecchannel=signal. - Cibles : expediteur E.164 ou UUID (utilisez
uuid:<id>depuis la sortie d’appairage ; l’UUID brut fonctionne aussi). messageIdest l’horodatage Signal du message auquel vous reagissez.- Les reactions en groupe necessitent
targetAuthoroutargetAuthorUuid.
channels.signal.actions.reactions: activer/desactiver les actions de reaction (par defaut true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackdesactive les reactions de l’agent (l’outil messagereactrenverra une erreur).minimal/extensiveactive les reactions de l’agent et definit le niveau de guidage.
- Surcharges par compte :
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Cibles de livraison (CLI/cron)
- Messages prives :
signal:+15551234567(ou E.164 simple). - Messages prives UUID :
uuid:<id>(ou UUID brut). - Groupes :
signal:group:<groupId>. - Noms d’utilisateur :
username:<name>(si pris en charge par votre compte Signal).
Problemes courants
Exécutez d’abord cette échelle :- Le démon est joignable mais pas de réponses : vérifiez les paramètres du compte/démon (
httpUrl,account) et le mode réception. - DMs ignorés: l’expéditeur est en attente d’approbation du jumelage.
- Les messages de groupe ont été ignorés : envoi de blocs de barrière d’expéditeur/mention de groupe.
- Erreurs de validation de configuration après modification : exécutez
openclaw doctor --fix. - Signal absent des diagnostics : vérifiez que
channels.signal.enabled: true.
Notes de sécurité
signal-clistocke les clés de compte localement (généralement~/.local/share/signal-cli/data/).- Sauvegardez l’état du compte Signal avant une migration ou une reconstruction du serveur.
- openclaw models auth paste-token —provider anthropic openclaw models status
- La vérification par SMS n’est requise que pour l’enregistrement ou les procédures de récupération, mais la perte de contrôle du numéro/compte peut compliquer un nouvel enregistrement.
Reference de configuration (Signal)
Configuration complete : Configuration Options du fournisseur :channels.signal.enabled: activer/desactiver le demarrage du canal.channels.signal.account: E.164 pour le compte bot.channels.signal.cliPath: chemin verssignal-cli.channels.signal.httpUrl: URL complete du daemon (remplace hote/port).channels.signal.httpHost,channels.signal.httpPort: liaison du daemon (par defaut 127.0.0.1:8080).channels.signal.autoStart: auto-lancement du daemon (par defaut true sihttpUrln’est pas defini).channels.signal.startupTimeoutMs: delai d’attente au demarrage en ms (plafond 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: ignorer le telechargement des pieces jointes.channels.signal.ignoreStories: ignorer les stories du daemon.channels.signal.sendReadReceipts: transmettre les accuses de lecture.channels.signal.dmPolicy:pairing | allowlist | open | disabled(par defaut : appairage).channels.signal.allowFrom: liste blanche des Messages prives (E.164 ouuuid:<id>).opennecessite"*". Signal n’a pas de noms d’utilisateur ; utilisez des identifiants telephone/UUID.channels.signal.groupPolicy:open | allowlist | disabled(par defaut : liste blanche).channels.signal.groupAllowFrom: liste blanche des expediteurs de groupe.channels.signal.historyLimit: nombre maximal de messages de groupe a inclure comme contexte (0 desactive).channels.signal.dmHistoryLimit: limite d’historique des Messages prives en tours utilisateur. Surcharges par utilisateur :channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: taille de segmentation sortante (caracteres).channels.signal.chunkMode:length(par defaut) ounewlinepour decouper sur les lignes vides (frontieres de paragraphes) avant la segmentation par longueur.channels.signal.mediaMaxMb: limite media entrante/sortante (Mo).
agents.list[].groupChat.mentionPatterns(Signal ne prend pas en charge les mentions natives).messages.groupChat.mentionPatterns(repli global).messages.responsePrefix.