Signal (signal-cli)
Status: integracja z zewnetrznym CLI. Gateway komunikuje sie z signal-cli przez HTTP JSON-RPC + SSE.
Wymagania wstepne
- OpenClaw zainstalowany na serwerze (przeplyw Linux ponizej przetestowany na Ubuntu 24).
signal-clidostepny na hoscie, na ktorym dziala gateway.- Numer telefonu zdolny do odebrania jednego SMS weryfikacyjnego (dla sciezki rejestracji SMS).
- Dostep do przegladarki dla captcha Signal (
signalcaptchas.org) podczas rejestracji.
Szybka konfiguracja (dla poczatkujacych)
- Uzyj oddzielnego numeru Signal dla bota (zalecane).
- Zainstaluj
signal-cli(Java wymagana jesli uzywasz buildu JVM). - Wybierz jedna sciezke konfiguracji:
- Sciezka A (link QR):
signal-cli link -n "OpenClaw"i zeskanuj w Signal. - Sciezka B (rejestracja SMS): zarejestruj dedykowany numer z captcha + weryfikacja SMS.
- Sciezka A (link QR):
- Skonfiguruj OpenClaw i zrestartuj gateway.
- Wyslij pierwszy DM i zatwierdz parowanie (
openclaw pairing approve signal <CODE>).
Minimalna konfiguracja:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"],
},
},
}
Referencja pol:
| Pole | Opis |
|---|---|
account | Numer telefonu bota w formacie E.164 (+15551234567) |
cliPath | Sciezka do signal-cli (signal-cli jesli w PATH) |
dmPolicy | Polityka dostepu DM (pairing zalecana) |
allowFrom | Numery telefonow lub wartosci uuid:<id> dozwolone do DM |
Czym jest
- Kanal Signal przez
signal-cli(nie wbudowany libsignal). - Deterministyczny routing: odpowiedzi zawsze wracaja do Signal.
- DM wspoldziela glowna sesje agenta; grupy sa izolowane (
agent:<agentId>:signal:group:<groupId>).
Zapisy konfiguracji
Domyslnie Signal pozwala na zapisy aktualizacji konfiguracji wyzwalane przez /config set|unset (wymaga commands.config: true).
Wylacz:
{
channels: { signal: { configWrites: false } },
}
Model numeru (wazne)
- Gateway laczy sie z urzadzeniem Signal (kontem
signal-cli). - Jesli uruchomisz bota na osobistym koncie Signal, bedzie ignorowal twoje wlasne wiadomosci (ochrona przed petla).
- Aby “pisac do bota i otrzymywac odpowiedzi”, uzyj oddzielnego numeru bota.
Sciezka konfiguracji A: polacz istniejace konto Signal (QR)
- Zainstaluj
signal-cli(build JVM lub natywny). - Polacz konto bota:
signal-cli link -n "OpenClaw"nastepnie zeskanuj QR w Signal.
- Skonfiguruj Signal i uruchom gateway.
Przyklad:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"],
},
},
}
Obsluga wielu kont: uzyj channels.signal.accounts z konfiguracja per konto i opcjonalnym name. Zobacz gateway/configuration dla wspolnego wzorca.
Sciezka konfiguracji B: zarejestruj dedykowany numer bota (SMS, Linux)
Uzyj tego, gdy chcesz dedykowany numer bota zamiast laczenia istniejacego konta aplikacji Signal.
- Uzyskaj numer zdolny do odbioru SMS (lub weryfikacji glosowej dla stacjonarnych).
- Uzyj dedykowanego numeru bota, aby unikac konfliktow konta/sesji.
- Zainstaluj
signal-clina hoscie gateway:
VERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\/v//')
curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}-Linux-native.tar.gz"
sudo tar xf "signal-cli-${VERSION}-Linux-native.tar.gz" -C /opt
sudo ln -sf /opt/signal-cli /usr/local/bin/
signal-cli --version
Jesli uzywasz buildu JVM (signal-cli-${VERSION}.tar.gz), zainstaluj najpierw JRE 25+.
Utrzymuj signal-cli aktualnym; upstream zaznacza, ze stare wydania moga sie psuc gdy zmieniaja sie API serwera Signal.
- Zarejestruj i zweryfikuj numer:
signal-cli -a +<BOT_PHONE_NUMBER> register
Jesli wymagana jest captcha:
- Otworz
https://signalcaptchas.org/registration/generate.html. - Wykonaj captche, skopiuj link docelowy
signalcaptcha://...z “Open Signal”. - Uruchom z tego samego zewnetrznego IP co sesja przegladarki gdy to mozliwe.
- Uruchom rejestracje ponownie natychmiast (tokeny captcha szybko wygasaja):
signal-cli -a +<BOT_PHONE_NUMBER> register --captcha '<SIGNALCAPTCHA_URL>'
signal-cli -a +<BOT_PHONE_NUMBER> verify <VERIFICATION_CODE>
- Skonfiguruj OpenClaw, zrestartuj gateway, zweryfikuj kanal:
# Jesli uruchamiasz gateway jako usluge systemd uzytkownika:
systemctl --user restart openclaw-gateway
# Nastepnie zweryfikuj:
openclaw doctor
openclaw channels status --probe
- Sparuj nadawce DM:
- Wyslij dowolna wiadomosc na numer bota.
- Zatwierdz kod na serwerze:
openclaw pairing approve signal <PAIRING_CODE>. - Zapisz numer bota jako kontakt na telefonie, aby unikac “Nieznany kontakt”.
Wazne: rejestracja konta numerowego za pomoca signal-cli moze wylogowac glowna sesje aplikacji Signal dla tego numeru. Preferuj dedykowany numer bota lub uzyj trybu linkowania QR, jesli chcesz zachowac istniejaca konfiguracje aplikacji telefonicznej.
Referencje upstream:
- README
signal-cli:https://github.com/AsamK/signal-cli - Przeplyw captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Przeplyw linkowania:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Tryb zewnetrznego demona (httpUrl)
Jesli chcesz zarzadzac signal-cli samodzielnie (wolne starty JVM na zimno, inicjalizacja kontenera lub wspoldzielone CPU), uruchom demona oddzielnie i wskazz OpenClaw na niego:
{
channels: {
signal: {
httpUrl: "http://127.0.0.1:8080",
autoStart: false,
},
},
}
Pomija to automatyczne uruchamianie i oczekiwanie na start wewnatrz OpenClaw. Dla wolnych startow przy automatycznym uruchamianiu ustaw channels.signal.startupTimeoutMs.
Kontrola dostepu (DM + grupy)
DM:
- Domyslnie:
channels.signal.dmPolicy = "pairing". - Nieznani nadawcy otrzymuja kod parowania; wiadomosci sa ignorowane do momentu zatwierdzenia (kody wygasaja po 1 godzinie).
- Zatwierdzanie przez:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Parowanie to domyslna wymiana tokenow dla DM Signal. Szczegoly: Parowanie
- Nadawcy z samym UUID (z
sourceUuid) sa przechowywani jakouuid:<id>wchannels.signal.allowFrom.
Grupy:
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromkontroluje, kto moze wyzwalac w grupach gdyallowlistjest ustawione.channels.signal.groups["<group-id>" | "*"]moze nadpisac zachowanie grupy zrequireMention,toolsitoolsBySender.- Uzyj
channels.signal.accounts.<id>.groupsdla nadpisan per konto w konfiguracjach wielokontowych. - Uwaga runtime: jesli
channels.signalcalkowicie brakuje, runtime stosuje zastepczymgroupPolicy="allowlist"dla sprawdzen grupowych (nawet jeslichannels.defaults.groupPolicyjest ustawione).
Jak dziala (zachowanie)
signal-clidziala jako demon; gateway odczytuje zdarzenia przez SSE.- Wiadomosci przychodzace sa normalizowane do wspolnej koperty kanalu.
- Odpowiedzi zawsze routuja z powrotem do tego samego numeru lub grupy.
Media + limity
- Tekst wychodzacy jest dzielony na kawalki do
channels.signal.textChunkLimit(domyslnie 4000). - Opcjonalne dzielenie po nowej linii: ustaw
channels.signal.chunkMode="newline"aby dzielic na pustych liniach (granice akapitow) przed dzieleniem wedlug dlugosci. - Zalaczniki obslugiwane (base64 pobierane z
signal-cli). - Domyslny limit mediow:
channels.signal.mediaMaxMb(domyslnie 8). - Uzyj
channels.signal.ignoreAttachmentsaby pominac pobieranie mediow. - Kontekst historii grupy uzywa
channels.signal.historyLimit(lubchannels.signal.accounts.*.historyLimit), stosujac zastepczymmessages.groupChat.historyLimit. Ustaw0aby wylaczyc (domyslnie 50).
Pisanie + potwierdzenia odczytu
- Wskazniki pisania: OpenClaw wysyla sygnaly pisania przez
signal-cli sendTypingi odswieza je podczas dzialania odpowiedzi. - Potwierdzenia odczytu: gdy
channels.signal.sendReadReceiptsjest true, OpenClaw przekazuje potwierdzenia odczytu dla dozwolonych DM. - Signal-cli nie udostepnia potwierdzen odczytu dla grup.
Reakcje (narzedzie wiadomosci)
- Uzyj
message action=reactzchannel=signal. - Cele: E.164 nadawcy lub UUID (uzyj
uuid:<id>z wyjscia parowania; sam UUID tez dziala). messageIdto znacznik czasu Signal dla wiadomosci, na ktora reagujesz.- Reakcje grupowe wymagaja
targetAuthorlubtargetAuthorUuid.
Przyklady:
message action=react channel=signal target=uuid:123e4567-e89b-12d3-a456-426614174000 messageId=1737630212345 emoji=🔥
message action=react channel=signal target=+15551234567 messageId=1737630212345 emoji=🔥 remove=true
message action=react channel=signal target=signal:group:<groupId> targetAuthor=uuid:<sender-uuid> messageId=1737630212345 emoji=✅
Konfiguracja:
channels.signal.actions.reactions: wlaczenie/wylaczenie akcji reakcji (domyslnie true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackwylacza reakcje agenta (narzedzie wiadomoscireactzwroci blad).minimal/extensivewlacza reakcje agenta i ustawia poziom wskazowek.
- Nadpisania per konto:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Cele dostarczania (CLI/cron)
- DM:
signal:+15551234567(lub zwykly E.164). - DM UUID:
uuid:<id>(lub sam UUID). - Grupy:
signal:group:<groupId>. - Nazwy uzytkownikow:
username:<name>(jesli obslugiwane przez twoje konto Signal).
Rozwiazywanie problemow
Najpierw uruchom te polecenia:
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
Nastepnie potwierdz stan parowania DM jesli potrzeba:
openclaw pairing list signal
Czeste bledy:
- Demon osiagalny, ale brak odpowiedzi: zweryfikuj ustawienia konta/demona (
httpUrl,account) i tryb odbioru. - DM ignorowane: nadawca oczekuje na zatwierdzenie parowania.
- Wiadomosci grupowe ignorowane: bramkowanie nadawcow/wzmianek grupy blokuje dostarczenie.
- Bledy walidacji konfiguracji po edycji: uruchom
openclaw doctor --fix. - Signal brakuje w diagnostyce: potwierdz
channels.signal.enabled: true.
Dodatkowe sprawdzenia:
openclaw pairing list signal
pgrep -af signal-cli
grep -i "signal" "/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log" | tail -20
Przeplyw diagnostyczny: /channels/troubleshooting.
Uwagi bezpieczenstwa
signal-cliprzechowuje klucze konta lokalnie (zwykle~/.local/share/signal-cli/data/).- Zrob kopie zapasowa stanu konta Signal przed migracja serwera lub przebudowa.
- Zachowaj
channels.signal.dmPolicy: "pairing", chyba ze jawnie chcesz szerszego dostepu DM. - Weryfikacja SMS jest potrzebna tylko dla przeplywow rejestracji lub odzyskiwania, ale utrata kontroli nad numerem/kontem moze skomplikowac ponowna rejestracje.
Referencja konfiguracji (Signal)
Pelna konfiguracja: Konfiguracja
Opcje dostawcy:
channels.signal.enabled: wlaczenie/wylaczenie startu kanalu.channels.signal.account: E.164 dla konta bota.channels.signal.cliPath: sciezka dosignal-cli.channels.signal.httpUrl: pelny URL demona (nadpisuje host/port).channels.signal.httpHost,channels.signal.httpPort: powiazanie demona (domyslnie 127.0.0.1:8080).channels.signal.autoStart: automatyczne uruchamianie demona (domyslnie true jeslihttpUrlnie ustawiony).channels.signal.startupTimeoutMs: timeout oczekiwania na start w ms (max 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: pominecie pobierania zalacznikow.channels.signal.ignoreStories: ignorowanie stories z demona.channels.signal.sendReadReceipts: przekazywanie potwierdzen odczytu.channels.signal.dmPolicy:pairing | allowlist | open | disabled(domyslnie: pairing).channels.signal.allowFrom: lista dozwolonych DM (E.164 lubuuid:<id>).openwymaga"*". Signal nie ma nazw uzytkownikow; uzyj ID telefonicznych/UUID.channels.signal.groupPolicy:open | allowlist | disabled(domyslnie: allowlist).channels.signal.groupAllowFrom: lista dozwolonych nadawcow grupowych.channels.signal.groups: nadpisania per grupe z kluczem ID grupy Signal (lub"*"). Obslugiwane pola:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: wersja per kontochannels.signal.groupsdla konfiguracji wielokontowych.channels.signal.historyLimit: max wiadomosci grupowych dolaczanych jako kontekst (0 wylacza).channels.signal.dmHistoryLimit: limit historii DM w turach uzytkownika. Nadpisania per uzytkownika:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: rozmiar kawalka wychodzacego (znaki).channels.signal.chunkMode:length(domyslnie) lubnewlineaby dzielic na pustych liniach (granice akapitow) przed dzieleniem wedlug dlugosci.channels.signal.mediaMaxMb: limit mediow przychodzacych/wychodzacych (MB).
Powiazane opcje globalne:
agents.list[].groupChat.mentionPatterns(Signal nie obsluguje natywnych wzmianek).messages.groupChat.mentionPatterns(globalny zastepczym).messages.responsePrefix.