Signal (signal-cli)
Status: externe CLI-Integration. Das Gateway kommuniziert über HTTP JSON-RPC + SSE mitsignal-cli.
Voraussetzungen
- OpenClaw ist auf deinem Server installiert (Linux-Ablauf unten getestet auf Ubuntu 24).
signal-cliist auf dem Host verfügbar, auf dem das Gateway läuft.- Eine Telefonnummer, die eine einmalige Verifizierungs-SMS empfangen kann (für den SMS-Registrierungspfad).
- Browserzugriff für das Signal-Captcha (
signalcaptchas.org) während der Registrierung.
Schnellstart (für Einsteiger)
- Verwenden Sie eine separate Signal-Nummer für den Bot (empfohlen).
- Installieren Sie
signal-cli(Java erforderlich). - Wähle einen Einrichtungsweg:
signal-cli link -n "OpenClaw"- Pfad B (SMS-Registrierung): Registriere eine dedizierte Nummer mit Captcha + SMS-Verifizierung.
- Konfigurieren Sie OpenClaw und starten Sie das Gateway.
- Sende eine erste DM und bestätige das Pairing (
openclaw pairing approve signal <CODE>).
| Feld | Beschreibung |
|---|---|
account | Bot-Telefonnummer im E.164-Format (+15551234567) |
| Einrichtung (Schnellpfad) | Pfad zu signal-cli (signal-cli, wenn im PATH) |
dmPolicy | DM-Zugriffsrichtlinie (pairing empfohlen) |
allowFrom | Telefonnummern oder uuid:<id>-Werte, die DMs senden dürfen |
Was es ist
- Signal-Kanal über
signal-cli(keine eingebettete libsignal). - Deterministisches Routing: Antworten gehen immer zurück zu Signal.
- Direktnachrichten teilen sich die Hauptsitzung des Agenten; Gruppen sind isoliert (
agent:<agentId>:signal:group:<groupId>).
Konfigurationsschreibzugriffe
Standardmäßig darf Signal Konfigurationsaktualisierungen schreiben, die durch/config set|unset ausgelöst werden (erfordert commands.config: true).
Deaktivieren mit:
Das Nummernmodell (wichtig)
- Das Gateway verbindet sich mit einem Signal-Gerät (dem
signal-cli-Konto). - Wenn Sie den Bot über Ihr persönliches Signal-Konto betreiben, ignoriert er Ihre eigenen Nachrichten (Schleifenschutz).
- Für „Ich schreibe dem Bot und er antwortet“ verwenden Sie eine separate Bot-Nummer.
Setup-Pfad A: vorhandenes Signal-Konto verknüpfen (QR)
- Installieren Sie
signal-cli(Java erforderlich). - Verknüpfen Sie ein Bot-Konto:
signal-cli link -n "OpenClaw"und scannen Sie anschließend den QR-Code in Signal.
- Konfigurieren Sie Signal und starten Sie das Gateway.
channels.signal.accounts mit kontospezifischer Konfiguration und optional name. Siehe gateway/configuration für das gemeinsame Muster.
Setup-Pfad B: dedizierte Bot-Nummer registrieren (SMS, Linux)
Verwende dies, wenn du eine dedizierte Bot-Nummer nutzen möchtest, anstatt ein bestehendes Signal-App-Konto zu verknüpfen.- Besorge dir eine Nummer, die SMS empfangen kann (oder Sprachverifizierung für Festnetznummern).
- Verwende eine dedizierte Bot-Nummer, um Konto-/Sitzungskonflikte zu vermeiden.
- Installiere
signal-cliauf dem Gateway-Host:
signal-cli-${VERSION}.tar.gz) verwendest, installiere zuerst JRE 25+.
Halte signal-cli aktuell; laut Upstream können alte Releases nicht mehr funktionieren, wenn sich die Signal-Server-APIs ändern.
- Registriere und verifiziere die Nummer:
- Öffne
https://signalcaptchas.org/registration/generate.html. - Schließe das Captcha ab und kopiere das
signalcaptcha://...-Linkziel aus „Open Signal“. - Führe den Befehl nach Möglichkeit von derselben externen IP aus wie die Browser-Sitzung.
- Führe die Registrierung sofort erneut aus (Captcha-Tokens laufen schnell ab):
- Verknüpfen Sie das Bot-Gerät und starten Sie den Daemon:
- Kopple deinen DM-Absender:
- Sende eine beliebige Nachricht an die Bot-Nummer.
- Bestätige den Code auf dem Server:
openclaw pairing approve signal <PAIRING_CODE>. - Speichere die Bot-Nummer als Kontakt auf deinem Telefon, um „Unbekannter Kontakt“ zu vermeiden.
signal-cli kann die Haupt-Signal-App-Sitzung für diese Nummer abmelden. Bevorzuge eine dedizierte Bot-Nummer oder verwende den QR-Verknüpfungsmodus, wenn du deine bestehende Telefon-App-Konfiguration beibehalten möchtest.
Upstream-Referenzen:
signal-cliREADME:https://github.com/AsamK/signal-cli- Captcha-Ablauf:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Verknüpfungsablauf:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Externer Daemon-Modus (httpUrl)
Wenn Siesignal-cli selbst verwalten möchten (langsamer JVM-Kaltstart, Container-Initialisierung oder geteilte CPUs), führen Sie den Daemon separat aus und verweisen Sie OpenClaw darauf:
channels.signal.startupTimeoutMs.
Zugriffskontrolle (DMs + Gruppen)
DMs:- Standard:
channels.signal.dmPolicy = "pairing". - Unbekannte Absender erhalten einen Kopplungscode; Nachrichten werden ignoriert, bis sie freigegeben sind (Codes laufen nach 1 Stunde ab).
- Freigabe über:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Kopplung ist der Standard-Token-Austausch für Signal-DMs. Details: Pairing
- Absender nur mit UUID (von
sourceUuid) werden alsuuid:<id>inchannels.signal.allowFromgespeichert.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromsteuert, wer in Gruppen auslösen darf, wennallowlistgesetzt ist.
Funktionsweise (Verhalten)
signal-cliläuft als Daemon; das Gateway liest Ereignisse über SSE.- Eingehende Nachrichten werden in den gemeinsamen Kanal-Umschlag normalisiert.
- Antworten werden immer an dieselbe Nummer oder Gruppe zurückgeleitet.
Medien + Limits
- Ausgehender Text wird in Blöcke bis
channels.signal.textChunkLimitaufgeteilt (Standard 4000). - Optionale Zeilenumbruch-Aufteilung: Setzen Sie
channels.signal.chunkMode="newline", um vor der Längenaufteilung an Leerzeilen (Absatzgrenzen) zu trennen. - Anhänge werden unterstützt (Base64 aus
signal-cliabgerufen). - Standard-Medienlimit:
channels.signal.mediaMaxMb(Standard 8). - Verwenden Sie
channels.signal.ignoreAttachments, um das Herunterladen von Medien zu überspringen. - Gruppen-Historienkontext verwendet
channels.signal.historyLimit(oderchannels.signal.accounts.*.historyLimit) und fällt aufmessages.groupChat.historyLimitzurück. Setzen Sie0zum Deaktivieren (Standard 50).
Tippstatus + Lesebestätigungen
- Tippindikatoren: OpenClaw sendet Tipp-Signale über
signal-cli sendTypingund aktualisiert sie, während eine Antwort läuft. - Lesebestätigungen: Wenn
channels.signal.sendReadReceiptswahr ist, leitet OpenClaw Lesebestätigungen für erlaubte DMs weiter. - Signal-cli stellt keine Lesebestätigungen für Gruppen bereit.
Reaktionen (Nachrichten-Werkzeug)
- Verwenden Sie
message action=reactmitchannel=signal. - Ziele: Absender E.164 oder UUID (verwenden Sie
uuid:<id>aus der Kopplungsausgabe; eine nackte UUID funktioniert ebenfalls). messageIdist der Signal-Zeitstempel der Nachricht, auf die Sie reagieren.- Gruppenreaktionen erfordern
targetAuthorodertargetAuthorUuid.
channels.signal.actions.reactions: Reaktionsaktionen aktivieren/deaktivieren (Standard true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackdeaktiviert Agentenreaktionen (das Nachrichten-Werkzeugreactliefert einen Fehler).minimal/extensiveaktiviert Agentenreaktionen und legt den Leitfaden-Level fest.
- Kontospezifische Überschreibungen:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Zustellziele (CLI/cron)
- DMs:
signal:+15551234567(oder einfache E.164). - UUID-DMs:
uuid:<id>(oder nackte UUID). - Gruppen:
signal:group:<groupId>. - Benutzernamen:
username:<name>(falls von Ihrem Signal-Konto unterstützt).
Fehlerbehebung
Führen Sie zuerst diese Abfolge aus:- Daemon erreichbar, aber keine Antworten: Überprüfen Sie Konto-/Daemon-Einstellungen (
httpUrl,account) und den Empfangsmodus. - DMs werden ignoriert: Absender wartet auf Kopplungsfreigabe.
- Gruppennachrichten werden ignoriert: Einschränkungen für Gruppenabsender/Erwähnungen blockieren die Zustellung.
- Konfigurationsvalidierungsfehler nach Änderungen: führe
openclaw doctor --fixaus. - Signal fehlt in der Diagnose: bestätige
channels.signal.enabled: true.
Sicherheitshinweise
signal-clispeichert Kontoschlüssel lokal (typischerweise~/.local/share/signal-cli/data/).- Sichern Sie den Signal-Kontostatus vor einer Servermigration oder einem Neuaufbau.
- Behalten Sie
channels.signal.dmPolicy: "pairing"bei, es sei denn, Sie möchten ausdrücklich einen breiteren DM-Zugriff. - Die SMS-Verifizierung wird nur für Registrierungs- oder Wiederherstellungsabläufe benötigt, aber der Verlust der Kontrolle über die Nummer bzw. das Konto kann eine erneute Registrierung erschweren.
Konfigurationsreferenz (Signal)
Vollständige Konfiguration: Konfiguration Anbieteroptionen:channels.signal.enabled: Kanalstart aktivieren/deaktivieren.channels.signal.account: E.164 für das Bot-Konto.channels.signal.cliPath: Pfad zusignal-cli.channels.signal.httpUrl: vollständige Daemon-URL (überschreibt Host/Port).channels.signal.httpHost,channels.signal.httpPort: Daemon-Bindung (Standard 127.0.0.1:8080).channels.signal.autoStart: Daemon automatisch starten (Standard true, wennhttpUrlnicht gesetzt ist).channels.signal.startupTimeoutMs: Start-Wartezeit-Timeout in ms (Obergrenze 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: Download von Anhängen überspringen.channels.signal.ignoreStories: Stories vom Daemon ignorieren.channels.signal.sendReadReceipts: Lesebestätigungen weiterleiten.channels.signal.dmPolicy:pairing | allowlist | open | disabled(Standard: Kopplung).channels.signal.allowFrom: DM-Allowlist (E.164 oderuuid:<id>).openerfordert"*". Signal hat keine Benutzernamen; verwenden Sie Telefon-/UUID-IDs.channels.signal.groupPolicy:open | allowlist | disabled(Standard: Allowlist).channels.signal.groupAllowFrom: Allowlist für Gruppenabsender.channels.signal.historyLimit: maximale Anzahl an Gruppennachrichten, die als Kontext einbezogen werden (0 deaktiviert).channels.signal.dmHistoryLimit: DM-Historienlimit in Benutzerzügen. Benutzerspezifische Überschreibungen:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: Größe der ausgehenden Textblöcke (Zeichen).channels.signal.chunkMode:length(Standard) odernewline, um vor der Längenaufteilung an Leerzeilen (Absatzgrenzen) zu trennen.channels.signal.mediaMaxMb: Medienlimit für ein- und ausgehende Inhalte (MB).
agents.list[].groupChat.mentionPatterns(Signal unterstützt keine nativen Erwähnungen).messages.groupChat.mentionPatterns(globaler Fallback).messages.responsePrefix.