Signal (signal-cli)
Status: zewnętrzna integracja CLI. Gateway komunikuje się zsignal-cli przez HTTP JSON-RPC + SSE.
Wymagania wstępne
- OpenClaw zainstalowany na serwerze (poniższy przepływ dla Linuksa testowano 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 na potrzeby captcha Signal (
signalcaptchas.org) podczas rejestracji.
Szybka konfiguracja (dla początkujących)
- Użyj oddzielnego numeru Signal dla bota (zalecane).
- Zainstaluj
signal-cli(Java jest wymagana, jeśli używasz kompilacji JVM). - Wybierz jedną ścieżkę konfiguracji:
- Ścieżka A (połączenie przez QR):
signal-cli link -n "OpenClaw"i zeskanuj kod w Signal. - Ścieżka B (rejestracja SMS): zarejestruj dedykowany numer z captcha + weryfikacją SMS.
- Ścieżka A (połączenie przez QR):
- Skonfiguruj OpenClaw i uruchom ponownie 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) |
cliPath | Ścieżka do signal-cli (signal-cli, jeśli jest w PATH) |
dmPolicy | Polityka dostępu do DM (pairing jest zalecane) |
allowFrom | Numery telefonów lub wartości uuid:<id> dozwolone w DM |
Czym to jest
- Kanał Signal przez
signal-cli(nie osadzony libsignal). - Deterministyczne routowanie: odpowiedzi zawsze wracają do Signal.
- DM współdzielą główną sesję agenta; grupy są izolowane (
agent:<agentId>:signal:group:<groupId>).
Zapis konfiguracji
Domyślnie Signal może zapisywać aktualizacje konfiguracji wywołane przez/config set|unset (wymaga commands.config: true).
Wyłącz za pomocą:
Model numerów (ważne)
- Gateway łączy się z urządzeniem Signal (kontem
signal-cli). - Jeśli uruchamiasz bota na swoim osobistym koncie Signal, będzie ignorować Twoje własne wiadomości (ochrona przed pętlą).
- Dla scenariusza „piszę do bota, a on odpowiada” użyj oddzielnego numeru bota.
Ścieżka konfiguracji A: połącz istniejące konto Signal (QR)
- Zainstaluj
signal-cli(kompilacja JVM lub natywna). - Połącz konto bota:
signal-cli link -n "OpenClaw"i zeskanuj kod QR w Signal.
- Skonfiguruj Signal i uruchom gateway.
channels.signal.accounts z konfiguracją per konto i opcjonalnym name. Wspólny wzorzec znajdziesz w gateway/configuration.
Ścieżka konfiguracji B: zarejestruj dedykowany numer bota (SMS, Linux)
Użyj tego wariantu, jeśli chcesz mieć dedykowany numer bota zamiast łączyć istniejące konto aplikacji Signal.- Zdobądź numer, który może odbierać SMS-y (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 aktualnej wersji; upstream zaznacza, że stare wydania mogą przestać działać wraz ze zmianami API serwerów Signal.
- Zarejestruj i zweryfikuj numer:
- Otwórz
https://signalcaptchas.org/registration/generate.html. - Ukończ captcha, skopiuj docelowy link
signalcaptcha://...z „Open Signal”. - Jeśli to możliwe, uruchom z tego samego zewnętrznego IP co sesja przeglądarki.
- Natychmiast uruchom rejestrację ponownie (tokeny captcha szybko wygasają):
- Skonfiguruj OpenClaw, uruchom ponownie gateway, zweryfikuj kanał:
- Sparuj nadawcę DM:
- 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ąć „Unknown contact”.
signal-cli może wylogować główną sesję aplikacji Signal dla tego numeru. Preferuj dedykowany numer bota albo użyj trybu połączenia QR, jeśli chcesz zachować obecną konfigurację aplikacji w telefonie.
Materiały upstream:
- README
signal-cli:https://github.com/AsamK/signal-cli - Przepływ captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Przepływ łą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 (powolne zimne starty JVM, inicjalizacja kontenera lub współdzielone CPU), uruchom demon osobno i wskaż go w OpenClaw:
channels.signal.startupTimeoutMs.
Kontrola dostępu (DM + grupy)
DM:- Domyślnie:
channels.signal.dmPolicy = "pairing". - Nieznani nadawcy otrzymują kod parowania; wiadomości są ignorowane do czasu zatwierdzenia (kody wygasają po 1 godzinie).
- Zatwierdzanie przez:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Parowanie jest domyślnym mechanizmem wymiany tokenów dla DM w Signal. Szczegóły: Parowanie
- 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 wywoływać działanie w grupach, gdy ustawionoallowlist.channels.signal.groups["<group-id>" | "*"]może nadpisać zachowanie grupy za pomocąrequireMention,toolsitoolsBySender.- Użyj
channels.signal.accounts.<id>.groupsdla nadpisań per konto w konfiguracjach wielokontowych. - Uwaga dotycząca runtime: jeśli
channels.signaljest całkowicie nieobecne, runtime wraca dogroupPolicy="allowlist"dla sprawdzania grup (nawet jeśli ustawionochannels.defaults.groupPolicy).
Jak to działa (zachowanie)
signal-clidziała jako demon; gateway odczytuje zdarzenia przez SSE.- Wiadomości przychodzące są normalizowane do współdzielonej koperty kanału.
- Odpowiedzi zawsze wracają na ten sam numer lub do tej samej grupy.
Media i limity
- Tekst wychodzący jest dzielony na fragmenty zgodnie z
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. - Załączniki są obsługiwane (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 grupy używa
channels.signal.historyLimit(lubchannels.signal.accounts.*.historyLimit), z fallbackiem domessages.groupChat.historyLimit. Ustaw0, aby wyłączyć (domyślnie 50).
Pisanie i 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.sendReadReceiptsma wartość true, OpenClaw przekazuje potwierdzenia odczytu dla dozwolonych DM. - Signal-cli nie udostępnia potwierdzeń odczytu dla grup.
Reakcje (narzędzie wiadomości)
- Użyj
message action=reactzchannel=signal. - Cele: E.164 nadawcy lub UUID (użyj
uuid:<id>z danych wyjściowych parowania; samo 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łącza/wyłącza akcje reakcji (domyślnie true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackwyłącza reakcje agenta (narzędzie wiadomościreactzwróci 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:
signal:+15551234567(lub zwykły E.164). - DM z UUID:
uuid:<id>(lub samo UUID). - Grupy:
signal:group:<groupId>. - Nazwy użytkowników:
username:<name>(jeśli są obsługiwane przez Twoje konto Signal).
Rozwiązywanie problemów
Najpierw wykonaj tę sekwencję:- Demon jest osiągalny, ale brak odpowiedzi: sprawdź ustawienia konta/demona (
httpUrl,account) i tryb odbioru. - DM są ignorowane: nadawca oczekuje na zatwierdzenie parowania.
- Wiadomości grupowe są ignorowane: ograniczenia nadawcy/wzmianki w grupie blokują 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/).- Przed migracją serwera lub jego przebudową wykonaj kopię zapasową stanu konta Signal.
- Zachowaj
channels.signal.dmPolicy: "pairing", chyba że świadomie chcesz szerszego dostępu do DM. - Weryfikacja SMS jest potrzebna tylko do rejestracji lub odzyskiwania, ale utrata kontroli nad numerem/kontem może utrudnić ponowną rejestrację.
Dokumentacja konfiguracji (Signal)
Pełna konfiguracja: Konfiguracja Opcje dostawcy:channels.signal.enabled: włączanie/wyłączanie uruchamiania 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ślihttpUrlnie jest ustawione).channels.signal.startupTimeoutMs: limit oczekiwania na start w ms (maks. 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: pomijanie pobierania załączników.channels.signal.ignoreStories: ignorowanie stories z demona.channels.signal.sendReadReceipts: przekazywanie potwierdzeń odczytu.channels.signal.dmPolicy:pairing | allowlist | open | disabled(domyślnie: pairing).channels.signal.allowFrom: lista dozwolonych DM (E.164 lubuuid:<id>).openwymaga"*". Signal nie ma nazw użytkowników; używaj identyfikatorów telefon/UUID.channels.signal.groupPolicy:open | allowlist | disabled(domyślnie: allowlist).channels.signal.groupAllowFrom: lista dozwolonych nadawców grupowych.channels.signal.groups: nadpisania per grupa kluczowane identyfikatorem grupy Signal (lub"*"). Obsługiwane pola:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: wersjachannels.signal.groupsper konto dla konfiguracji wielokontowych.channels.signal.historyLimit: maksymalna liczba wiadomości grupowych do uwzględnienia jako kontekst (0 wyłącza).channels.signal.dmHistoryLimit: limit historii DM w turach użytkownika. Nadpisania per użytkownik:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: rozmiar fragmentu wychodzącego (znaki).channels.signal.chunkMode:length(domyślnie) 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.
Powiązane
- Przegląd kanałów — wszystkie obsługiwane kanały
- Parowanie — uwierzytelnianie DM i przepływ parowania
- Grupy — zachowanie czatu grupowego i ograniczenia wzmianek
- Routowanie kanałów — routowanie sesji dla wiadomości
- Bezpieczeństwo — model dostępu i utwardzanie