Skip to main content
Поддержка BlueBubbles удалена. OpenClaw поддерживает iMessage только через встроенный плагин imessage, который управляет steipete/imsg по JSON-RPC и предоставляет доступ к тому же набору закрытых API, что и BlueBubbles (react, edit, unsend, reply, sendWithEffect, нативные опросы, управление группами, вложения). Один исполняемый файл CLI заменяет сервер BlueBubbles, клиентское приложение и инфраструктуру вебхуков: без конечной точки REST и без аутентификации вебхуков. В этом руководстве описан перенос старых конфигураций channels.bluebubbles в channels.imessage. Других поддерживаемых путей миграции нет. В текущей версии OpenClaw оставшийся блок channels.bluebubbles неактивен — ни один компонент среды выполнения его не читает.
Краткое объявление и сводку для операторов см. в разделе Удаление BlueBubbles и путь iMessage через imsg.

Контрольный список миграции

Кратчайший безопасный путь, если вы уже знакомы со своей старой конфигурацией BlueBubbles:
  1. Проверьте imsg непосредственно на Mac, где работает Messages.app (imsg chats, imsg history, imsg send, imsg rpc --help).
  2. Скопируйте ключи поведения из channels.bluebubbles в channels.imessage: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, includeAttachments, attachmentRoots, mediaMaxMb, textChunkLimit, coalesceSameSenderDms и actions.
  3. Удалите больше не существующие ключи транспорта: serverUrl, password, URL-адреса вебхуков и настройки сервера BlueBubbles.
  4. Если Gateway работает не на том Mac, где запущен Messages, задайте для channels.imessage.cliPath SSH-обёртку и настройте remoteHost для удалённого получения вложений.
  5. Включите channels.imessage, перезапустите Gateway, затем выполните openclaw channels status --probe --channel imessage.
  6. Проверьте одно личное сообщение, одну разрешённую группу, вложения, если они включены, и каждое действие закрытого API, которое должен использовать агент.
  7. Удалите сервер BlueBubbles и старую конфигурацию channels.bluebubbles после проверки пути iMessage.

Что делает imsg

imsg — локальный CLI для Messages в macOS. OpenClaw запускает imsg rpc как дочерний процесс и обменивается с ним данными по JSON-RPC через stdin/stdout. Нет ни HTTP-сервера, ни URL-адреса вебхука, ни фонового демона, ни агента запуска, ни порта, который нужно открывать.
  • Чтение выполняется из ~/Library/Messages/chat.db с помощью дескриптора SQLite, открытого только для чтения.
  • Входящие сообщения в реальном времени поступают из imsg watch / watch.subscribe, который отслеживает события файловой системы chat.db, используя опрос в качестве резервного механизма.
  • Обычные текстовые сообщения и файлы отправляются посредством автоматизации Messages.app.
  • Для расширенных действий используется imsg launch, который внедряет вспомогательный модуль imsg в Messages.app. Именно это обеспечивает уведомления о прочтении, индикаторы набора текста, форматированную отправку, редактирование, отмену отправки, ответы в ветках, реакции, опросы и управление группами.
  • Сборки Linux могут исследовать скопированный chat.db, но не могут отправлять сообщения, следить за активной базой данных Mac или управлять Messages.app. Для работы OpenClaw с iMessage запускайте imsg на Mac с выполненным входом в систему или через SSH-обёртку для этого Mac.

