imessage, który steruje steipete/imsg przez JSON-RPC i zapewnia dostęp do tego samego zakresu prywatnego API co BlueBubbles (react, edit, unsend, reply, sendWithEffect, natywne ankiety, zarządzanie grupami, załączniki). Jeden plik wykonywalny CLI zastępuje serwer BlueBubbles, aplikację kliencką i obsługę webhooków: bez punktu końcowego REST i bez uwierzytelniania webhooków.
Ten przewodnik opisuje migrację starych konfiguracji channels.bluebubbles do channels.imessage. Nie istnieje żadna inna obsługiwana ścieżka migracji. W bieżącej wersji OpenClaw pozostawiony blok channels.bluebubbles jest nieaktywny — żaden komponent środowiska uruchomieniowego go nie odczytuje.
Krótkie ogłoszenie i podsumowanie dla operatorów zawiera strona Usunięcie BlueBubbles i obsługa iMessage przez imsg.
Lista kontrolna migracji
Najkrótsza bezpieczna procedura, jeśli znasz już swoją starą konfigurację BlueBubbles:- Zweryfikuj działanie
imsgbezpośrednio na Macu, na którym działa Messages.app (imsg chats,imsg history,imsg send,imsg rpc --help). - Skopiuj klucze zachowania z
channels.bluebubblesdochannels.imessage:dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,includeAttachments,attachmentRoots,mediaMaxMb,textChunkLimit,coalesceSameSenderDmsorazactions. - Usuń nieistniejące już klucze transportu:
serverUrl,password, adresy URL webhooków oraz konfigurację serwera BlueBubbles. - Jeśli Gateway nie działa na Macu z aplikacją Messages, ustaw
channels.imessage.cliPathna wrapper SSH, aremoteHostna potrzeby zdalnego pobierania załączników. - Włącz
channels.imessage, uruchom ponownie Gateway, a następnie wykonajopenclaw channels status --probe --channel imessage. - Przetestuj jedną wiadomość bezpośrednią, jedną dozwoloną grupę, załączniki, jeśli są włączone, oraz każdą akcję prywatnego API, której agent ma używać.
- Po zweryfikowaniu ścieżki iMessage usuń serwer BlueBubbles i starą konfigurację
channels.bluebubbles.
Działanie imsg
imsg to lokalne narzędzie CLI dla systemu macOS obsługujące aplikację Messages. OpenClaw uruchamia imsg rpc jako proces potomny i komunikuje się z nim przez JSON-RPC za pośrednictwem standardowego wejścia i wyjścia. Nie ma serwera HTTP, adresu URL webhooka, demona działającego w tle, agenta uruchomieniowego ani portu, który trzeba udostępnić.
- Odczyt odbywa się z
~/Library/Messages/chat.dbza pomocą połączenia SQLite tylko do odczytu. - Wiadomości przychodzące na żywo pochodzą z
imsg watch/watch.subscribe, które śledzi zdarzenia systemu plików dotyczącechat.db, z mechanizmem rezerwowego cyklicznego odpytywania. - Wysyłanie zwykłego tekstu i plików korzysta z automatyzacji Messages.app.
- Zaawansowane akcje wykorzystują
imsg launchdo wstrzyknięcia pomocnikaimsgdo Messages.app. Umożliwia to potwierdzenia odczytu, wskaźniki pisania, wysyłanie treści rozszerzonych, edycję, cofanie wysłania, odpowiedzi w wątkach, reakcje Tapback, ankiety oraz zarządzanie grupami. - Kompilacje dla systemu Linux mogą analizować skopiowany plik
chat.db, ale nie mogą wysyłać wiadomości, obserwować aktywnej bazy danych Maca ani sterować Messages.app. Aby korzystać z iMessage w OpenClaw, uruchomimsgna zalogowanym Macu lub za pośrednictwem wrappera SSH prowadzącego do tego Maca.
Zanim rozpoczniesz
-
Zainstaluj
imsgna Macu, na którym działa Messages.app:W typowej konfiguracji lokalnej kreator konfiguracji OpenClaw może, po potwierdzeniu przez użytkownika, zainstalować lub zaktualizowaćimsgprzez Homebrew na Macu zalogowanym do Messages. Konfiguracjami ręcznymi i topologiami z wrapperem SSH nadal zarządza operator: powtórz aktualizację przez Homebrew w tym samym lokalnym lub zdalnym kontekście użytkownika, w którym będzie uruchamianeimsg. Jeśliimsg chatskończy się błędemunable to open database file, zwraca pusty wynik albo błądauthorization denied, przyznaj pełny dostęp do dysku terminalowi, edytorowi, procesowi Node, usłudze Gateway lub nadrzędnemu procesowi SSH, który uruchamiaimsg, a następnie ponownie uruchom ten proces nadrzędny. -
Przed zmianą konfiguracji OpenClaw zweryfikuj odczyt, obserwowanie, wysyłanie i interfejs RPC:
Zastąp
42rzeczywistym identyfikatorem czatu zimsg chats. Wysyłanie wymaga uprawnienia do automatyzacji Messages.app. Jeśli OpenClaw będzie działać przez SSH, wykonaj te polecenia za pośrednictwem tego samego wrappera SSH lub w tym samym kontekście użytkownika, którego będzie używać OpenClaw. Jeśli odczyt działa, ale wysyłanie kończy się błędem AppleEvents-1743, sprawdź, czy uprawnienie do automatyzacji zostało przyznane procesowi/usr/libexec/sshd-keygen-wrapper; zobacz Wysyłanie przez wrapper SSH kończy się błędem AppleEvents -1743. -
Włącz most prywatnego API. Jest on zdecydowanie zalecany dla iMessage w OpenClaw, ponieważ zależą od niego odpowiedzi, reakcje Tapback, efekty, ankiety, odpowiedzi z załącznikami i akcje grupowe:
Polecenie
imsg launchwymaga wyłączenia SIP (a we współczesnych wersjach macOS także złagodzenia weryfikacji bibliotek — zobacz Włączanie prywatnego API imsg). Podstawowe wysyłanie, historia i obserwowanie działają bezimsg launch; pełny zestaw akcji iMessage w OpenClaw nie działa. -
Po włączeniu
channels.imessagei uruchomieniu Gateway zweryfikuj most za pośrednictwem OpenClaw:Konto iMessage powinno zgłaszać stanworks; z opcją--jsondane sondy zawierająprivateApi.available: true. Jeśli wartość wynosifalse, najpierw napraw ten problem — zobacz Wykrywanie możliwości. Sondowanie wymaga osiągalnego Gateway (w przeciwnym razie CLI zwraca wyłącznie dane z konfiguracji) i obejmuje tylko skonfigurowane, włączone konta. -
Utwórz kopię konfiguracji:
Przeniesienie konfiguracji
iMessage i BlueBubbles współdzielą większość kluczy zachowania na poziomie kanału. Zmienia się transport (serwer REST zamiast lokalnego CLI) oraz format kluczy rejestru grup.
Konfiguracje wielu kont (
channels.bluebubbles.accounts.*) przekładają się jeden do jednego na channels.imessage.accounts.*.
Pułapka rejestru grup
Dołączony plugin iMessage stosuje kolejno dwie bramy grup. Wiadomość grupowa musi przejść przez obie, aby dotrzeć do agenta:- Lista dozwolonych nadawców / celów czatu (
channels.imessage.groupAllowFrom) — dopasowuje identyfikator nadawcy lub cel czatu (wpisychat_id:,chat_guid:,chat_identifier:). JeśligroupAllowFromnie jest ustawione, ta brama używa zastępczoallowFrom; jawnegroupAllowFrom: []wyłącza ten mechanizm zastępczy i odrzuca każdą wiadomość grupową przygroupPolicy: "allowlist". - Rejestr grup (
channels.imessage.groups) — z kluczami będącymi numerycznymi wartościami iMessagechat_id:- Brak bloku
groups(lub pusty blok): grupy przechodzą przez tę bramę, o ile brama 1 ma niepustą efektywną listę dozwolonych nadawców; filtrowanie nadawców kontroluje dostęp i nie pojawia się ostrzeżenie startowe o odrzucaniu wszystkich wiadomości. groupsz wpisami, ale bez"*": przechodzą tylko wymienione kluczechat_id. Dodanie dowolnej grupy zmienia rejestr w listę dozwolonych nawet przygroupPolicy: "open".groups: { "*": { ... } }: każda grupa przechodzi przez tę bramę.
- Brak bloku
groups identyfikatorów GUID czatu lub identyfikatorów czatu, natomiast rejestr iMessage używa numerycznych wartości chat_id. Wpisy poszczególnych grup skopiowane bez zmian tworzą niepusty rejestr, którego klucze nigdy nie pasują, dlatego każda wiadomość grupowa jest odrzucana przez bramę 2. Skopiuj symbol wieloznaczny "*" bez zmian; zmień klucze wpisów konkretnych grup, używając wartości chat_id z polecenia imsg chats.
Obie ścieżki odrzucania są widoczne przy domyślnym poziomie rejestrowania jako wiersze warn:
- Raz dla każdego konta podczas uruchamiania, gdy ustawiono
groupPolicy: "allowlist", a efektywna lista dozwolonych nadawców grupowych jest pusta:imessage: groupPolicy="allowlist" for account "<id>" but no group sender allowlist is configured .... UstawgroupAllowFrom(luballowFrom), aby dopuścić nadawców; samo dodaniegroupsnie spełnia wymagań bramy nadawców. - Raz dla każdego
chat_idpodczas działania, gdy rejestr odrzuca grupę:imessage: dropping group message from chat_id=<id> ... not in channels.imessage.groups allowlist, ze wskazaniem dokładnego klucza, który należy dodać.
groupPolicy: "allowlist":
groups, aby ograniczyć dozwolone czaty lub ustawić opcje poszczególnych czatów, takie jak requireMention; skopiuj wpis "*" z BlueBubbles bez zmian, lecz zmień klucze konkretnych wpisów na numeryczne wartości iMessage chat_id.
Krok po kroku
-
Przenieś konfigurację. Podczas edycji pozostaw nowy blok wyłączony; stary blok
channels.bluebubblesjest ignorowany przez bieżącą wersję OpenClaw i może pozostać obok jako punkt odniesienia: -
Przełącz i wykonaj test. Ustaw
channels.imessage.enabled: true, uruchom ponownie Gateway i potwierdź, że kanał zgłasza prawidłowy stan:Test wymaga dostępnego Gateway i sprawdza tylko skonfigurowane, włączone konta. Użyj bezpośrednich poleceńimsgz sekcji Zanim zaczniesz, aby sprawdzić samego Maca. - Sprawdź wiadomości prywatne. Wyślij agentowi wiadomość prywatną i potwierdź, że odpowiedź dotarła.
-
Sprawdź grupy osobno. Wiadomości prywatne i grupowe korzystają z różnych ścieżek kodu — powodzenie wiadomości prywatnych nie dowodzi, że routing grup działa. Wyślij wiadomość na dozwolonym czacie grupowym i potwierdź, że odpowiedź dotarła. Jeśli grupa zamilknie (brak odpowiedzi agenta i brak błędu), sprawdź dziennik Gateway pod kątem dwóch wierszy
warnz opisanej wyżej sekcji „Pułapka rejestru grup”. Ostrzeżenie podczas uruchamiania oznacza, że efektywna lista dozwolonych nadawców jest pusta; ostrzeżenie dla konkretnegochat_idoznacza, że wypełniony rejestrgroupsnie zawiera tego czatu. -
Sprawdź dostępne działania. W sparowanej wiadomości prywatnej poproś agenta o dodanie reakcji, edycję, cofnięcie wysłania, odpowiedź, wysłanie zdjęcia oraz — w grupie — zmianę nazwy grupy lub dodanie bądź usunięcie uczestnika. Każde działanie powinno zostać wykonane natywnie w Messages.app. Jeśli którekolwiek działanie zgłosi
iMessage <action> requires the imsg private API bridge, ponownie uruchomimsg launchi odśwież stan za pomocąopenclaw channels status --probe. -
Usuń serwer BlueBubbles i blok
channels.bluebubbles, gdy wiadomości prywatne, grupy i działania iMessage zostaną zweryfikowane. OpenClaw nie odczytujechannels.bluebubbles.
Skrócone porównanie obsługiwanych działań
iMessage odzyskuje wiadomości pominięte podczas niedostępności Gateway: podczas uruchamiania odtwarza wiadomości od ostatniego przekazanego identyfikatora wiersza za pomocą
imsg watch.subscribe i since_rowid, deduplikuje je według GUID, a ograniczenie wieku nieaktualnego bufora zapobiega „bombardowaniu zaległościami” podczas opróżniania Push. Odbywa się to przez połączenie RPC imsg, więc działa również w zdalnych konfiguracjach SSH cliPath; konfiguracje lokalne mają szersze okno odzyskiwania, ponieważ mogą odczytywać chat.db. Zobacz Odzyskiwanie wiadomości przychodzących po ponownym uruchomieniu mostu lub Gateway.
Parowanie, sesje i powiązania ACP
- Listy dozwolonych są przenoszone według identyfikatora.
channels.imessage.allowFromrozpoznaje te same ciągi+15555550123/user@example.com, których używało BlueBubbles — skopiuj je bez zmian. - Zatwierdzenia z magazynu parowania nie są przenoszone. Magazyn parowania jest osobny dla każdego kanału i nic nie przenosi starego magazynu BlueBubbles. Nadawcy zatwierdzeni wyłącznie przez parowanie muszą ponownie sparować się w iMessage albo musisz dodać ich identyfikatory do
allowFrom. - Sesje pozostają ograniczone do agenta i czatu. Wiadomości prywatne są scalane z główną sesją agenta przy domyślnym ustawieniu
session.dmScope=main; sesje grupowe pozostają odizolowane dla każdegochat_id(agent:<agentId>:imessage:group:<chat_id>). Stara historia rozmów zapisana pod kluczami sesji BlueBubbles nie jest przenoszona do sesji iMessage. - Powiązania ACP odwołujące się do
match.channel: "bluebubbles"trzeba zmienić na"imessage". Postaciematch.peer.id(chat_id:,chat_guid:,chat_identifier:, sam identyfikator) są identyczne.
Brak kanału wycofania zmian
Nie istnieje obsługiwane środowisko wykonawcze BlueBubbles, do którego można się przełączyć z powrotem. Jeśli weryfikacja iMessage zakończy się niepowodzeniem, ustawchannels.imessage.enabled: false, uruchom ponownie Gateway, usuń przeszkodę dotyczącą imsg i ponów przełączenie.
Pamięć podręczna odpowiedzi znajduje się w stanie Pluginu w SQLite. Polecenie openclaw doctor --fix importuje i archiwizuje stary plik pomocniczy imessage/reply-cache.jsonl, jeśli jest obecny.
Powiązane
- Usunięcie BlueBubbles i ścieżka iMessage oparta na imsg — krótkie ogłoszenie i podsumowanie dla operatora.
- iMessage — pełna dokumentacja kanału iMessage, w tym konfiguracja
imsg launchi wykrywanie możliwości. /channels/bluebubbles— starszy adres URL przekierowujący do tego przewodnika migracji.- Parowanie — uwierzytelnianie wiadomości prywatnych i proces parowania.
- Routing kanałów — sposób, w jaki Gateway wybiera kanał dla odpowiedzi wychodzących.