BlueBubbles (macOS REST)
Статус: вбудований Plugin, який взаємодіє із сервером BlueBubbles macOS через HTTP. Рекомендовано для інтеграції з iMessage завдяки багатшому API та простішому налаштуванню порівняно із застарілим каналом imsg.Вбудований Plugin
Поточні випуски OpenClaw містять BlueBubbles у комплекті, тому звичайним пакетним збіркам не потрібен окремий крокopenclaw plugins install.
Огляд
- Працює на macOS через допоміжний застосунок BlueBubbles (bluebubbles.app).
- Рекомендовано/протестовано: macOS Sequoia (15). macOS Tahoe (26) працює; редагування зараз не працює на Tahoe, а оновлення іконок груп можуть повідомляти про успіх, але не синхронізуватися.
- OpenClaw взаємодіє з ним через REST API (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - Вхідні повідомлення надходять через Webhook; вихідні відповіді, індикатори введення, підтвердження прочитання та tapback — це REST-виклики.
- Вкладення та стікери обробляються як вхідні медіафайли (і передаються агенту, коли це можливо).
- Сполучення в пару/список дозволених працює так само, як і в інших каналах (
/channels/pairingтощо) зchannels.bluebubbles.allowFrom+ кодами сполучення. - Реакції відображаються як системні події так само, як у Slack/Telegram, тож агенти можуть “згадувати” їх перед відповіддю.
- Розширені можливості: редагування, скасування надсилання, гілки відповідей, ефекти повідомлень, керування групами.
Швидкий старт
- Установіть сервер BlueBubbles на своєму Mac (дотримуйтесь інструкцій на bluebubbles.app/install).
- У конфігурації BlueBubbles увімкніть web API і задайте пароль.
-
Запустіть
openclaw onboardі виберіть BlueBubbles або налаштуйте вручну: -
Спрямуйте BlueBubbles Webhook на ваш Gateway (приклад:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). - Запустіть Gateway; він зареєструє обробник Webhook і почне сполучення в пару.
- Завжди задавайте пароль Webhook.
- Автентифікація Webhook завжди обов’язкова. OpenClaw відхиляє запити Webhook BlueBubbles, якщо вони не містять пароль/guid, що відповідає
channels.bluebubbles.password(наприклад,?password=<password>абоx-password), незалежно від топології loopback/проксі. - Автентифікація за паролем перевіряється до читання/розбору повних тіл Webhook.
Підтримання Messages.app активним (VM / headless-середовища)
У деяких середовищах macOS VM / always-on Messages.app може перейти в “idle” (вхідні події припиняються, доки застосунок не буде відкрито/виведено на передній план). Просте обхідне рішення — торкатися Messages кожні 5 хвилин за допомогою AppleScript + LaunchAgent.1) Збережіть AppleScript
Збережіть це як:~/Scripts/poke-messages.scpt
2) Установіть LaunchAgent
Збережіть це як:~/Library/LaunchAgents/com.user.poke-messages.plist
- Це запускається кожні 300 секунд і під час входу в систему.
- Перший запуск може викликати запити macOS Automation (
osascript→ Messages). Підтвердьте їх у тій самій користувацькій сесії, у якій працює LaunchAgent.
Онбординг
BlueBubbles доступний в інтерактивному онбордингу:- URL сервера (обов’язково): адреса сервера BlueBubbles (наприклад,
http://192.168.1.100:1234) - Пароль (обов’язково): пароль API з налаштувань BlueBubbles Server
- Шлях Webhook (необов’язково): типове значення
/bluebubbles-webhook - Політика DM: pairing, allowlist, open або disabled
- Список дозволених: телефонні номери, електронні адреси або цілі чату
Керування доступом (DM + групи)
DM:- Типово:
channels.bluebubbles.dmPolicy = "pairing". - Невідомі відправники отримують код сполучення в пару; повідомлення ігноруються до схвалення (коди діють 1 годину).
- Схвалення через:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- Сполучення в пару — типовий обмін токенами. Докладніше: Сполучення в пару
channels.bluebubbles.groupPolicy = open | allowlist | disabled(типово:allowlist).channels.bluebubbles.groupAllowFromвизначає, хто може запускати обробку в групах, коли встановленоallowlist.
Збагачення імен контактів (macOS, необов’язково)
Webhook груп BlueBubbles часто містять лише сирі адреси учасників. Якщо ви хочете, щоб контекстGroupMembers натомість показував локальні імена контактів, можна ввімкнути локальне збагачення з Contacts на macOS:
channels.bluebubbles.enrichGroupParticipantsFromContacts = trueвмикає пошук. Типове значення:false.- Пошук виконується лише після того, як доступ до групи, авторизація команди та згадка дозволили пропустити повідомлення.
- Збагачуються лише безіменні телефонні учасники.
- Сирі телефонні номери лишаються резервним варіантом, якщо локального збігу не знайдено.
Фільтрація за згадками (групи)
BlueBubbles підтримує фільтрацію за згадками для групових чатів, як і iMessage/WhatsApp:- Використовує
agents.list[].groupChat.mentionPatterns(абоmessages.groupChat.mentionPatterns) для виявлення згадок. - Коли для групи ввімкнено
requireMention, агент відповідає лише тоді, коли його згадано. - Керівні команди від авторизованих відправників оминають фільтрацію за згадками.
Фільтрація команд
- Керівні команди (наприклад,
/config,/model) потребують авторизації. - Для визначення авторизації команд використовуються
allowFromіgroupAllowFrom. - Авторизовані відправники можуть виконувати керівні команди навіть без згадки в групах.
Системний промпт для кожної групи
Кожен запис уchannels.bluebubbles.groups.* приймає необов’язковий рядок systemPrompt. Значення впроваджується в системний промпт агента на кожному ході, який обробляє повідомлення в цій групі, тож ви можете задати для кожної групи образ або правила поведінки без редагування промптів агента:
chatGuid / chatIdentifier / числовий chatId для групи, а запис-шаблон "*" задає типове значення для кожної групи без точного збігу (той самий шаблон використовується для requireMention і політик інструментів для кожної групи). Точні збіги завжди мають пріоритет над шаблоном. DM ігнорують це поле; натомість використовуйте налаштування промптів на рівні агента або облікового запису.
Практичний приклад: гілки відповідей і tapback-реакції (Private API)
Якщо увімкнено BlueBubbles Private API, вхідні повідомлення надходять із короткими ідентифікаторами повідомлень (наприклад,[[reply_to:5]]), а агент може викликати action=reply, щоб відповісти в конкретну гілку повідомлення, або action=react, щоб залишити tapback. systemPrompt для кожної групи — надійний спосіб змусити агента вибирати правильний інструмент:
Прив’язки розмов ACP
Чати BlueBubbles можна перетворити на постійні робочі простори ACP без зміни транспортного рівня. Швидкий операторський сценарій:- Виконайте
/acp spawn codex --bind hereу цьому DM або дозволеному груповому чаті. - Майбутні повідомлення в цій самій розмові BlueBubbles спрямовуватимуться до створеної сесії ACP.
/newі/resetскидають ту саму прив’язану сесію ACP на місці./acp closeзакриває сесію ACP і видаляє прив’язку.
bindings[] з type: "acp" і match.channel: "bluebubbles".
match.peer.id може використовувати будь-яку підтримувану форму цілі BlueBubbles:
- нормалізований DM-ідентифікатор, наприклад
+15555550123абоuser@example.com chat_id:<id>chat_guid:<guid>chat_identifier:<identifier>
chat_id:* або chat_identifier:*.
Приклад:
Введення + підтвердження прочитання
- Індикатори введення: надсилаються автоматично до та під час генерації відповіді.
- Підтвердження прочитання: керуються через
channels.bluebubbles.sendReadReceipts(типово:true). - Індикатори введення: OpenClaw надсилає події початку введення; BlueBubbles автоматично очищує стан введення після надсилання або тайм-ауту (ручна зупинка через DELETE ненадійна).
Розширені дії
BlueBubbles підтримує розширені дії з повідомленнями, якщо їх увімкнено в конфігурації:- react: додавання/видалення tapback-реакцій (
messageId,emoji,remove). Вбудований набір tapback в iMessage — цеlove,like,dislike,laugh,emphasizeіquestion. Коли агент вибирає emoji поза цим набором (наприклад,👀), інструмент реакції повертається доlove, щоб tapback усе одно відобразився замість збою всього запиту. Налаштовані ack-реакції, як і раніше, проходять сувору перевірку та повертають помилку для невідомих значень. - edit: редагування надісланого повідомлення (
messageId,text) - unsend: скасування надсилання повідомлення (
messageId) - reply: відповідь на конкретне повідомлення (
messageId,text,to) - sendWithEffect: надсилання з ефектом iMessage (
text,to,effectId) - renameGroup: перейменування групового чату (
chatGuid,displayName) - setGroupIcon: встановлення іконки/фото групового чату (
chatGuid,media) — нестабільно на macOS 26 Tahoe (API може повертати успіх, але іконка не синхронізується). - addParticipant: додавання когось до групи (
chatGuid,address) - removeParticipant: видалення когось із групи (
chatGuid,address) - leaveGroup: вихід із групового чату (
chatGuid) - upload-file: надсилання медіа/файлів (
to,buffer,filename,asVoice)- Голосові повідомлення: встановіть
asVoice: trueз аудіо MP3 або CAF, щоб надіслати його як голосове повідомлення iMessage. BlueBubbles конвертує MP3 → CAF під час надсилання голосових повідомлень.
- Голосові повідомлення: встановіть
- Застарілий псевдонім:
sendAttachmentусе ще працює, алеupload-file— це канонічна назва дії.
Ідентифікатори повідомлень (короткі чи повні)
OpenClaw може показувати короткі ідентифікатори повідомлень (наприклад,1, 2) для економії токенів.
MessageSid/ReplyToIdможуть бути короткими ідентифікаторами.MessageSidFull/ReplyToIdFullмістять повні ідентифікатори провайдера.- Короткі ідентифікатори зберігаються в пам’яті; вони можуть зникати після перезапуску або очищення кешу.
- Дії приймають короткий або повний
messageId, але короткі ідентифікатори повернуть помилку, якщо більше недоступні.
- Шаблони:
{{MessageSidFull}},{{ReplyToIdFull}} - Контекст:
MessageSidFull/ReplyToIdFullу вхідних payload
Злиття розділених DM-надсилань (команда + URL в одній композиції)
Коли користувач вводить команду й URL разом в iMessage — наприклад,Dump https://example.com/article — Apple розбиває надсилання на дві окремі доставки Webhook:
- Текстове повідомлення (
"Dump"). - Бульбашку попереднього перегляду URL (
"https://...") із зображеннями OG-перегляду як вкладеннями.
channels.bluebubbles.coalesceSameSenderDms дає змогу для DM об’єднувати послідовні Webhook від одного відправника в один хід агента. Групові чати й далі використовують прив’язку до кожного повідомлення, тому багатокористувацька структура ходів зберігається.
Коли вмикати
Увімкніть, якщо:- Ви використовуєте Skills, які очікують
command + payloadв одному повідомленні (dump, paste, save, queue тощо). - Ваші користувачі вставляють URL, зображення або довгий вміст разом із командами.
- Ви можете прийняти додаткову затримку ходу DM (див. нижче).
- Вам потрібна мінімальна затримка команд для однословних тригерів у DM.
- Усі ваші сценарії — це одноразові команди без подальшого payload.
Увімкнення
messages.inbound.byChannel.bluebubbles не задано, вікно debounce розширюється до 2500 мс (типове значення для режиму без злиття — 500 мс). Потрібне ширше вікно — ритм розділеного надсилання Apple в межах 0.8-2.0 с не вкладається в стандартне вужче значення.
Щоб налаштувати вікно вручну:
Компроміси
- Додаткова затримка для керівних команд DM. Коли прапорець увімкнено, повідомлення з керівними командами в DM (наприклад,
Dump,Saveтощо) тепер чекають до завершення вікна debounce перед надсиланням далі — на випадок, якщо наближається payload Webhook. Команди в групових чатах і далі надсилаються миттєво. - Об’єднаний результат має обмеження — об’єднаний текст обмежується 4000 символами з явним маркером
…[truncated]; вкладення — до 20; записи-джерела — до 10 (понад це зберігаються перший і найновіший). Кожен вихіднийmessageIdусе одно потрапляє до дедуплікації вхідних даних, тому пізніше відтворення будь-якої окремої події через MessagePoller буде розпізнано як дублікат. - Opt-in, для кожного каналу окремо. Інші канали (Telegram, WhatsApp, Slack, …) не змінюються.
Сценарії та що бачить агент
| Користувач складає повідомлення | Apple доставляє | Прапорець вимкнено (типово) | Прапорець увімкнено + вікно 2500 мс |
|---|---|---|---|
Dump https://example.com (одне надсилання) | 2 Webhook з інтервалом ~1 с | Два ходи агента: лише “Dump”, потім URL | Один хід: об’єднаний текст Dump https://example.com |
Save this 📎image.jpg caption (вкладення + текст) | 2 Webhook | Два ходи | Один хід: текст + зображення |
/status (окрема команда) | 1 Webhook | Миттєве надсилання | Очікування до межі вікна, потім надсилання |
| Лише вставлений URL | 1 Webhook | Миттєве надсилання | Миттєве надсилання (у кошику лише один запис) |
| Текст + URL надіслано як два навмисно окремі повідомлення з інтервалом у хвилини | 2 Webhook поза вікном | Два ходи | Два ходи (між ними спливає вікно) |
| Швидкий потік (>10 малих DM у межах вікна) | N Webhook | N ходів | Один хід, результат з обмеженнями (застосовано перший + найновіший, ліміти тексту/вкладень) |
Усунення проблем зі злиттям розділених надсилань
Якщо прапорець увімкнено, а розділені надсилання все одно приходять як два ходи, перевірте кожен рівень:-
Конфігурацію справді завантажено.
Потім виконайте
openclaw gateway restart— прапорець зчитується під час створення реєстру debouncer. -
Вікно debounce достатньо широке для вашого середовища. Подивіться журнал сервера BlueBubbles у
~/Library/Logs/bluebubbles-server/main.log:Виміряйте інтервал між надсиланням тексту на кшталт"Dump"і наступним надсиланням"https://..."; Attachments:. Піднімітьmessages.inbound.byChannel.bluebubbles, щоб комфортно перекрити цей інтервал. -
Часові позначки JSONL сесії ≠ прибуття Webhook. Часові позначки подій сесії (
~/.openclaw/agents/<id>/sessions/*.jsonl) відображають момент, коли Gateway передає повідомлення агенту, а не коли прибув Webhook. Поставлене в чергу друге повідомлення з позначкою[Queued messages while agent was busy]означає, що перший хід ще виконувався, коли прибув другий Webhook — кошик злиття вже було скинуто. Налаштовуйте вікно за журналом сервера BB, а не за журналом сесії. -
Тиск пам’яті сповільнює надсилання відповіді. На слабших машинах (8 ГБ) ходи агента можуть тривати достатньо довго, щоб кошик злиття скинувся ще до завершення відповіді, і URL потрапив як другий хід у черзі. Перевірте
memory_pressureіps -o rss -p $(pgrep openclaw-gateway); якщо Gateway використовує понад ~500 МБ RSS і активний компресор, закрийте інші важкі процеси або перейдіть на потужніший хост. -
Надсилання з цитованою відповіддю — це інший шлях. Якщо користувач торкнувся
Dumpяк відповіді на наявну бульбашку URL (iMessage показує значок “1 Reply” на бульбашці Dump), URL міститься вreplyToBody, а не в другому Webhook. Тут злиття не застосовується — це питання Skills/промпта, а не debouncer.
Блокове потокове передавання
Керуйте тим, чи надсилаються відповіді як одне повідомлення, чи потоково блоками:Медіа + ліміти
- Вхідні вкладення завантажуються й зберігаються в кеші медіа.
- Ліміт медіа через
channels.bluebubbles.mediaMaxMbдля вхідних і вихідних медіа (типово: 8 МБ). - Вихідний текст розбивається на частини за
channels.bluebubbles.textChunkLimit(типово: 4000 символів).
Довідник із конфігурації
Повна конфігурація: Configuration Параметри провайдера:channels.bluebubbles.enabled: увімкнути/вимкнути канал.channels.bluebubbles.serverUrl: базовий URL REST API BlueBubbles.channels.bluebubbles.password: пароль API.channels.bluebubbles.webhookPath: шлях endpoint Webhook (типово:/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(типово:pairing).channels.bluebubbles.allowFrom: список дозволених для DM (ідентифікатори, електронні адреси, номери E.164,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(типово:allowlist).channels.bluebubbles.groupAllowFrom: список дозволених відправників для груп.channels.bluebubbles.enrichGroupParticipantsFromContacts: на macOS необов’язково збагачує безіменних учасників групи з локальних Contacts після проходження фільтрації. Типове значення:false.channels.bluebubbles.groups: конфігурація для кожної групи (requireMentionтощо).channels.bluebubbles.sendReadReceipts: надсилати підтвердження прочитання (типово:true).channels.bluebubbles.blockStreaming: увімкнути блокове потокове передавання (типово:false; обов’язково для потокових відповідей).channels.bluebubbles.textChunkLimit: розмір вихідного фрагмента в символах (типово: 4000).channels.bluebubbles.sendTimeoutMs: тайм-аут одного запиту в мс для надсилання вихідного тексту через/api/v1/message/text(типово: 30000). Збільшіть на середовищах macOS 26, де надсилання iMessage через Private API може зависати на 60+ секунд у фреймворку iMessage; наприклад,45000або60000. Перевірки, пошук чатів, реакції, редагування та перевірки стану поки що використовують коротший типовий тайм-аут 10 с; розширення цього покриття на реакції та редагування заплановано окремо. Перевизначення для облікового запису:channels.bluebubbles.accounts.<accountId>.sendTimeoutMs.channels.bluebubbles.chunkMode:length(типово) розбиває лише в разі перевищенняtextChunkLimit;newlineрозбиває за порожніми рядками (межами абзаців) перед розбиттям за довжиною.channels.bluebubbles.mediaMaxMb: ліміт вхідних/вихідних медіа в МБ (типово: 8).channels.bluebubbles.mediaLocalRoots: явний список дозволених абсолютних локальних каталогів для вихідних шляхів до локальних медіа. Надсилання локальних шляхів типово заборонено, доки це не налаштовано. Перевизначення для облікового запису:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.coalesceSameSenderDms: об’єднувати послідовні Webhook DM від одного відправника в один хід агента, щоб розділене Apple надсилання текст+URL надходило як одне повідомлення (типово:false). Див. Злиття розділених DM-надсилань щодо сценаріїв, налаштування вікна та компромісів. Розширює типове вхідне вікно debounce з 500 мс до 2500 мс, коли ввімкнено без явногоmessages.inbound.byChannel.bluebubbles.channels.bluebubbles.historyLimit: максимальна кількість групових повідомлень для контексту (0 вимикає).channels.bluebubbles.dmHistoryLimit: ліміт історії DM.channels.bluebubbles.actions: увімкнути/вимкнути окремі дії.channels.bluebubbles.accounts: конфігурація кількох облікових записів.
agents.list[].groupChat.mentionPatterns(абоmessages.groupChat.mentionPatterns).messages.responsePrefix.
Адресація / цілі доставки
Для стабільної маршрутизації надавайте перевагуchat_guid:
chat_guid:iMessage;-;+15555550123(рекомендовано для груп)chat_id:123chat_identifier:...- Прямі ідентифікатори:
+15555550123,user@example.com- Якщо для прямого ідентифікатора немає наявного DM-чату, OpenClaw створить його через
POST /api/v1/chat/new. Для цього потрібно, щоб був увімкнений BlueBubbles Private API.
- Якщо для прямого ідентифікатора немає наявного DM-чату, OpenClaw створить його через
Маршрутизація iMessage vs SMS
Коли той самий ідентифікатор має і чат iMessage, і чат SMS на Mac (наприклад, номер телефону, зареєстрований в iMessage, але який також отримував fallback зелених бульбашок), OpenClaw віддає перевагу чату iMessage і ніколи не виконує тихе зниження до SMS. Щоб примусово використати чат SMS, задайте явний префікс ціліsms: (наприклад, sms:+15555550123). Ідентифікатори без відповідного чату iMessage однаково надсилатимуться через той чат, який повідомляє BlueBubbles.
Безпека
- Запити Webhook автентифікуються шляхом порівняння query-параметрів або заголовків
guid/passwordізchannels.bluebubbles.password. - Зберігайте пароль API та endpoint Webhook у таємниці (ставтеся до них як до облікових даних).
- Для автентифікації Webhook BlueBubbles немає обходу через localhost. Якщо ви проксіюєте трафік Webhook, зберігайте пароль BlueBubbles у запиті від початку до кінця.
gateway.trustedProxiesтут не замінюєchannels.bluebubbles.password. Див. Безпека Gateway. - Увімкніть HTTPS + правила firewall на сервері BlueBubbles, якщо відкриваєте його за межі своєї LAN.
Усунення проблем
- Якщо перестали працювати події введення/прочитання, перевірте журнали Webhook BlueBubbles і переконайтеся, що шлях Gateway відповідає
channels.bluebubbles.webhookPath. - Коди сполучення в пару діють одну годину; використовуйте
openclaw pairing list bluebubblesіopenclaw pairing approve bluebubbles <code>. - Реакції потребують BlueBubbles private API (
POST /api/v1/message/react); переконайтеся, що версія сервера його надає. - Редагування/скасування надсилання потребують macOS 13+ і сумісної версії сервера BlueBubbles. На macOS 26 (Tahoe) редагування зараз не працює через зміни private API.
- Оновлення іконок груп можуть бути нестабільними на macOS 26 (Tahoe): API може повертати успіх, але нова іконка не синхронізується.
- OpenClaw автоматично приховує відомі зламані дії на основі версії macOS сервера BlueBubbles. Якщо редагування все ще відображається на macOS 26 (Tahoe), вимкніть його вручну через
channels.bluebubbles.actions.edit=false. coalesceSameSenderDmsувімкнено, але розділені надсилання (наприклад,Dump+ URL) усе одно надходять як два ходи: див. контрольний список усунення проблем зі злиттям розділених надсилань — поширені причини: надто вузьке вікно debounce, часові позначки журналу сесії помилково сприймаються як прибуття Webhook, або надсилання є відповіддю з цитатою (яка використовуєreplyToBody, а не другий Webhook).- Для інформації про статус/стан:
openclaw status --allабоopenclaw status --deep.
Пов’язане
- Огляд каналів — усі підтримувані канали
- Сполучення в пару — автентифікація DM і процес сполучення
- Групи — поведінка групових чатів і фільтрація за згадками
- Маршрутизація каналів — маршрутизація сесій для повідомлень
- Безпека — модель доступу та посилення захисту