Перед началом

  1. Установите imsg на Mac, где работает Messages.app:
    При обычной локальной настройке мастер настройки OpenClaw может предложить подтверждаемую пользователем установку или обновление imsg через Homebrew на Mac с выполненным входом в Messages. Ручная настройка и топологии с SSH-обёрткой остаются под управлением оператора: повторите обновление Homebrew в том же локальном или удалённом пользовательском контексте, в котором будет запускаться imsg. Если imsg chats завершается с ошибкой unable to open database file, пустым выводом или authorization denied, предоставьте полный доступ к диску терминалу, редактору, процессу Node, службе Gateway или родительскому процессу SSH, который запускает imsg, а затем перезапустите этот родительский процесс.
  2. Перед изменением конфигурации OpenClaw проверьте интерфейсы чтения, отслеживания, отправки и RPC:
    Замените 42 реальным идентификатором чата из imsg chats. Для отправки требуется разрешение на автоматизацию Messages.app. Если OpenClaw будет работать через SSH, выполняйте эти команды через ту же SSH-обёртку или в том же пользовательском контексте, который будет использовать OpenClaw. Если чтение работает, но отправка завершается ошибкой AppleEvents -1743, проверьте, предоставлено ли разрешение на автоматизацию для /usr/libexec/sshd-keygen-wrapper; см. Сбой отправки через SSH-обёртку с ошибкой AppleEvents -1743.
  3. Включите мост закрытого API. Настоятельно рекомендуется сделать это для iMessage в OpenClaw, поскольку от него зависят ответы, реакции, эффекты, опросы, ответы на вложения и действия с группами:
    Для imsg launch требуется отключить SIP (а в современных версиях macOS также ослабить проверку библиотек — см. Включение закрытого API imsg). Базовая отправка, история и отслеживание работают без imsg launch, но полный набор действий OpenClaw для iMessage — нет.
  4. После включения channels.imessage и запуска Gateway проверьте мост через OpenClaw:
    Учётная запись iMessage должна сообщать works; при наличии --json полезная нагрузка проверки содержит privateApi.available: true. Если она сообщает false, сначала устраните эту проблему — см. Определение возможностей. Для проверки требуется доступный Gateway (иначе CLI возвращает только вывод на основе конфигурации); проверяются только настроенные и включённые учётные записи.
  5. Создайте резервную копию конфигурации:

Перенос конфигурации

iMessage и BlueBubbles используют большинство одинаковых ключей поведения на уровне канала. Различаются транспорт (REST-сервер или локальный CLI) и формат ключей реестра групп. Конфигурации с несколькими учётными записями (channels.bluebubbles.accounts.*) однозначно преобразуются в channels.imessage.accounts.*.

Ловушка реестра групп

Встроенный плагин iMessage последовательно применяет два фильтра групп. Чтобы групповое сообщение дошло до агента, оно должно пройти оба:
  1. Список разрешённых отправителей / целевых чатов (channels.imessage.groupAllowFrom) — сопоставляет адрес отправителя или целевой чат (записи chat_id:, chat_guid:, chat_identifier:). Если groupAllowFrom не задан, этот фильтр использует allowFrom; явное значение groupAllowFrom: [] отключает такой резервный вариант и отбрасывает все групповые сообщения при groupPolicy: "allowlist".
  2. Реестр групп (channels.imessage.groups) — использует в качестве ключа числовой chat_id iMessage:
    • Блок groups отсутствует (или пуст): группы проходят этот фильтр, если в фильтре 1 действует непустой список разрешённых отправителей; доступ регулируется фильтрацией отправителей, а предупреждение при запуске об отбрасывании всех сообщений не выводится.
    • groups содержит записи, но не "*": проходят только перечисленные ключи chat_id. Добавление любой группы превращает реестр в список разрешённых даже при groupPolicy: "open".
    • groups: { "*": { ... } }: этот фильтр пропускает все группы.
Ловушка миграции: BlueBubbles использовал для записей groups ключи GUID чата / идентификаторы чата, а реестр iMessage использует числовой chat_id. Если дословно скопировать записи отдельных групп, получится непустой реестр с ключами, которые никогда не совпадут, поэтому все групповые сообщения будут отбрасываться фильтром 2. Скопируйте запись с подстановочным знаком "*" без изменений; замените ключи отдельных групп значениями chat_id из imsg chats. Оба пути отбрасывания видны при стандартном уровне журналирования в строках warn:
  • Один раз для каждой учётной записи при запуске, когда задано groupPolicy: "allowlist", а действующий список разрешённых отправителей групп пуст: imessage: groupPolicy="allowlist" for account "<id>" but no group sender allowlist is configured .... Задайте groupAllowFrom (или allowFrom), чтобы разрешить отправителей; одного добавления groups недостаточно для прохождения фильтра отправителей.
  • Один раз для каждого chat_id во время работы, когда реестр отбрасывает группу: imessage: dropping group message from chat_id=<id> ... not in channels.imessage.groups allowlist с указанием точного ключа, который нужно добавить.
Личные сообщения продолжают работать в любом случае — они обрабатываются другим путём, поэтому успешная работа личных сообщений не подтверждает правильную маршрутизацию групп. Минимальная конфигурация с ограничением по отправителям при groupPolicy: "allowlist":
Эта конфигурация разрешает указанным отправителям писать в любой группе. Добавьте записи groups, чтобы ограничить разрешённые чаты или задать параметры отдельных чатов, например requireMention; скопируйте запись BlueBubbles "*" без изменений, но замените ключи отдельных записей числовыми значениями chat_id iMessage.

