Перейти к основному содержанию

iMessage (legacy: imsg)

Рекомендуется: Для новых настроек iMessage используйте BlueBubbles. Канал imsg является устаревшей интеграцией через внешний CLI и может быть удалён в будущих релизах.
Статус: устаревшая интеграция через внешний CLI. Gateway (шлюз) запускает imsg rpc (JSON-RPC через stdio).

Быстрая настройка (для начинающих)

  1. Убедитесь, что Messages выполнен вход на этом Mac.
  2. Установите imsg:
    • brew install steipete/tap/imsg
  3. Настройте OpenClaw с помощью channels.imessage.cliPath и channels.imessage.dbPath.
  4. Запустите шлюз и подтвердите все запросы macOS (Automation + Full Disk Access).
Минимальный конфиг:
{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "/usr/local/bin/imsg",
      dbPath: "/Users/<you>/Library/Messages/chat.db",
    },
  },
}

Что это такое

  • Канал 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). Отключение:
{
  channels: { imessage: { configWrites: false } },
}

Требования

  • 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).
Совет: если OpenClaw работает без GUI (LaunchAgent/systemd/SSH), запрос macOS легко пропустить. Выполните одноразовую интерактивную команду в GUI-терминале, чтобы принудительно показать запрос, затем повторите попытку:
imsg chats --limit 1
# or
imsg send <handle> "test"
Связанные разрешения папок macOS (Desktop/Documents/Downloads): /platforms/mac/permissions.

Настройка (быстрый путь)

  1. Убедитесь, что Messages выполнен вход на этом Mac.
  2. Настройте iMessage и запустите шлюз.

Выделенный пользователь macOS для бота (для изолированной идентичности)

Если вы хотите, чтобы бот отправлял сообщения от отдельной учётной записи iMessage (и не засорял ваши личные Messages), используйте отдельный Apple ID и отдельного пользователя macOS.
  1. Создайте отдельный Apple ID (пример: [email protected]).
    • Apple может потребовать номер телефона для верификации / 2FA.
  2. Создайте пользователя macOS (пример: openclawhome) и войдите под ним.
  3. Откройте Messages под этим пользователем macOS и войдите в iMessage, используя Apple ID бота.
  4. Включите Remote Login (System Settings → General → Sharing → Remote Login).
  5. Установите imsg:
    • brew install steipete/tap/imsg
  6. Настройте SSH так, чтобы ssh <bot-macos-user>@localhost true работал без пароля.
  7. Укажите channels.imessage.accounts.bot.cliPath на SSH-обёртку, которая запускает imsg от имени пользователя бота.
Примечание о первом запуске: отправка/приём могут потребовать GUI-разрешений (Automation + Full Disk Access) у пользователя macOS бота. Если imsg rpc выглядит зависшим или завершается, войдите под этим пользователем (помогает Screen Sharing), выполните одноразово imsg chats --limit 1 / imsg send ..., подтвердите запросы и повторите попытку. См. См. Устранение неполадок macOS Privacy and Security TCC. Пример обёртки (chmod +x). Замените <bot-macos-user> на фактическое имя пользователя macOS:
#!/usr/bin/env bash
set -euo pipefail

# Run an interactive SSH once first to accept host keys:
#   ssh <bot-macos-user>@localhost true
exec /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=5 -T <bot-macos-user>@localhost \
  "/usr/local/bin/imsg" "$@"
Пример конфига:
{
  channels: {
    imessage: {
      enabled: true,
      accounts: {
        bot: {
          name: "Bot",
          enabled: true,
          cliPath: "/path/to/imsg-bot",
          dbPath: "/Users/<bot-macos-user>/Library/Messages/chat.db",
        },
      },
    },
  },
}
Для одноаккаунтных установок используйте плоские параметры (channels.imessage.cliPath, channels.imessage.dbPath) вместо карты accounts.

Удалённый/SSH-вариант (необязательно)

Если iMessage нужен на другом Mac, установите channels.imessage.cliPath на обёртку, которая запускает imsg на удалённом хосте macOS по SSH. OpenClaw требуется только stdio. Пример обёртки:
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"
Удалённые вложения: когда cliPath указывает на удалённый хост через SSH, пути вложений в базе данных Messages ссылаются на файлы на удалённой машине. OpenClaw может автоматически получать их по SCP, установив channels.imessage.remoteHost:
{
  channels: {
    imessage: {
      cliPath: "~/imsg-ssh", // SSH wrapper to remote Mac
      remoteHost: "user@gateway-host", // for SCP file transfer
      includeAttachments: true,
    },
  },
}
Если remoteHost не задан, OpenClaw пытается определить его автоматически, разбирая SSH-команду в вашем скрипте-обёртке. Для надёжности рекомендуется явная конфигурация.

Удалённый Mac через Tailscale (пример)

Если Gateway (шлюз) работает на Linux-хосте/ВМ, а iMessage должен работать на Mac, Tailscale — самый простой мост: шлюз общается с Mac по tailnet, запускает imsg по SSH и копирует вложения обратно по SCP. Архитектура: Конкретный пример конфига (hostname Tailscale):
{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "~/.openclaw/scripts/imsg-ssh",
      remoteHost: "[email protected]",
      includeAttachments: true,
      dbPath: "/Users/bot/Library/Messages/chat.db",
    },
  },
}
Пример обёртки (~/.openclaw/scripts/imsg-ssh):
#!/usr/bin/env bash
exec ssh -T [email protected] imsg "$@"
Примечания:
  • Убедитесь, что 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 imessage
    • openclaw 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: {
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15555550123"],
      groups: {
        "42": { requireMention: false },
      },
    },
  },
}
Это полезно, если вам нужна изолированная личность/модель для конкретного потока (см. Маршрутизация нескольких агентов). Для изоляции файловой системы см. Sandboxing.

Медиа + ограничения

  • Необязательная загрузка вложений в контекст через 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]
Список чатов:
imsg chats --limit 20

Справочник конфигурации (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.