Signal (signal-cli)
Status: externe CLI-Integration. Das Gateway kommuniziert mitsignal-cli über HTTP JSON-RPC + SSE.
Voraussetzungen
- OpenClaw ist auf Ihrem Server installiert (der Linux-Ablauf unten wurde unter Ubuntu 24 getestet).
signal-cliist auf dem Host verfügbar, auf dem das Gateway läuft.- Eine Telefonnummer, die eine Verifizierungs-SMS empfangen kann (für den SMS-Registrierungsweg).
- Browserzugriff für das Signal-Captcha (
signalcaptchas.org) während der Registrierung.
Schnelle Einrichtung (für Einsteiger)
- Verwenden Sie eine separate Signal-Nummer für den Bot (empfohlen).
- Installieren Sie
signal-cli(Java ist erforderlich, wenn Sie den JVM-Build verwenden). - Wählen Sie einen Einrichtungsweg:
- Weg A (QR-Verknüpfung):
signal-cli link -n "OpenClaw"und mit Signal scannen. - Weg B (SMS-Registrierung): Registrieren Sie eine dedizierte Nummer mit Captcha + SMS-Verifizierung.
- Weg A (QR-Verknüpfung):
- Konfigurieren Sie OpenClaw und starten Sie das Gateway neu.
- Senden Sie eine erste DM und genehmigen Sie das Pairing (
openclaw pairing approve signal <CODE>).
| Feld | Beschreibung |
|---|---|
account | Bot-Telefonnummer im E.164-Format (+15551234567) |
cliPath | Pfad zu signal-cli (signal-cli, wenn auf 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(nicht eingebettetes libsignal). - Deterministisches Routing: Antworten gehen immer an Signal zurück.
- DMs teilen die Hauptsitzung des Agenten; Gruppen sind isoliert (
agent:<agentId>:signal:group:<groupId>).
Konfigurationsschreibvorgänge
Standardmäßig darf Signal durch/config set|unset ausgelöste Konfigurationsaktualisierungen schreiben (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 auf Ihrem persönlichen Signal-Konto ausführen, ignoriert er Ihre eigenen Nachrichten (Loop-Schutz).
- Für „Ich schreibe dem Bot und er antwortet“ verwenden Sie eine separate Bot-Nummer.
Einrichtungsweg A: vorhandenes Signal-Konto verknüpfen (QR)
- Installieren Sie
signal-cli(JVM- oder nativer Build). - Verknüpfen Sie ein Bot-Konto:
signal-cli link -n "OpenClaw"und scannen Sie dann den QR-Code in Signal.
- Konfigurieren Sie Signal und starten Sie das Gateway.
channels.signal.accounts mit kontospezifischer Konfiguration und optionalem name. Siehe gateway/configuration für das gemeinsame Muster.
Einrichtungsweg B: dedizierte Bot-Nummer registrieren (SMS, Linux)
Verwenden Sie dies, wenn Sie eine dedizierte Bot-Nummer statt der Verknüpfung eines bestehenden Signal-App-Kontos verwenden möchten.- Besorgen Sie sich eine Nummer, die SMS empfangen kann (oder Sprachverifizierung für Festnetzanschlüsse).
- Verwenden Sie eine dedizierte Bot-Nummer, um Konto-/Sitzungskonflikte zu vermeiden.
- Installieren Sie
signal-cliauf dem Gateway-Host:
signal-cli-${VERSION}.tar.gz) verwenden, installieren Sie zuerst JRE 25+.
Halten Sie signal-cli aktuell; Upstream weist darauf hin, dass ältere Releases brechen können, wenn sich die Signal-Server-APIs ändern.
- Registrieren und verifizieren Sie die Nummer:
- Öffnen Sie
https://signalcaptchas.org/registration/generate.html. - Schließen Sie das Captcha ab und kopieren Sie das Linkziel
signalcaptcha://...aus „Open Signal“. - Führen Sie den Befehl möglichst von derselben externen IP wie die Browsersitzung aus.
- Führen Sie die Registrierung sofort erneut aus (Captcha-Token laufen schnell ab):
- Konfigurieren Sie OpenClaw, starten Sie das Gateway neu und überprüfen Sie den Kanal:
- Koppeln Sie Ihren DM-Absender:
- Senden Sie eine beliebige Nachricht an die Bot-Nummer.
- Genehmigen Sie den Code auf dem Server:
openclaw pairing approve signal <PAIRING_CODE>. - Speichern Sie die Bot-Nummer als Kontakt auf Ihrem Telefon, um „Unknown contact“ zu vermeiden.
signal-cli kann die Authentifizierung der Haupt-Signal-App-Sitzung für diese Nummer aufheben. Bevorzugen Sie eine dedizierte Bot-Nummer oder verwenden Sie den QR-Verknüpfungsmodus, wenn Sie Ihre bestehende Telefon-App-Konfiguration beibehalten müssen.
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 (langsame JVM-Kaltstarts, Container-Initialisierung oder gemeinsam genutzte 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 Pairing-Code; Nachrichten werden ignoriert, bis sie freigegeben werden (Codes laufen nach 1 Stunde ab).
- Freigabe über:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Pairing ist der Standard-Tokenaustausch für Signal-DMs. Details: Pairing
- Sender nur mit UUID (aus
sourceUuid) werden alsuuid:<id>inchannels.signal.allowFromgespeichert.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromsteuert, wer in Gruppen auslösen kann, wennallowlistgesetzt ist.channels.signal.groups["<group-id>" | "*"]kann das Gruppenverhalten mitrequireMention,toolsundtoolsBySenderüberschreiben.- Verwenden Sie
channels.signal.accounts.<id>.groupsfür kontospezifische Überschreibungen in Multi-Account-Setups. - Laufzeithinweis: Wenn
channels.signalvollständig fehlt, fällt die Laufzeit bei Gruppenprüfungen aufgroupPolicy="allowlist"zurück (auch wennchannels.defaults.groupPolicygesetzt ist).
So funktioniert es (Verhalten)
signal-cliläuft als Daemon; das Gateway liest Ereignisse per SSE.- Eingehende Nachrichten werden in den gemeinsamen Channel-Umschlag normalisiert.
- Antworten werden immer an dieselbe Nummer oder Gruppe zurückgeleitet.
Medien + Limits
- Ausgehender Text wird auf
channels.signal.textChunkLimitbegrenzt (Standard 4000). - Optionales Chunking nach Zeilenumbrüchen: Setzen Sie
channels.signal.chunkMode="newline", um vor dem Längen-Chunking an Leerzeilen (Absatzgrenzen) zu teilen. - Anhänge werden unterstützt (base64 von
signal-cliabgerufen). - Standard-Medienlimit:
channels.signal.mediaMaxMb(Standard 8). - Verwenden Sie
channels.signal.ignoreAttachments, um das Herunterladen von Medien zu überspringen. - Der Gruppenverlaufskontext verwendet
channels.signal.historyLimit(oderchannels.signal.accounts.*.historyLimit) und fällt aufmessages.groupChat.historyLimitzurück. Setzen Sie0, um ihn zu deaktivieren (Standard 50).
Tippindikatoren + Lesebestätigungen
- Tippindikatoren: OpenClaw sendet Tipp-Signale über
signal-cli sendTypingund aktualisiert sie, während eine Antwort läuft. - Lesebestätigungen: Wenn
channels.signal.sendReadReceiptsauf true gesetzt ist, leitet OpenClaw Lesebestätigungen für erlaubte DMs weiter. - Signal-cli stellt keine Lesebestätigungen für Gruppen bereit.
Reaktionen (Nachrichtentool)
- Verwenden Sie
message action=reactmitchannel=signal. - Ziele: E.164 des Absenders oder UUID (verwenden Sie
uuid:<id>aus der Pairing-Ausgabe; 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 Nachrichtentoolreactgibt einen Fehler aus).minimal/extensiveaktiviert Agentenreaktionen und setzt die Stufe der Anleitung.
- Kontospezifische Überschreibungen:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Zustellungsziele (CLI/cron)
- DMs:
signal:+15551234567(oder einfach 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: Der Absender wartet auf Pairing-Freigabe.
- Gruppennachrichten werden ignoriert: Gruppenabsender-/Mention-Gating blockiert die Zustellung.
- Konfigurationsvalidierungsfehler nach Bearbeitungen: Führen Sie
openclaw doctor --fixaus. - Signal fehlt in der Diagnose: Stellen Sie sicher, dass
channels.signal.enabled: truegesetzt ist.
Sicherheitshinweise
signal-clispeichert Kontoschlüssel lokal (typischerweise~/.local/share/signal-cli/data/).- Sichern Sie den Status des Signal-Kontos vor einer Servermigration oder einem Neuaufbau.
- Behalten Sie
channels.signal.dmPolicy: "pairing"bei, sofern Sie nicht ausdrücklich breiteren DM-Zugriff wünschen. - Die SMS-Verifizierung wird nur für Registrierungs- oder Wiederherstellungsabläufe benötigt, aber ein Verlust der Kontrolle über Nummer/Konto kann die erneute Registrierung erschweren.
Konfigurationsreferenz (Signal)
Vollständige Konfiguration: Configuration Provider-Optionen:channels.signal.enabled: Start des Kanals 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: Warte-Timeout für den Start in ms (Maximum 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: pairing).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: Absender-Allowlist für Gruppen.channels.signal.groups: Überschreibungen pro Gruppe, nach Signal-Gruppen-ID (oder"*") indiziert. Unterstützte Felder:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: kontospezifische Version vonchannels.signal.groupsfür Multi-Account-Setups.channels.signal.historyLimit: maximale Anzahl an Gruppennachrichten, die als Kontext einbezogen werden (0 deaktiviert).channels.signal.dmHistoryLimit: DM-Verlaufslimit in Benutzerrunden. Überschreibungen pro Benutzer:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: Größe ausgehender Chunks (Zeichen).channels.signal.chunkMode:length(Standard) odernewline, um vor dem Längen-Chunking an Leerzeilen (Absatzgrenzen) zu teilen.channels.signal.mediaMaxMb: Limit für eingehende/ausgehende Medien (MB).
agents.list[].groupChat.mentionPatterns(Signal unterstützt keine nativen Erwähnungen).messages.groupChat.mentionPatterns(globaler Fallback).messages.responsePrefix.
Verwandt
- Channels Overview — alle unterstützten Kanäle
- Pairing — DM-Authentifizierung und Pairing-Ablauf
- Groups — Verhalten in Gruppenchats und Mention-Gating
- Channel Routing — Sitzungsrouting für Nachrichten
- Security — Zugriffsmodell und Härtung