Пошаговая инструкция

  1. Преобразуйте конфигурацию. Во время редактирования оставьте новый блок отключённым; старый блок channels.bluebubbles игнорируется текущей версией OpenClaw и может оставаться рядом для справки:
  2. Выполните переход и проверку. Задайте channels.imessage.enabled: true, перезапустите Gateway и убедитесь, что канал сообщает об исправном состоянии:
    Для проверки требуется доступный Gateway; проверяются только настроенные и включённые учётные записи. Чтобы проверить сам Mac, используйте прямые команды imsg из раздела Перед началом работы.
  3. Проверьте личные сообщения. Отправьте агенту личное сообщение и убедитесь, что ответ доставлен.
  4. Проверьте группы отдельно. Личные сообщения и группы обрабатываются разными путями кода — успешная работа личных сообщений не подтверждает маршрутизацию групповых. Отправьте сообщение в разрешённый групповой чат и убедитесь, что ответ доставлен. Если группа перестала отвечать (нет ни ответа агента, ни ошибки), найдите в журнале Gateway две строки warn из раздела «Опасная особенность реестра групп» выше. Предупреждение при запуске означает, что фактический список разрешённых отправителей пуст; предупреждение для конкретного chat_id означает, что заполненный реестр groups не содержит этот чат.
  5. Проверьте доступные действия. В сопряжённом личном чате попросите агента добавить реакцию, отредактировать и отменить отправку сообщения, ответить, отправить фотографию, а также (в группе) переименовать группу или добавить/удалить участника. Каждое действие должно выполняться нативно в Messages.app. Если какое-либо действие выдаёт iMessage <action> requires the imsg private API bridge, снова выполните imsg launch и обновите с помощью openclaw channels status --probe.
  6. Удалите сервер BlueBubbles и блок channels.bluebubbles, когда проверите личные сообщения, группы и действия iMessage. OpenClaw не читает channels.bluebubbles.

Краткое сравнение доступных действий

iMessage восстанавливает сообщения, пропущенные во время простоя Gateway: при запуске он повторно воспроизводит сообщения начиная с последнего отправленного rowid через imsg watch.subscribe since_rowid, устраняет дубликаты по GUID, а ограничение по возрасту устаревшей очереди предотвращает «взрыв очереди» при сбросе Push. Это выполняется через RPC-соединение imsg, поэтому работает и в удалённых конфигурациях cliPath через SSH; локальные конфигурации получают более широкое окно восстановления, поскольку могут читать chat.db. См. Восстановление входящих сообщений после перезапуска моста или Gateway.

Сопряжение, сеансы и привязки ACP

  • Списки разрешений переносятся по идентификатору. channels.imessage.allowFrom распознаёт те же строки +15555550123 / user@example.com, которые использовал BlueBubbles, — скопируйте их дословно.
  • Одобрения из хранилища сопряжений не переносятся. Хранилище сопряжений создаётся отдельно для каждого канала, и старое хранилище BlueBubbles не мигрирует. Отправители, одобренные только через сопряжение, должны ещё раз выполнить сопряжение в iMessage, либо вы можете добавить их идентификаторы в allowFrom.
  • Сеансы по-прежнему ограничены конкретным агентом и чатом. При стандартном session.dmScope=main личные сообщения объединяются в основном сеансе агента; групповые сеансы остаются изолированными по chat_id (agent:<agentId>:imessage:group:<chat_id>). Старая история переписки, сохранённая под ключами сеансов BlueBubbles, не переносится в сеансы iMessage.
  • В привязках ACP, ссылающихся на match.channel: "bluebubbles", необходимо заменить значение на "imessage". Форматы match.peer.id (chat_id:, chat_guid:, chat_identifier:, идентификатор без дополнительных элементов) остаются прежними.

Канал для отката отсутствует

Поддерживаемой среды выполнения BlueBubbles, на которую можно вернуться, нет. Если проверка iMessage завершается неудачно, задайте channels.imessage.enabled: false, перезапустите Gateway, устраните препятствие imsg и повторите переход. Кеш ответов хранится в состоянии плагина SQLite. openclaw doctor --fix импортирует и архивирует старый вспомогательный файл imessage/reply-cache.jsonl, если он существует.

Связанные материалы