Mainstream messaging
Signal
Status: integrasi CLI eksternal. Gateway berkomunikasi dengan signal-cli melalui HTTP JSON-RPC + SSE.
Prasyarat
- OpenClaw terinstal di server Anda (alur Linux di bawah ini diuji pada Ubuntu 24).
signal-clitersedia di host tempat gateway berjalan.- Nomor telepon yang dapat menerima satu SMS verifikasi (untuk jalur pendaftaran SMS).
- Akses browser untuk captcha Signal (
signalcaptchas.org) selama pendaftaran.
Penyiapan cepat (pemula)
- Gunakan nomor Signal terpisah untuk bot (disarankan).
- Instal
signal-cli(Java diperlukan jika Anda menggunakan build JVM). - Pilih satu jalur penyiapan:
- Jalur A (tautan QR):
signal-cli link -n "OpenClaw"dan pindai dengan Signal. - Jalur B (daftar SMS): daftarkan nomor khusus dengan captcha + verifikasi SMS.
- Jalur A (tautan QR):
- Konfigurasikan OpenClaw dan mulai ulang gateway.
- Kirim DM pertama dan setujui pairing (
openclaw pairing approve signal <CODE>).
Konfigurasi minimal:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"],
},
},
}
Referensi bidang:
| Bidang | Deskripsi |
|---|---|
account |
Nomor telepon bot dalam format E.164 (+15551234567) |
cliPath |
Jalur ke signal-cli (signal-cli jika ada di PATH) |
dmPolicy |
Kebijakan akses DM (pairing disarankan) |
allowFrom |
Nomor telepon atau nilai uuid:<id> yang diizinkan untuk DM |
Apa ini
- Kanal Signal melalui
signal-cli(bukan libsignal tertanam). - Perutean deterministik: balasan selalu kembali ke Signal.
- DM berbagi sesi utama agen; grup diisolasi (
agent:<agentId>:signal:group:<groupId>).
Penulisan konfigurasi
Secara default, Signal diizinkan menulis pembaruan konfigurasi yang dipicu oleh /config set|unset (memerlukan commands.config: true).
Nonaktifkan dengan:
{
channels: { signal: { configWrites: false } },
}
Model nomor (penting)
- Gateway terhubung ke perangkat Signal (akun
signal-cli). - Jika Anda menjalankan bot di akun Signal pribadi Anda, bot akan mengabaikan pesan Anda sendiri (perlindungan loop).
- Untuk "saya mengirim pesan ke bot dan bot membalas," gunakan nomor bot terpisah.
Jalur penyiapan A: tautkan akun Signal yang ada (QR)
- Instal
signal-cli(build JVM atau native). - Tautkan akun bot:
signal-cli link -n "OpenClaw"lalu pindai QR di Signal.
- Konfigurasikan Signal dan mulai gateway.
Contoh:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"],
},
},
}
Dukungan multi-akun: gunakan channels.signal.accounts dengan konfigurasi per akun dan name opsional. Lihat gateway/configuration untuk pola bersama.
Jalur penyiapan B: daftarkan nomor bot khusus (SMS, Linux)
Gunakan ini saat Anda menginginkan nomor bot khusus alih-alih menautkan akun aplikasi Signal yang sudah ada.
- Dapatkan nomor yang dapat menerima SMS (atau verifikasi suara untuk telepon rumah).
- Gunakan nomor bot khusus untuk menghindari konflik akun/sesi.
- Instal
signal-clidi host 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
Jika Anda menggunakan build JVM (signal-cli-${VERSION}.tar.gz), instal JRE 25+ terlebih dahulu.
Tetap perbarui signal-cli; upstream mencatat bahwa rilis lama dapat rusak ketika API server Signal berubah.
- Daftarkan dan verifikasi nomor:
signal-cli -a +<BOT_PHONE_NUMBER> register
Jika captcha diperlukan:
- Buka
https://signalcaptchas.org/registration/generate.html. - Selesaikan captcha, salin target tautan
signalcaptcha://...dari "Open Signal". - Jalankan dari IP eksternal yang sama dengan sesi browser bila memungkinkan.
- Jalankan pendaftaran lagi segera (token captcha cepat kedaluwarsa):
signal-cli -a +<BOT_PHONE_NUMBER> register --captcha '<SIGNALCAPTCHA_URL>'
signal-cli -a +<BOT_PHONE_NUMBER> verify <VERIFICATION_CODE>
- Konfigurasikan OpenClaw, mulai ulang gateway, verifikasi kanal:
# If you run the gateway as a user systemd service:
systemctl --user restart openclaw-gateway.service
# Then verify:
openclaw doctor
openclaw channels status --probe
- Pair pengirim DM Anda:
- Kirim pesan apa pun ke nomor bot.
- Setujui kode di server:
openclaw pairing approve signal <PAIRING_CODE>. - Simpan nomor bot sebagai kontak di ponsel Anda untuk menghindari "Unknown contact".
Referensi upstream:
- README
signal-cli:https://github.com/AsamK/signal-cli - Alur captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Alur penautan:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Mode daemon eksternal (httpUrl)
Jika Anda ingin mengelola signal-cli sendiri (cold start JVM yang lambat, init kontainer, atau CPU bersama), jalankan daemon secara terpisah dan arahkan OpenClaw ke sana:
{
channels: {
signal: {
httpUrl: "http://127.0.0.1:8080",
autoStart: false,
},
},
}
Ini melewati auto-spawn dan waktu tunggu startup di dalam OpenClaw. Untuk startup lambat saat auto-spawn, atur channels.signal.startupTimeoutMs.
Kontrol akses (DM + grup)
DM:
- Default:
channels.signal.dmPolicy = "pairing". - Pengirim tidak dikenal menerima kode pairing; pesan diabaikan sampai disetujui (kode kedaluwarsa setelah 1 jam).
- Setujui melalui:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Pairing adalah pertukaran token default untuk DM Signal. Detail: Pairing
- Pengirim khusus UUID (dari
sourceUuid) disimpan sebagaiuuid:<id>dichannels.signal.allowFrom.
Grup:
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFrommengontrol grup atau pengirim mana yang dapat memicu balasan grup saatallowlistdiatur; entri dapat berupa ID grup Signal (mentah,group:<id>, atausignal:group:<id>), nomor telepon pengirim, nilaiuuid:<id>, atau*.channels.signal.groups["<group-id>" | "*"]dapat mengganti perilaku grup denganrequireMention,tools, dantoolsBySender.- Gunakan
channels.signal.accounts.<id>.groupsuntuk override per akun dalam penyiapan multi-akun. - Memasukkan grup Signal ke allowlist melalui
groupAllowFromtidak menonaktifkan gating mention dengan sendirinya. Entrichannels.signal.groups["<group-id>"]yang dikonfigurasi secara spesifik memproses setiap pesan grup kecualirequireMention=truediatur. - Catatan runtime: jika
channels.signalsepenuhnya tidak ada, runtime kembali kegroupPolicy="allowlist"untuk pemeriksaan grup (meskipunchannels.defaults.groupPolicydiatur).
Cara kerjanya (perilaku)
signal-cliberjalan sebagai daemon; gateway membaca peristiwa melalui SSE.- Pesan masuk dinormalisasi ke dalam envelope kanal bersama.
- Balasan selalu dirutekan kembali ke nomor atau grup yang sama.
Media + batas
- Teks keluar dipecah menjadi potongan sesuai
channels.signal.textChunkLimit(default 4000). - Pemotongan baris baru opsional: atur
channels.signal.chunkMode="newline"untuk memecah pada baris kosong (batas paragraf) sebelum pemotongan panjang. - Lampiran didukung (base64 diambil dari
signal-cli). - Lampiran catatan suara menggunakan nama file
signal-clisebagai fallback MIME saatcontentTypetidak ada, sehingga transkripsi audio tetap dapat mengklasifikasikan memo suara AAC. - Batas media default:
channels.signal.mediaMaxMb(default 8). - Gunakan
channels.signal.ignoreAttachmentsuntuk melewati pengunduhan media. - Konteks riwayat grup menggunakan
channels.signal.historyLimit(atauchannels.signal.accounts.*.historyLimit), fallback kemessages.groupChat.historyLimit. Atur0untuk menonaktifkan (default 50).
Mengetik + tanda terima baca
- Indikator mengetik: OpenClaw mengirim sinyal mengetik melalui
signal-cli sendTypingdan menyegarkannya saat balasan sedang berjalan. - Tanda terima baca: saat
channels.signal.sendReadReceiptsbernilai true, OpenClaw meneruskan tanda terima baca untuk DM yang diizinkan. - Signal-cli tidak mengekspos tanda terima baca untuk grup.
Reaksi (alat pesan)
- Gunakan
message action=reactdenganchannel=signal. - Target: E.164 pengirim atau UUID (gunakan
uuid:<id>dari output pairing; UUID polos juga berfungsi). messageIdadalah timestamp Signal untuk pesan yang Anda beri reaksi.- Reaksi grup memerlukan
targetAuthoratautargetAuthorUuid.
Contoh:
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=✅
Konfigurasi:
channels.signal.actions.reactions: aktifkan/nonaktifkan tindakan reaksi (default true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackmenonaktifkan reaksi agen (alat pesanreactakan error).minimal/extensivemengaktifkan reaksi agen dan mengatur tingkat panduan.
- Override per akun:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Target pengiriman (CLI/cron)
- DM:
signal:+15551234567(atau E.164 polos). - DM UUID:
uuid:<id>(atau UUID polos). - Grup:
signal:group:<groupId>. - Nama pengguna:
username:<name>(jika didukung oleh akun Signal Anda).
Pemecahan masalah
Jalankan urutan ini terlebih dahulu:
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
Lalu konfirmasi status pairing DM jika diperlukan:
openclaw pairing list signal
Kegagalan umum:
- Daemon dapat dijangkau tetapi tidak ada balasan: verifikasi pengaturan akun/daemon (
httpUrl,account) dan mode terima. - DM diabaikan: pengirim sedang menunggu persetujuan pairing.
- Pesan grup diabaikan: gating pengirim/mention grup memblokir pengiriman.
- Error validasi konfigurasi setelah edit: jalankan
openclaw doctor --fix. - Signal hilang dari diagnostik: konfirmasi
channels.signal.enabled: true.
Pemeriksaan tambahan:
openclaw pairing list signal
pgrep -af signal-cli
grep -i "signal" "/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log" | tail -20
Untuk alur triase: /channels/troubleshooting.
Catatan keamanan
signal-climenyimpan kunci akun secara lokal (biasanya~/.local/share/signal-cli/data/).- Cadangkan status akun Signal sebelum migrasi atau rebuild server.
- Pertahankan
channels.signal.dmPolicy: "pairing"kecuali Anda secara eksplisit menginginkan akses DM yang lebih luas. - Verifikasi SMS hanya diperlukan untuk alur pendaftaran atau pemulihan, tetapi kehilangan kontrol atas nomor/akun dapat mempersulit pendaftaran ulang.
Referensi konfigurasi (Signal)
Konfigurasi lengkap: Konfigurasi
Opsi penyedia:
channels.signal.enabled: aktifkan/nonaktifkan startup channel.channels.signal.account: E.164 untuk akun bot.channels.signal.cliPath: jalur kesignal-cli.channels.signal.httpUrl: URL daemon lengkap (menimpa host/port).channels.signal.httpHost,channels.signal.httpPort: bind daemon (default 127.0.0.1:8080).channels.signal.autoStart: spawn daemon otomatis (default true jikahttpUrltidak disetel).channels.signal.startupTimeoutMs: batas waktu tunggu startup dalam ms (batas 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: lewati pengunduhan lampiran.channels.signal.ignoreStories: abaikan cerita dari daemon.channels.signal.sendReadReceipts: teruskan tanda terima baca.channels.signal.dmPolicy:pairing | allowlist | open | disabled(default: pairing).channels.signal.allowFrom: daftar izin DM (E.164 atauuuid:<id>).openmemerlukan"*". Signal tidak memiliki nama pengguna; gunakan ID telepon/UUID.channels.signal.groupPolicy:open | allowlist | disabled(default: allowlist).channels.signal.groupAllowFrom: daftar izin grup; menerima ID grup Signal (mentah,group:<id>, atausignal:group:<id>), nomor E.164 pengirim, atau nilaiuuid:<id>.channels.signal.groups: override per grup dengan kunci ID grup Signal (atau"*"). Kolom yang didukung:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: versi per akun darichannels.signal.groupsuntuk setup multi-akun.channels.signal.historyLimit: jumlah maksimum pesan grup yang disertakan sebagai konteks (0 menonaktifkan).channels.signal.dmHistoryLimit: batas riwayat DM dalam giliran pengguna. Override per pengguna:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: ukuran chunk keluar (karakter).channels.signal.chunkMode:length(default) ataunewlineuntuk memisahkan pada baris kosong (batas paragraf) sebelum chunking berdasarkan panjang.channels.signal.mediaMaxMb: batas media masuk/keluar (MB).
Opsi global terkait:
agents.list[].groupChat.mentionPatterns(Signal tidak mendukung mention bawaan).messages.groupChat.mentionPatterns(fallback global).messages.responsePrefix.
Terkait
- Ringkasan Channel — semua channel yang didukung
- Pairing — autentikasi DM dan alur pairing
- Grup — perilaku obrolan grup dan gating mention
- Routing Channel — routing sesi untuk pesan
- Keamanan — model akses dan hardening