Signal (signal-cli)
Стан: інтеграція із зовнішнім CLI. Gateway взаємодіє зsignal-cli через HTTP JSON-RPC + SSE.
Передумови
- OpenClaw установлено на вашому сервері (наведений нижче процес для Linux протестовано на Ubuntu 24).
signal-cliдоступний на хості, де працює gateway.- Номер телефону, який може отримати одне SMS із кодом підтвердження (для шляху реєстрації через SMS).
- Доступ до браузера для captcha Signal (
signalcaptchas.org) під час реєстрації.
Швидке налаштування (для початківців)
- Використовуйте окремий номер Signal для бота (рекомендовано).
- Установіть
signal-cli(потрібна Java, якщо ви використовуєте збірку JVM). - Виберіть один зі шляхів налаштування:
- Шлях A (QR-прив’язка):
signal-cli link -n "OpenClaw"і відскануйте QR у Signal. - Шлях B (реєстрація через SMS): зареєструйте окремий номер із captcha + підтвердженням через SMS.
- Шлях A (QR-прив’язка):
- Налаштуйте OpenClaw і перезапустіть gateway.
- Надішліть перше особисте повідомлення й схваліть pairing (
openclaw pairing approve signal <CODE>).
| Поле | Опис |
|---|---|
account | Номер телефону бота у форматі E.164 (+15551234567) |
cliPath | Шлях до signal-cli (signal-cli, якщо він у PATH) |
dmPolicy | Політика доступу до особистих повідомлень (pairing рекомендовано) |
allowFrom | Номери телефонів або значення uuid:<id>, яким дозволено надсилати особисті повідомлення |
Що це таке
- Канал Signal через
signal-cli(не вбудований libsignal). - Детермінована маршрутизація: відповіді завжди повертаються в Signal.
- Особисті повідомлення спільно використовують основну сесію агента; групи ізольовані (
agent:<agentId>:signal:group:<groupId>).
Запис у конфігурацію
За замовчуванням Signal може записувати оновлення конфігурації, ініційовані через/config set|unset (потрібно commands.config: true).
Вимкнення:
Модель номерів (важливо)
- Gateway підключається до пристрою Signal (обліковий запис
signal-cli). - Якщо ви запускаєте бота у своєму особистому обліковому записі Signal, він ігноруватиме ваші власні повідомлення (захист від циклів).
- Для сценарію «я пишу боту, і він відповідає» використовуйте окремий номер бота.
Шлях налаштування A: прив’язка наявного облікового запису Signal (QR)
- Установіть
signal-cli(JVM або нативна збірка). - Прив’яжіть обліковий запис бота:
signal-cli link -n "OpenClaw", потім відскануйте QR у Signal.
- Налаштуйте Signal і запустіть gateway.
channels.signal.accounts із конфігурацією для кожного облікового запису та необов’язковим name. Див. gateway/configuration для спільного шаблону.
Шлях налаштування B: реєстрація окремого номера бота (SMS, Linux)
Використовуйте цей шлях, якщо вам потрібен окремий номер бота замість прив’язки наявного облікового запису застосунку Signal.- Отримайте номер, який може приймати SMS (або голосове підтвердження для стаціонарних номерів).
- Використовуйте окремий номер бота, щоб уникнути конфліктів облікового запису/сесії.
- Установіть
signal-cliна хості gateway:
signal-cli-${VERSION}.tar.gz), спочатку встановіть JRE 25+.
Підтримуйте signal-cli в актуальному стані; у проєкті вказують, що старі релізи можуть перестати працювати зі змінами API серверів Signal.
- Зареєструйте й підтвердьте номер:
- Відкрийте
https://signalcaptchas.org/registration/generate.html. - Пройдіть captcha, скопіюйте ціль посилання
signalcaptcha://...з «Open Signal». - За можливості виконуйте це з тієї самої зовнішньої IP-адреси, що й сесія браузера.
- Негайно знову запустіть реєстрацію (токени captcha швидко спливають):
- Налаштуйте OpenClaw, перезапустіть gateway, перевірте канал:
- Виконайте pairing для відправника особистих повідомлень:
- Надішліть будь-яке повідомлення на номер бота.
- Схваліть код на сервері:
openclaw pairing approve signal <PAIRING_CODE>. - Збережіть номер бота як контакт у своєму телефоні, щоб уникнути «Unknown contact».
signal-cli може деавтентифікувати основну сесію застосунку Signal для цього номера. Віддавайте перевагу окремому номеру бота або використовуйте режим прив’язки через QR, якщо вам потрібно зберегти поточне налаштування застосунку на телефоні.
Посилання на джерела:
- README
signal-cli:https://github.com/AsamK/signal-cli - Процес captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Процес прив’язки:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Режим зовнішнього демона (httpUrl)
Якщо ви хочете самостійно керуватиsignal-cli (повільний холодний старт JVM, ініціалізація контейнера або спільні CPU), запустіть демон окремо й укажіть його OpenClaw:
channels.signal.startupTimeoutMs.
Контроль доступу (особисті повідомлення + групи)
Особисті повідомлення:- За замовчуванням:
channels.signal.dmPolicy = "pairing". - Невідомі відправники отримують код pairing; повідомлення ігноруються, доки їх не буде схвалено (коди спливають через 1 годину).
- Схвалення через:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Pairing — це типовий обмін токенами для особистих повідомлень Signal. Докладніше: Pairing
- Відправники лише з UUID (із
sourceUuid) зберігаються якuuid:<id>уchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromвизначає, хто може ініціювати дії в групах, якщо встановленоallowlist.channels.signal.groups["<group-id>" | "*"]може перевизначати поведінку групи черезrequireMention,toolsіtoolsBySender.- Використовуйте
channels.signal.accounts.<id>.groupsдля перевизначень для окремих облікових записів у конфігураціях із кількома обліковими записами. - Примітка щодо runtime: якщо
channels.signalповністю відсутній, runtime використовуєgroupPolicy="allowlist"для перевірок груп (навіть якщо встановленоchannels.defaults.groupPolicy).
Як це працює (поведінка)
signal-cliпрацює як демон; gateway читає події через SSE.- Вхідні повідомлення нормалізуються до спільного envelope каналу.
- Відповіді завжди маршрутизуються назад до того самого номера або групи.
Медіа та обмеження
- Вихідний текст розбивається на фрагменти відповідно до
channels.signal.textChunkLimit(за замовчуванням 4000). - Необов’язкове розбиття за новими рядками: установіть
channels.signal.chunkMode="newline", щоб розбивати за порожніми рядками (межами абзаців) перед поділом за довжиною. - Вкладення підтримуються (base64 отримується з
signal-cli). - Обмеження медіа за замовчуванням:
channels.signal.mediaMaxMb(за замовчуванням 8). - Використовуйте
channels.signal.ignoreAttachments, щоб пропускати завантаження медіа. - Контекст історії групи використовує
channels.signal.historyLimit(абоchannels.signal.accounts.*.historyLimit) з поверненням доmessages.groupChat.historyLimit. Установіть0, щоб вимкнути (за замовчуванням 50).
Індикатори набору та сповіщення про прочитання
- Індикатори набору: OpenClaw надсилає сигнали набору через
signal-cli sendTypingі оновлює їх, поки формується відповідь. - Сповіщення про прочитання: коли
channels.signal.sendReadReceiptsмає значення true, OpenClaw пересилає сповіщення про прочитання для дозволених особистих повідомлень. - Signal-cli не надає сповіщень про прочитання для груп.
Реакції (інструмент Message)
- Використовуйте
message action=reactзchannel=signal. - Цілі: E.164 відправника або UUID (використовуйте
uuid:<id>із виводу pairing; також працює й просто UUID). messageId— це timestamp Signal для повідомлення, на яке ви реагуєте.- Для реакцій у групах потрібен
targetAuthorабоtargetAuthorUuid.
channels.signal.actions.reactions: увімкнути/вимкнути дії реакцій (за замовчуванням true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackвимикає реакції агента (інструмент Messagereactвидасть помилку).minimal/extensiveвмикає реакції агента й задає рівень підказок.
- Перевизначення для окремих облікових записів:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Цілі доставки (CLI/cron)
- Особисті повідомлення:
signal:+15551234567(або просто E.164). - Особисті повідомлення за UUID:
uuid:<id>(або просто UUID). - Групи:
signal:group:<groupId>. - Імена користувачів:
username:<name>(якщо підтримується вашим обліковим записом Signal).
Усунення несправностей
Спочатку виконайте цей ланцюжок перевірок:- Демон доступний, але відповідей немає: перевірте налаштування облікового запису/демона (
httpUrl,account) і режим отримання. - Особисті повідомлення ігноруються: відправник очікує схвалення pairing.
- Групові повідомлення ігноруються: фільтрація відправника/згадки в групі блокує доставку.
- Помилки валідації конфігурації після змін: виконайте
openclaw doctor --fix. - Signal відсутній у діагностиці: перевірте
channels.signal.enabled: true.
Примітки щодо безпеки
signal-cliзберігає ключі облікового запису локально (зазвичай у~/.local/share/signal-cli/data/).- Створюйте резервну копію стану облікового запису Signal перед міграцією сервера або перевстановленням.
- Зберігайте
channels.signal.dmPolicy: "pairing", якщо ви явно не хочете ширший доступ до особистих повідомлень. - Підтвердження через SMS потрібне лише для реєстрації або відновлення, але втрата контролю над номером/обліковим записом може ускладнити повторну реєстрацію.
Довідник із конфігурації (Signal)
Повна конфігурація: Конфігурація Параметри провайдера:channels.signal.enabled: увімкнути/вимкнути запуск каналу.channels.signal.account: E.164 для облікового запису бота.channels.signal.cliPath: шлях доsignal-cli.channels.signal.httpUrl: повний URL демона (перевизначає host/port).channels.signal.httpHost,channels.signal.httpPort: прив’язка демона (за замовчуванням 127.0.0.1:8080).channels.signal.autoStart: автоматично запускати демон (за замовчуванням true, якщоhttpUrlне задано).channels.signal.startupTimeoutMs: тайм-аут очікування запуску в мс (максимум 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: пропускати завантаження вкладень.channels.signal.ignoreStories: ігнорувати stories від демона.channels.signal.sendReadReceipts: пересилати сповіщення про прочитання.channels.signal.dmPolicy:pairing | allowlist | open | disabled(за замовчуванням: pairing).channels.signal.allowFrom: allowlist особистих повідомлень (E.164 абоuuid:<id>). Дляopenпотрібне"*". Signal не має імен користувачів; використовуйте ID телефону/UUID.channels.signal.groupPolicy:open | allowlist | disabled(за замовчуванням: allowlist).channels.signal.groupAllowFrom: allowlist відправників у групах.channels.signal.groups: перевизначення для окремих груп за ID групи Signal (або"*"). Підтримувані поля:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: версіяchannels.signal.groupsдля окремих облікових записів у конфігураціях із кількома обліковими записами.channels.signal.historyLimit: максимальна кількість групових повідомлень, що включаються як контекст (0 вимикає).channels.signal.dmHistoryLimit: ліміт історії особистих повідомлень у ходах користувача. Перевизначення для окремих користувачів:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: розмір вихідного фрагмента (символи).channels.signal.chunkMode:length(за замовчуванням) абоnewline, щоб розбивати за порожніми рядками (межами абзаців) перед поділом за довжиною.channels.signal.mediaMaxMb: обмеження вхідних/вихідних медіа (МБ).
agents.list[].groupChat.mentionPatterns(Signal не підтримує нативні згадки).messages.groupChat.mentionPatterns(глобальний резервний варіант).messages.responsePrefix.
Пов’язане
- Огляд каналів — усі підтримувані канали
- Pairing — автентифікація особистих повідомлень і процес pairing
- Групи — поведінка групових чатів і вимога згадки
- Маршрутизація каналів — маршрутизація сесій для повідомлень
- Безпека — модель доступу та посилення захисту