iMessage (legacy: imsg)
Рекомендуется: Для новых настроек iMessage используйте BlueBubbles.
Канал imsg является устаревшей интеграцией через внешний CLI и может быть удалён в будущих релизах.
Статус: устаревшая интеграция через внешний CLI. Gateway (шлюз) запускает imsg rpc (JSON-RPC через stdio).
Быстрая настройка (для начинающих)
- Убедитесь, что Messages выполнен вход на этом Mac.
- Установите
imsg:brew install steipete/tap/imsg
- Настройте OpenClaw с помощью
channels.imessage.cliPathиchannels.imessage.dbPath. - Запустите шлюз и подтвердите все запросы macOS (Automation + Full Disk Access).
Что это такое
- Канал iMessage, работающий на основе
imsgв macOS. - Детерминированная маршрутизация: ответы всегда возвращаются в iMessage.
- Личные сообщения используют основной сеанс агента; группы изолированы (
agent:<agentId>:imessage:group:<chat_id>). - Если поток с несколькими участниками приходит с
is_group=false, вы всё равно можете изолировать его, настроивchat_idс помощьюchannels.imessage.groups(см. «Псевдогрупповые потоки» ниже).
Запись конфига
По умолчанию iMessage разрешено записывать обновления конфига, инициированные/config set|unset (требуется commands.config: true).
Отключение:
Требования
- macOS с выполненным входом в Messages.
- Full Disk Access для OpenClaw +
imsg(доступ к БД Messages). - Разрешение Automation при отправке.
channels.imessage.cliPathможет указывать на любую команду, проксирующую stdin/stdout (например, скрипт-обёртку, который подключается по SSH к другому Mac и запускаетimsg rpc).
Устранение неполадок macOS Privacy and Security TCC
Если отправка/приём не работают (например,imsg rpc завершается с ненулевым кодом, истекает по тайм-ауту или шлюз выглядит «зависшим»), частой причиной является неподтверждённый запрос разрешений macOS.
macOS выдаёт разрешения TCC для каждого контекста приложения/процесса. Подтвердите запросы в том же контексте, где запускается imsg (например, Terminal/iTerm, сессия LaunchAgent или процесс, запущенный по SSH).
Checklist:
- Full Disk Access: разрешите доступ процессу, запускающему OpenClaw (и любой shell/SSH-обёртке, которая выполняет
imsg). Это требуется для чтения базы данных Messages (chat.db). - Automation → Messages: разрешите процессу, запускающему OpenClaw (и/или вашему терминалу), управлять Messages.app для исходящей отправки.
- Состояние CLI
imsg: убедитесь, чтоimsgустановлен и поддерживает RPC (imsg rpc --help).
Настройка (быстрый путь)
- Убедитесь, что Messages выполнен вход на этом Mac.
- Настройте iMessage и запустите шлюз.
Выделенный пользователь macOS для бота (для изолированной идентичности)
Если вы хотите, чтобы бот отправлял сообщения от отдельной учётной записи iMessage (и не засорял ваши личные Messages), используйте отдельный Apple ID и отдельного пользователя macOS.- Создайте отдельный Apple ID (пример:
[email protected]).- Apple может потребовать номер телефона для верификации / 2FA.
- Создайте пользователя macOS (пример:
openclawhome) и войдите под ним. - Откройте Messages под этим пользователем macOS и войдите в iMessage, используя Apple ID бота.
- Включите Remote Login (System Settings → General → Sharing → Remote Login).
- Установите
imsg:brew install steipete/tap/imsg
- Настройте SSH так, чтобы
ssh <bot-macos-user>@localhost trueработал без пароля. - Укажите
channels.imessage.accounts.bot.cliPathна SSH-обёртку, которая запускаетimsgот имени пользователя бота.
imsg rpc выглядит зависшим или завершается, войдите под этим пользователем (помогает Screen Sharing), выполните одноразово imsg chats --limit 1 / imsg send ..., подтвердите запросы и повторите попытку. См. См. Устранение неполадок macOS Privacy and Security TCC.
Пример обёртки (chmod +x). Замените <bot-macos-user> на фактическое имя пользователя macOS:
channels.imessage.cliPath, channels.imessage.dbPath) вместо карты accounts.
Удалённый/SSH-вариант (необязательно)
Если iMessage нужен на другом Mac, установитеchannels.imessage.cliPath на обёртку, которая запускает imsg на удалённом хосте macOS по SSH. OpenClaw требуется только stdio.
Пример обёртки:
cliPath указывает на удалённый хост через SSH, пути вложений в базе данных Messages ссылаются на файлы на удалённой машине. OpenClaw может автоматически получать их по SCP, установив channels.imessage.remoteHost:
remoteHost не задан, OpenClaw пытается определить его автоматически, разбирая SSH-команду в вашем скрипте-обёртке. Для надёжности рекомендуется явная конфигурация.
Удалённый Mac через Tailscale (пример)
Если Gateway (шлюз) работает на Linux-хосте/ВМ, а iMessage должен работать на Mac, Tailscale — самый простой мост: шлюз общается с Mac по tailnet, запускаетimsg по SSH и копирует вложения обратно по SCP.
Архитектура:
Конкретный пример конфига (hostname Tailscale):
~/.openclaw/scripts/imsg-ssh):
- Убедитесь, что Mac выполнен вход в Messages и включён Remote Login.
- Используйте SSH-ключи, чтобы
ssh [email protected]работал без запросов. remoteHostдолжен совпадать с SSH-целью, чтобы SCP мог получать вложения.
channels.imessage.accounts с конфигурацией для каждого аккаунта и необязательным name. gateway/configuration для общего шаблона. Не коммитьте ~/.openclaw/openclaw.json (часто содержит токены).
Контроль доступа (личные сообщения + группы)
DMs:- По умолчанию:
channels.imessage.dmPolicy = "pairing". - Неизвестные отправители получают код сопряжения; сообщения игнорируются до подтверждения (коды истекают через 1 час).
- Подтверждение через:
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>
- Сопряжение — стандартный обмен токенами для личных сообщений iMessage. Подробности: Pairing
channels.imessage.groupPolicy = open | allowlist | disabled.channels.imessage.groupAllowFromуправляет тем, кто может триггерить в группах, когда установленallowlist.- Ограничение по упоминаниям использует
agents.list[].groupChat.mentionPatterns(илиmessages.groupChat.mentionPatterns), поскольку iMessage не имеет нативных метаданных упоминаний. - Переопределение для нескольких агентов: задайте шаблоны для каждого агента в
agents.list[].groupChat.mentionPatterns.
Как это работает (поведение)
imsgпотоково передаёт события сообщений; шлюз нормализует их в общий конверт канала.- Ответы всегда маршрутизируются обратно в тот же идентификатор чата или handle.
Псевдогрупповые потоки (is_group=false)
Некоторые потоки iMessage могут иметь несколько участников, но при этом приходить с is_group=false в зависимости от того, как Messages хранит идентификатор чата.
Если вы явно настроите chat_id в разделе channels.imessage.groups, OpenClaw будет обрабатывать этот поток как «группу» для:
- изоляции сеансов (отдельный ключ сеанса
agent:<agentId>:imessage:group:<chat_id>) - поведения allowlist для групп / ограничения по упоминаниям
Медиа + ограничения
- Необязательная загрузка вложений в контекст через
channels.imessage.includeAttachments. - Лимит медиа через
channels.imessage.mediaMaxMb.
Ограничения
- Исходящий текст разбивается на чанки по
channels.imessage.textChunkLimit(по умолчанию 4000). - Необязательная разбивка по новым строкам: установите
channels.imessage.chunkMode="newline", чтобы делить по пустым строкам (границы абзацев) перед разбивкой по длине. - Загрузка медиа ограничена параметром
channels.imessage.mediaMaxMb(по умолчанию 16).
Адресация / цели доставки
Для стабильной маршрутизации предпочтительно использоватьchat_id:
chat_id:123(предпочтительно)chat_guid:...chat_identifier:...- прямые handle:
imessage:+1555/sms:+1555/[email protected]
Справочник конфигурации (iMessage)
Полная конфигурация: Конфигурация Параметры провайдера:channels.imessage.enabled: включить/отключить запуск канала.channels.imessage.cliPath: путь кimsg.channels.imessage.dbPath: путь к базе данных Messages.channels.imessage.remoteHost: SSH-хост для передачи вложений по SCP, когдаcliPathуказывает на удалённый Mac (например,user@gateway-host). Автоопределяется из SSH-обёртки, если не задан.channels.imessage.service:imessage | sms | auto.channels.imessage.region: регион SMS.channels.imessage.dmPolicy:pairing | allowlist | open | disabled(по умолчанию: сопряжение).channels.imessage.allowFrom: allowlist для личных сообщений (handle, email, номера E.164 илиchat_id:*).openтребует"*". В iMessage нет имён пользователей; используйте handle или цели чатов.channels.imessage.groupPolicy:open | allowlist | disabled(по умолчанию: allowlist).channels.imessage.groupAllowFrom: allowlist отправителей для групп.channels.imessage.historyLimit/channels.imessage.accounts.*.historyLimit: максимальное число сообщений группы, включаемых в контекст (0 отключает).channels.imessage.dmHistoryLimit: лимит истории личных сообщений в пользовательских ходах. Переопределения для пользователей:channels.imessage.dms["<handle>"].historyLimit.channels.imessage.groups: значения по умолчанию для каждой группы + allowlist (используйте"*"для глобальных значений по умолчанию).channels.imessage.includeAttachments: загружать вложения в контекст.channels.imessage.mediaMaxMb: лимит медиа для входящих/исходящих (МБ).channels.imessage.textChunkLimit: размер исходящих чанков (символы).channels.imessage.chunkMode:length(по умолчанию) илиnewlineдля разбивки по пустым строкам (границы абзацев) перед разбивкой по длине.
agents.list[].groupChat.mentionPatterns(илиmessages.groupChat.mentionPatterns).messages.responsePrefix.