Dołączony PluginDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
imessage uzyskuje teraz dostęp do tej samej powierzchni prywatnego API co BlueBubbles (react, edit, unsend, reply, sendWithEffect, zarządzanie grupami, załączniki), sterując steipete/imsg przez JSON-RPC. Jeśli masz już Maca z zainstalowanym imsg, możesz porzucić serwer BlueBubbles i pozwolić Pluginowi rozmawiać bezpośrednio z Messages.app.
Obsługa BlueBubbles została usunięta. OpenClaw obsługuje iMessage wyłącznie przez imsg. Ten przewodnik służy do migracji starych konfiguracji channels.bluebubbles do channels.imessage; nie ma innej obsługiwanej ścieżki migracji.
Kiedy ta migracja ma sens
- Masz już uruchomione
imsgna tym samym Macu (lub na Macu osiągalnym przez SSH), na którym Messages.app jest zalogowana. - Chcesz mieć o jeden element mniej — bez osobnego serwera BlueBubbles, bez punktu końcowego REST do uwierzytelniania, bez instalacji Webhook. Pojedynczy binarny plik CLI zamiast serwera + aplikacji klienckiej + pomocnika.
- Używasz obsługiwanej wersji macOS / kompilacji
imsg, w której sonda prywatnego API zgłaszaavailable: true.
Co robi imsg
imsg to lokalne CLI macOS dla Messages. OpenClaw uruchamia imsg rpc jako proces potomny i komunikuje się przez JSON-RPC na stdin/stdout. Nie ma serwera HTTP, adresu URL Webhook, demona działającego w tle, agenta uruchamiania ani portu do wystawienia.
- Odczyty pochodzą z
~/Library/Messages/chat.dbprzy użyciu uchwytu SQLite tylko do odczytu. - Aktywne wiadomości przychodzące pochodzą z
imsg watch/watch.subscribe, które śledzi zdarzenia systemu plikówchat.dbz awaryjnym odpytywaniem. - Wysyłanie używa automatyzacji Messages.app dla zwykłego tekstu i wysyłania plików.
- Zaawansowane działania używają
imsg launch, aby wstrzyknąć pomocnikaimsgdo Messages.app. To odblokowuje potwierdzenia odczytu, wskaźniki pisania, rozbudowane wysyłanie, edycję, cofnięcie wysłania, odpowiedzi w wątkach, tapbacki i zarządzanie grupami. - Kompilacje dla Linuksa mogą przeglądać skopiowany
chat.db, ale nie mogą wysyłać, obserwować aktywnej bazy danych Maca ani sterować Messages.app. Dla OpenClaw iMessage uruchomimsgna zalogowanym Macu albo przez wrapper SSH do tego Maca.
Zanim zaczniesz
-
Zainstaluj
imsgna Macu, na którym działa Messages.app:Jeśliimsg chatskończy się błędemunable to open database file, pustym wynikiem alboauthorization denied, przyznaj Pełny dostęp do dysku terminalowi, edytorowi, procesowi Node, usłudze Gateway albo procesowi nadrzędnemu SSH, który uruchamiaimsg, a następnie ponownie otwórz ten proces nadrzędny. -
Zweryfikuj powierzchnie odczytu, obserwowania, wysyłania i RPC przed zmianą konfiguracji OpenClaw:
Zastąp
42rzeczywistym identyfikatorem czatu zimsg chats. Wysyłanie wymaga uprawnienia Automatyzacja dla Messages.app. Jeśli OpenClaw będzie działać przez SSH, uruchom te polecenia przez ten sam wrapper SSH lub kontekst użytkownika, którego będzie używać OpenClaw. -
Włącz most prywatnego API, gdy potrzebujesz zaawansowanych działań:
imsg launchwymaga wyłączenia SIP. Podstawowe wysyłanie, historia i obserwowanie działają bezimsg launch; zaawansowane działania nie. -
Zweryfikuj most przez OpenClaw:
Oczekiwany wynik to
imessage.privateApi.available: true. Jeśli zgłaszafalse, najpierw to napraw — zobacz Wykrywanie możliwości. -
Utwórz migawkę konfiguracji:
Tłumaczenie konfiguracji
iMessage i BlueBubbles współdzielą wiele konfiguracji na poziomie kanału. Klucze, które się zmieniają, dotyczą głównie transportu (serwer REST kontra lokalne CLI). Klucze zachowania (dmPolicy, groupPolicy, allowFrom itd.) zachowują to samo znaczenie.
| BlueBubbles | dołączony iMessage | Uwagi |
|---|---|---|
channels.bluebubbles.enabled | channels.imessage.enabled | Taka sama semantyka. |
channels.bluebubbles.serverUrl | (usunięto) | Brak serwera REST — plugin uruchamia imsg rpc przez stdio. |
channels.bluebubbles.password | (usunięto) | Uwierzytelnianie webhooka nie jest potrzebne. |
| (niejawne) | channels.imessage.cliPath | Ścieżka do imsg (domyślnie imsg); użyj skryptu opakowującego dla SSH. |
| (niejawne) | channels.imessage.dbPath | Opcjonalne nadpisanie Messages.app chat.db; automatycznie wykrywane, gdy pominięte. |
| (niejawne) | channels.imessage.remoteHost | host albo user@host — potrzebne tylko wtedy, gdy cliPath jest skryptem opakowującym SSH i chcesz pobierać załączniki przez SCP. |
channels.bluebubbles.dmPolicy | channels.imessage.dmPolicy | Te same wartości (pairing / allowlist / open / disabled). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | Zatwierdzenia parowania są przenoszone według uchwytu, nie tokena. |
channels.bluebubbles.groupPolicy | channels.imessage.groupPolicy | Te same wartości (allowlist / open / disabled). |
channels.bluebubbles.groupAllowFrom | channels.imessage.groupAllowFrom | Tak samo. |
channels.bluebubbles.groups | channels.imessage.groups | Skopiuj to dosłownie, w tym każdy wpis wieloznaczny groups: { "*": { ... } }. Ustawienia per grupa requireMention, tools, toolsBySender są przenoszone. Przy groupPolicy: "allowlist" pusty lub brakujący blok groups po cichu odrzuca każdą wiadomość grupową — zobacz „Pułapka rejestru grup” poniżej. |
channels.bluebubbles.sendReadReceipts | channels.imessage.sendReadReceipts | Domyślnie true. W dołączonym pluginie uruchamia się to tylko wtedy, gdy działa sonda prywatnego API. |
channels.bluebubbles.includeAttachments | channels.imessage.includeAttachments | Ten sam kształt, tak samo domyślnie wyłączone. Jeśli załączniki działały w BlueBubbles, musisz jawnie ustawić to ponownie w bloku iMessage — nie jest to przenoszone niejawnie, a przychodzące zdjęcia/media będą po cichu odrzucane bez wiersza dziennika Inbound message, dopóki tego nie zrobisz. |
channels.bluebubbles.attachmentRoots | channels.imessage.attachmentRoots | Lokalne katalogi główne; te same reguły wieloznaczne. |
| (nie dotyczy) | channels.imessage.remoteAttachmentRoots | Używane tylko wtedy, gdy remoteHost jest ustawione dla pobrań przez SCP. |
channels.bluebubbles.mediaMaxMb | channels.imessage.mediaMaxMb | Domyślnie 16 MB w iMessage (domyślną wartością BlueBubbles było 8 MB). Ustaw jawnie, jeśli chcesz zachować niższy limit. |
channels.bluebubbles.textChunkLimit | channels.imessage.textChunkLimit | Domyślnie 4000 w obu. |
channels.bluebubbles.coalesceSameSenderDms | channels.imessage.coalesceSameSenderDms | To samo ustawienie opt-in. Tylko DM — czaty grupowe zachowują natychmiastowe wysyłanie każdej wiadomości w obu kanałach. Po włączeniu bez jawnego messages.inbound.byChannel.imessage rozszerza domyślne opóźnienie wejściowe do 2500 ms. Zobacz dokumentację iMessage § Scalanie DM wysyłanych w częściach. |
channels.bluebubbles.enrichGroupParticipantsFromContacts | (nie dotyczy) | iMessage już odczytuje nazwy wyświetlane nadawców z chat.db. |
channels.bluebubbles.actions.* | channels.imessage.actions.* | Przełączniki per akcja: reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment. |
channels.bluebubbles.accounts.*) tłumaczą się jeden do jednego na channels.imessage.accounts.*.
Pułapka rejestru grup
Dołączony plugin iMessage uruchamia dwie oddzielne bramki listy dozwolonych grup jedna po drugiej. Obie muszą przejść, aby wiadomość grupowa dotarła do agenta:- Lista dozwolonych nadawców / celów czatu (
channels.imessage.groupAllowFrom) — sprawdzana przezisAllowedIMessageSender. Dopasowuje wiadomości przychodzące według uchwytu nadawcy,chat_guid,chat_identifieralbochat_id. Taki sam kształt jak w BlueBubbles. - Rejestr grup (
channels.imessage.groups) — sprawdzany przezresolveChannelGroupPolicyzinbound-processing.ts:199. PrzygroupPolicy: "allowlist"ta bramka wymaga jednego z poniższych:- wpisu wieloznacznego
groups: { "*": { ... } }(ustawiaallowAll = true), albo - jawnego wpisu per
chat_idwgroups.
- wpisu wieloznacznego
warn, więc nie jest to już ciche przy domyślnym poziomie logowania:
- Jednorazowy startowy
warnper konto, gdy ustawionogroupPolicy: "allowlist", alechannels.imessage.groupsjest puste (brak wieloznacznika"*", brak wpisów perchat_id) — wyzwalany przed nadejściem jakichkolwiek wiadomości. - Jednorazowy per
chat_idwarnprzy pierwszym odrzuceniu konkretnej grupy w czasie działania, wskazujący chat_id i dokładny klucz do dodania wgroups, aby ją dopuścić.
groupAllowFrom i groupPolicy, ale pomijają blok groups, ponieważ groups: { "*": { "requireMention": true } } w BlueBubbles wygląda jak niezwiązane ustawienie wzmianki. W rzeczywistości jest kluczowy dla bramki rejestru.
Minimalna konfiguracja potrzebna do utrzymania przepływu wiadomości grupowych po groupPolicy: "allowlist":
requireMention: true pod * jest nieszkodliwe, gdy nie skonfigurowano wzorców wzmianek: środowisko uruchomieniowe ustawia canDetectMention = false i pomija odrzucenie wzmianki w inbound-processing.ts:512. Gdy wzorce wzmianek są skonfigurowane (agents.list[].groupChat.mentionPatterns), działa to zgodnie z oczekiwaniami.
Jeśli logi Gateway zawierają imessage: dropping group message from chat_id=<id> albo wiersz startowy imessage: groupPolicy="allowlist" but channels.imessage.groups is empty, odrzuca bramka 2 — dodaj blok groups.
Krok po kroku
-
Dodaj blok iMessage obok istniejącego bloku BlueBubbles. Zachowaj stary blok tylko jako źródło do kopiowania, dopóki nowa ścieżka nie zostanie zweryfikowana:
-
Sonda dry-run — uruchom Gateway i potwierdź, że iMessage zgłasza dobry stan:
Ponieważ
imessage.enablednadal ma wartośćfalse, żaden przychodzący ruch iMessage nie jest jeszcze routowany — ale--probećwiczy most, dzięki czemu wykryjesz problemy z uprawnieniami lub instalacją przed przełączeniem. -
Przełącz. Usuń konfigurację BlueBubbles i włącz iMessage jedną edycją konfiguracji:
Uruchom ponownie Gateway. Przychodzący ruch iMessage przechodzi teraz przez dołączony Plugin.
- Zweryfikuj DM. Wyślij agentowi wiadomość bezpośrednią; potwierdź, że odpowiedź dotarła.
-
Zweryfikuj grupy osobno. DM i grupy używają różnych ścieżek kodu — powodzenie DM nie dowodzi, że grupy są routowane. Wyślij agentowi wiadomość w sparowanym czacie grupowym i potwierdź, że odpowiedź dotarła. Jeśli grupa milknie (brak odpowiedzi agenta, brak błędu), sprawdź log Gateway pod kątem
imessage: dropping group message from chat_id=<id>albo startowego wierszaimessage: groupPolicy="allowlist" but channels.imessage.groups is empty— oba pojawiają się na domyślnym poziomie logowania. Jeśli którykolwiek się pojawi, blokgroupsjest brakujący lub pusty — zobacz powyżej „Pułapka rejestru grup”. -
Zweryfikuj powierzchnię akcji — ze sparowanego DM poproś agenta o reakcję, edycję, cofnięcie wysłania, odpowiedź, wysłanie zdjęcia oraz (w grupie) zmianę nazwy grupy / dodanie lub usunięcie uczestnika. Każda akcja powinna natywnie pojawić się w Messages.app. Jeśli którakolwiek zgłasza „iMessage
<action>requires the imsg private API bridge”, uruchom ponownieimsg launchi odświeżchannels status --probe. -
Usuń serwer i konfigurację BlueBubbles, gdy DM, grupy i akcje iMessage zostaną zweryfikowane. OpenClaw nie będzie używać
channels.bluebubbles.
Szybki przegląd parytetu akcji
| Akcja | starsze BlueBubbles | dołączone iMessage |
|---|---|---|
| Wysyłanie tekstu / rezerwowy SMS | ✅ | ✅ |
| Wysyłanie multimediów (zdjęcie, wideo, plik, głos) | ✅ | ✅ |
Odpowiedź w wątku (reply_to_guid) | ✅ | ✅ (zamyka #51892) |
Tapback (react) | ✅ | ✅ |
| Edycja / cofnięcie wysłania (odbiorcy macOS 13+) | ✅ | ✅ |
| Wysyłanie z efektem ekranowym | ✅ | ✅ (zamyka część #9394) |
| Tekst sformatowany: pogrubienie / kursywa / podkreślenie / przekreślenie | ✅ | ✅ (formatowanie przebiegów typowanych przez attributedBody) |
| Zmiana nazwy grupy / ustawienie ikony grupy | ✅ | ✅ |
| Dodanie / usunięcie uczestnika, opuszczenie grupy | ✅ | ✅ |
| Potwierdzenia odczytu i wskaźnik pisania | ✅ | ✅ (bramkowane sondą prywatnego API) |
| Scalanie DM od tego samego nadawcy | ✅ | ✅ (tylko DM; opcjonalnie przez channels.imessage.coalesceSameSenderDms) |
| Nadrabianie przychodzących wiadomości odebranych, gdy Gateway był wyłączony | ✅ (powtórka Webhook + pobranie historii) | ✅ (opcjonalnie przez channels.imessage.catchup.enabled; zamyka #78649) |
channels.imessage.catchup.enabled ma wartość true, Gateway wykonuje jeden przebieg chats.list + messages.history dla każdego czatu wobec tego samego klienta JSON-RPC, którego używa imsg watch, odtwarza każdy pominięty przychodzący wiersz przez aktywną ścieżkę wysyłki (allowlisty, polityka grup, debouncer, cache echa) i utrwala kursor na konto, aby kolejne uruchomienia zaczynały od miejsca przerwania. Zobacz Nadrabianie po przestoju Gateway, aby dostroić tę funkcję.
Parowanie, sesje i powiązania ACP
- Zatwierdzenia parowania przenoszą się według uchwytu. Nie musisz ponownie zatwierdzać znanych nadawców —
channels.imessage.allowFromrozpoznaje te same ciągi+15555550123/user@example.com, których używało BlueBubbles. - Sesje pozostają ograniczone do agenta + czatu. DM zwijają się do głównej sesji agenta przy domyślnym
session.dmScope=main; sesje grup pozostają izolowane wedługchat_id. Klucze sesji różnią się (agent:<id>:imessage:group:<chat_id>względem odpowiednika BlueBubbles) — stara historia rozmów pod kluczami sesji BlueBubbles nie przechodzi do sesji iMessage. - Powiązania ACP odwołujące się do
match.channel: "bluebubbles"trzeba zaktualizować do"imessage". Kształtymatch.peer.id(chat_id:,chat_guid:,chat_identifier:, sam uchwyt) są identyczne.
Brak kanału wycofania
Nie ma obsługiwanego środowiska uruchomieniowego BlueBubbles, do którego można wrócić. Jeśli weryfikacja iMessage się nie powiedzie, ustawchannels.imessage.enabled: false, uruchom ponownie Gateway, napraw blokadę imsg i spróbuj ponownie przełączenia.
Cache odpowiedzi znajduje się w ~/.openclaw/state/imessage/reply-cache.jsonl (tryb 0600, katalog nadrzędny 0700). Możesz go bezpiecznie usunąć, jeśli chcesz zacząć od czystego stanu.
Powiązane
- iMessage — pełna dokumentacja kanału iMessage, w tym konfiguracja
imsg launchi wykrywanie możliwości. /channels/bluebubbles— starszy URL przekierowujący do tego przewodnika migracji.- Parowanie — uwierzytelnianie DM i przepływ parowania.
- Routing kanałów — jak Gateway wybiera kanał dla odpowiedzi wychodzących.