Signal (signal-cli)
Status: integracja zewnętrznego CLI. Gateway komunikuje się zsignal-cli przez HTTP JSON-RPC + SSE.
Wymagania wstępne
- OpenClaw zainstalowany na Twoim serwerze (poniższy proces dla Linux przetestowano na Ubuntu 24).
signal-clidostępny na hoście, na którym działa gateway.- Numer telefonu, który może odebrać jedną wiadomość SMS weryfikacyjną (dla ścieżki rejestracji SMS).
- Dostęp do przeglądarki dla captcha Signal (
signalcaptchas.org) podczas rejestracji.
Szybka konfiguracja (dla początkujących)
- Użyj oddzielnego numeru Signal dla bota (zalecane).
- Zainstaluj
signal-cli(wymagana Java). - Wybierz jedną ścieżkę konfiguracji:
signal-cli link -n "OpenClaw"- Ścieżka B (rejestracja SMS): zarejestruj dedykowany numer z captcha + weryfikacją SMS.
- Skonfiguruj OpenClaw i uruchom gateway.
- Wyślij pierwszą wiadomość DM i zatwierdź parowanie (
openclaw pairing approve signal <CODE>).
| Pole | Opis |
|---|---|
account | Numer telefonu bota w formacie E.164 (+15551234567) |
| Konfiguracja (szybka ścieżka) | Ścieżka do signal-cli (signal-cli, jeśli znajduje się w PATH) |
dmPolicy | Polityka dostępu do DM (zalecane pairing) |
allowFrom | Numery telefonów lub wartości uuid:<id> uprawnione do wysyłania DM |
Czym to jest
- Kanał Signal przez
signal-cli(nie wbudowana libsignal). - Deterministyczne routowanie: odpowiedzi zawsze wracają do Signal.
- DM-y współdzielą główną sesję agenta; grupy są izolowane (
agent:<agentId>:signal:group:<groupId>).
Zapisy konfiguracji
Domyślnie Signal ma prawo zapisywać aktualizacje konfiguracji wyzwalane przez/config set|unset (wymaga commands.config: true).
Wyłącz za pomocą:
Model numeru (ważne)
- Gateway łączy się z urządzeniem Signal (konto
signal-cli). - Jeśli uruchamiasz bota na swoim osobistym koncie Signal, będzie on ignorował Twoje własne wiadomości (ochrona przed pętlą).
- Aby uzyskać scenariusz „piszę do bota i on odpowiada”, użyj oddzielnego numeru bota.
Ścieżka konfiguracji A: połącz istniejące konto Signal (QR)
- Zainstaluj
signal-cli(wymagana Java). - Sparuj konto bota:
signal-cli link -n "OpenClaw", a następnie zeskanuj kod QR w Signal.
- Skonfiguruj Signal i uruchom gateway.
channels.signal.accounts z konfiguracją per konto oraz opcjonalnym name. Zobacz gateway/configuration dla wspólnego wzorca.
Ścieżka konfiguracji B: zarejestruj dedykowany numer bota (SMS, Linux)
Użyj tej opcji, jeśli chcesz mieć dedykowany numer bota zamiast łączyć istniejące konto aplikacji Signal.- Uzyskaj numer, który może odbierać SMS (lub weryfikację głosową dla numerów stacjonarnych).
- Użyj dedykowanego numeru bota, aby uniknąć konfliktów konta/sesji.
- Zainstaluj
signal-clina hoście gateway:
signal-cli-${VERSION}.tar.gz), najpierw zainstaluj JRE 25+.
Utrzymuj signal-cli w najnowszej wersji; upstream informuje, że starsze wydania mogą przestać działać wraz ze zmianami w API serwera Signal.
- Zarejestruj i zweryfikuj numer:
- Otwórz
https://signalcaptchas.org/registration/generate.html. - Ukończ captcha, skopiuj adres linku
signalcaptcha://...z „Open Signal”. - Jeśli to możliwe, wykonaj polecenie z tego samego zewnętrznego adresu IP co sesja przeglądarki.
- Natychmiast ponownie uruchom rejestrację (tokeny captcha szybko wygasają):
- Sparuj urządzenie bota i uruchom demona:
- Częste awarie:
- Wyślij dowolną wiadomość na numer bota.
- Zatwierdź kod na serwerze:
openclaw pairing approve signal <PAIRING_CODE>. - Zapisz numer bota jako kontakt w telefonie, aby uniknąć komunikatu „Nieznany kontakt”.
signal-cli może wylogować główną sesję aplikacji Signal dla tego numeru. Preferuj dedykowany numer bota lub użyj trybu łączenia QR, jeśli chcesz zachować istniejącą konfigurację aplikacji w telefonie.
Źródła upstream:
signal-cliREADME:https://github.com/AsamK/signal-cli- Proces captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Proces łączenia:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Tryb zewnętrznego demona (httpUrl)
Jeśli chcesz samodzielnie zarządzaćsignal-cli (wolne zimne starty JVM, inicjalizacja kontenera lub współdzielone CPU), uruchom demona osobno i wskaż go w OpenClaw:
channels.signal.startupTimeoutMs.
Kontrola dostępu (DM-y + grupy)
DM-y:- Domyślnie:
channels.signal.dmPolicy = "pairing". - Nieznani nadawcy otrzymują kod parowania; wiadomości są ignorowane do momentu zatwierdzenia (kody wygasają po 1 godzinie).
- Zatwierdzanie przez:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Parowanie jest domyślną wymianą tokenów dla DM-ów Signal. Szczegóły: Pairing
- Nadawcy tylko z UUID (z
sourceUuid) są zapisywani jakouuid:<id>wchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromkontroluje, kto może wyzwalać w grupach, gdy ustawione jestallowlist.
Jak to działa (zachowanie)
signal-clidziała jako demon; gateway odczytuje zdarzenia przez SSE.- Wiadomości przychodzące są normalizowane do wspólnej koperty kanału.
- Odpowiedzi zawsze wracają do tego samego numeru lub grupy.
Media i limity
- Tekst wychodzący jest dzielony na fragmenty do
channels.signal.textChunkLimit(domyślnie 4000). - Opcjonalne dzielenie po nowych liniach: ustaw
channels.signal.chunkMode="newline", aby dzielić po pustych liniach (granice akapitów) przed dzieleniem według długości. - Obsługiwane są załączniki (base64 pobierane z
signal-cli). - Domyślny limit mediów:
channels.signal.mediaMaxMb(domyślnie 8). - Użyj
channels.signal.ignoreAttachments, aby pominąć pobieranie mediów. - Kontekst historii grup używa
channels.signal.historyLimit(lubchannels.signal.accounts.*.historyLimit), z przejściem awaryjnym domessages.groupChat.historyLimit. Ustaw0, aby wyłączyć (domyślnie 50).
Pisanie + potwierdzenia odczytu
- Wskaźniki pisania: OpenClaw wysyła sygnały pisania przez
signal-cli sendTypingi odświeża je podczas generowania odpowiedzi. - Potwierdzenia odczytu: gdy
channels.signal.sendReadReceiptsjest true, OpenClaw przekazuje potwierdzenia odczytu dla dozwolonych DM-ów. - Signal-cli nie udostępnia potwierdzeń odczytu dla grup.
Reakcje (narzędzie wiadomości)
- Użyj
message action=reactzchannel=signal. - Cele: nadawca E.164 lub UUID (użyj
uuid:<id>z wyjścia parowania; goły UUID też działa). messageIdto znacznik czasu Signal dla wiadomości, na którą reagujesz.- Reakcje w grupach wymagają
targetAuthorlubtargetAuthorUuid.
channels.signal.actions.reactions: włącz/wyłącz akcje reakcji (domyślnie true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackwyłącza reakcje agenta (narzędzie wiadomościreactzgłosi błąd).minimal/extensivewłącza reakcje agenta i ustawia poziom wskazówek.
- Nadpisania per konto:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Cele dostarczania (CLI/cron)
- DM-y:
signal:+15551234567(lub zwykły E.164). - DM-y UUID:
uuid:<id>(lub goły UUID). - Grupy:
signal:group:<groupId>. - Nazwy użytkowników:
username:<name>(jeśli obsługiwane przez Twoje konto Signal).
Rozwiązywanie problemów
Najpierw uruchom tę drabinę:- Demon osiągalny, ale brak odpowiedzi: zweryfikuj ustawienia konta/demona (
httpUrl,account) oraz tryb odbioru. - DM-y ignorowane: nadawca oczekuje na zatwierdzenie parowania.
- Wiadomości grupowe ignorowane: bramkowanie nadawcy/wzmianek w grupach blokuje dostarczenie.
- Błędy walidacji konfiguracji po edycji: uruchom
openclaw doctor --fix. - Brak Signal w diagnostyce: potwierdź
channels.signal.enabled: true.
Uwagi dotyczące bezpieczeństwa
signal-cliprzechowuje klucze konta lokalnie (zwykle~/.local/share/signal-cli/data/).- Wykonaj kopię zapasową stanu konta Signal przed migracją lub przebudową serwera.
- Zachowaj
channels.signal.dmPolicy: "pairing", chyba że wyraźnie chcesz umożliwić szerszy dostęp do DM. - Weryfikacja SMS jest wymagana tylko podczas rejestracji lub odzyskiwania konta, ale utrata kontroli nad numerem/kontem może skomplikować ponowną rejestrację.
Referencja konfiguracji (Signal)
Pełna konfiguracja: Configuration Opcje dostawcy:channels.signal.enabled: włącz/wyłącz uruchamianie kanału.channels.signal.account: E.164 dla konta bota.channels.signal.cliPath: ścieżka dosignal-cli.channels.signal.httpUrl: pełny URL demona (nadpisuje host/port).channels.signal.httpHost,channels.signal.httpPort: powiązanie demona (domyślnie 127.0.0.1:8080).channels.signal.autoStart: automatyczne uruchamianie demona (domyślnie true, jeślihttpUrlnieustawione).channels.signal.startupTimeoutMs: limit czasu oczekiwania na start w ms (limit 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: pomiń pobieranie załączników.channels.signal.ignoreStories: ignoruj relacje z demona.channels.signal.sendReadReceipts: przekazuj potwierdzenia odczytu.channels.signal.dmPolicy:pairing | allowlist | open | disabled(domyślnie: parowanie).channels.signal.allowFrom: lista dozwolonych DM-ów (E.164 lubuuid:<id>).openwymaga"*". Signal nie ma nazw użytkowników; użyj identyfikatorów telefonu/UUID.channels.signal.groupPolicy:open | allowlist | disabled(domyślnie: lista dozwolonych).channels.signal.groupAllowFrom: lista dozwolonych nadawców w grupach.channels.signal.historyLimit: maksymalna liczba wiadomości grupowych do uwzględnienia jako kontekst (0 wyłącza).channels.signal.dmHistoryLimit: limit historii DM-ów w turach użytkownika. Nadpisania per użytkownik:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: rozmiar fragmentów wychodzących (znaki).channels.signal.chunkMode:length(domyślne) lubnewline, aby dzielić po pustych liniach (granice akapitów) przed dzieleniem według długości.channels.signal.mediaMaxMb: limit mediów przychodzących/wychodzących (MB).
agents.list[].groupChat.mentionPatterns(Signal nie obsługuje natywnych wzmianek).messages.groupChat.mentionPatterns(globalny fallback).messages.responsePrefix.