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). - Выберите один из вариантов настройки:
signal-cli link -n "OpenClaw"- Путь B (регистрация через SMS): зарегистрируйте выделенный номер с captcha + проверкой по SMS.
- Настройте OpenClaw и запустите шлюз.
- Отправьте первое личное сообщение и подтвердите сопряжение (
openclaw pairing approve signal <CODE>).
| Поле | Описание |
|---|---|
account | Номер телефона бота в формате E.164 (+15551234567) |
| Настройка (быстрый путь) | Набирать и читать квитанции |
dmPolicy | Политика доступа к личным сообщениям (рекомендуется pairing) |
allowFrom | Номера телефонов или значения uuid:<id>, которым разрешено отправлять личные сообщения |
Что это такое
- Канал Signal через
signal-cli(не встроенная libsignal). - Детерминированная маршрутизация: ответы всегда возвращаются в Signal.
- Личные сообщения используют основной сеанс агента; группы изолированы (
agent:<agentId>:signal:group:<groupId>).
Запись конфига
По умолчанию Signal разрешено записывать обновления конфига, инициированные/config set|unset (требуется commands.config: true).
Отключение:
Модель номеров (важно)
- Шлюз подключается к устройству Signal (аккаунт
signal-cli). - Если вы запускаете бота на вашем личном аккаунте Signal, он будет игнорировать ваши собственные сообщения (защита от зацикливания).
- Для сценария «я пишу боту, и он отвечает» используйте отдельный номер бота.
Путь настройки A: привязать существующую учётную запись Signal (QR)
- Установите
signal-cli(требуется Java). - Свяжите аккаунт бота:
signal-cli link -n "OpenClaw", затем отсканируйте QR-код в Signal.
- Настройте Signal и запустите шлюз.
channels.signal.accounts с конфигурацией для каждого аккаунта и необязательным name. gateway/configuration для общего шаблона.
Путь настройки B: зарегистрировать отдельный номер бота (SMS, Linux)
Используйте этот вариант, если вам нужен отдельный номер для бота вместо привязки существующей учётной записи приложения Signal.- Получите номер, который может принимать SMS (или голосовую проверку для стационарных телефонов).
- Используйте отдельный номер бота, чтобы избежать конфликтов учётной записи/сессии.
- Установите
signal-cliна хосте gateway:
signal-cli-${VERSION}.tar.gz), сначала установите JRE 25+.
Поддерживайте signal-cli в актуальном состоянии; в upstream отмечают, что старые версии могут перестать работать при изменении API серверов Signal.
- Зарегистрируйте и подтвердите номер:
- Откройте
https://signalcaptchas.org/registration/generate.html. - Пройдите captcha, скопируйте целевую ссылку
signalcaptcha://...из «Open Signal». - По возможности выполняйте команду с того же внешнего IP-адреса, что и в сессии браузера.
- Сразу же снова запустите регистрацию (токены captcha быстро истекают):
- Настройте OpenClaw, перезапустите gateway, проверьте канал:
- Выполните привязку отправителя личных сообщений:
- Отправьте любое сообщение на номер бота.
- Подтвердите код на сервере:
openclaw pairing approve signal <PAIRING_CODE>. - Сохраните номер бота как контакт в телефоне, чтобы избежать отображения «Unknown contact».
signal-cli может деавторизовать основную сессию приложения Signal для этого номера. Предпочтительно использовать отдельный номер бота или режим привязки по QR, если нужно сохранить текущую настройку приложения на телефоне.
Ссылки на upstream:
signal-cliREADME: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.
Контроль доступа (личные сообщения + группы)
DMs:- По умолчанию:
channels.signal.dmPolicy = "pairing". - Неизвестные отправители получают код сопряжения; сообщения игнорируются до одобрения (коды истекают через 1 час).
- Одобрение через:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Сопряжение — обмен токенами по умолчанию для личных сообщений Signal. Подробности: Pairing
- Отправители только с UUID (из
sourceUuid) сохраняются какuuid:<id>вchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromуправляет тем, кто может инициировать сообщения в группах, когда установленallowlist.
Как это работает (поведение)
signal-cliработает как демон; шлюз читает события через SSE.- Входящие сообщения нормализуются в общий конверт канала.
- Ответы всегда маршрутизируются обратно на тот же номер или в ту же группу.
Медиа и ограничения
- Исходящий текст разбивается на части по
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 action=reactсchannel=signal. - Цели: отправитель E.164 или UUID (используйте
uuid:<id>из вывода сопряжения; «голый» UUID тоже подходит). messageId— это временная метка Signal для сообщения, на которое вы реагируете.- Реакции в группах требуют
targetAuthorилиtargetAuthorUuid.
channels.signal.actions.reactions: включить/выключить действия реакций (по умолчанию true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackотключает реакции агента (инструмент сообщенийreactвыдаст ошибку).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) и режим приёма. - Личные сообщения игнорируются: отправитель ожидает одобрения сопряжения.
- Сообщения в группах игнорируются: доставка блокируется правилами для отправителей/упоминаний в группах.
- Ошибки проверки конфигурации после изменений: выполните
openclaw doctor --fix. - Signal отсутствует в диагностике: убедитесь, что
channels.signal.enabled: true.
Примечания по безопасности
signal-cliхранит ключи учётной записи локально (обычно~/.local/share/signal-cli/data/).- Сделайте резервную копию состояния аккаунта Signal перед миграцией или пересборкой сервера.
- Свяжите устройство бота и запустите демон:
- SMS-подтверждение требуется только для регистрации или восстановления, однако потеря контроля над номером/аккаунтом может усложнить повторную регистрацию.
Справочник конфигурации (Signal)
Полная конфигурация: Configuration Параметры провайдера:channels.signal.enabled: включить/выключить запуск канала.channels.signal.account: E.164 для аккаунта бота.channels.signal.cliPath: путь кsignal-cli.channels.signal.httpUrl: полный URL демона (переопределяет хост/порт).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: игнорировать истории от демона.channels.signal.sendReadReceipts: пересылать уведомления о прочтении.channels.signal.dmPolicy:pairing | allowlist | open | disabled(по умолчанию: сопряжение).channels.signal.allowFrom: список разрешённых для личных сообщений (E.164 илиuuid:<id>).openтребует"*". В Signal нет имён пользователей; используйте идентификаторы телефона/UUID.channels.signal.groupPolicy:open | allowlist | disabled(по умолчанию: список разрешённых).channels.signal.groupAllowFrom: список разрешённых отправителей для групп.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.