Mainstream messaging
Przejście z BlueBubbles
Usunięto obsługę BlueBubbles. OpenClaw obsługuje iMessage wyłącznie za pośrednictwem dołączonego pluginu 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.
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:bash brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg --versionimsg chats --limit 3W 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:
bash imsg chats --limit 10 --json | jq -simsg history --chat-id 42 --limit 10 --attachments --json | jq -simsg watch --chat-id 42 --reactions --jsonimsg send --chat-id 42 --text "Test OpenClaw imsg"imsg rpc --helpZastą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:
bash imsg launchimsg status --jsonPolecenie
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:bash openclaw channels status --probeKonto iMessage powinno zgłaszać stan
works; 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:
bash cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak
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.
| BlueBubbles | dołączony iMessage | Uwagi |
|---|---|---|
channels.bluebubbles.enabled |
channels.imessage.enabled |
Ta sama semantyka (domyślnie true, gdy blok już istnieje). |
channels.bluebubbles.serverUrl |
(usunięto) | Brak serwera REST — plugin uruchamia imsg rpc przez standardowe wejście i wyjście. |
channels.bluebubbles.password |
(usunięto) | Uwierzytelnianie Webhooka nie jest potrzebne. |
| (niejawne) | channels.imessage.cliPath |
Ścieżka do imsg (domyślnie imsg); w przypadku SSH użyj skryptu opakowującego. |
| (niejawne) | channels.imessage.dbPath |
Opcjonalne nadpisanie ścieżki do pliku chat.db aplikacji Messages.app; w razie pominięcia wykrywane automatycznie. |
| (niejawne) | channels.imessage.remoteHost |
host lub 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); domyślnie pairing. |
channels.bluebubbles.allowFrom |
channels.imessage.allowFrom |
Te same formaty identyfikatorów (+15555550123, user@example.com). Zatwierdzenia z magazynu parowania nie są przenoszone — zobacz poniżej. |
channels.bluebubbles.groupPolicy |
channels.imessage.groupPolicy |
Te same wartości (allowlist / open / disabled); domyślnie allowlist. |
channels.bluebubbles.groupAllowFrom |
channels.imessage.groupAllowFrom |
Tak samo. Jeśli nie ustawiono tej opcji, iMessage używa zastępczo allowFrom; jawnie puste groupAllowFrom: [] blokuje wszystkie grupy przy groupPolicy: "allowlist". |
channels.bluebubbles.groups |
channels.imessage.groups |
Skopiuj wpis symbolu wieloznacznego "*" bez zmian; zmień klucze wpisów poszczególnych grup na numeryczne wartości iMessage chat_id — zobacz „Pułapka rejestru grup”. Ustawienia requireMention, tools, toolsBySender i systemPrompt są przenoszone. |
channels.bluebubbles.sendReadReceipts |
channels.imessage.sendReadReceipts |
Domyślnie true. W dołączonym pluginie działa to tylko wtedy, gdy sonda prywatnego API jest aktywna. |
channels.bluebubbles.includeAttachments |
channels.imessage.includeAttachments |
Ten sam kształt i domyślnie wyłączone. Jeśli załączniki były przesyłane przez BlueBubbles, ustaw tę opcję jawnie — do tego czasu przychodzące zdjęcia i multimedia są po cichu odrzucane (bez wiersza Inbound message w dzienniku). |
channels.bluebubbles.attachmentRoots |
channels.imessage.attachmentRoots |
Lokalne katalogi główne; te same reguły symboli wieloznacznych. |
| (nie dotyczy) | channels.imessage.remoteAttachmentRoots |
Używane tylko wtedy, gdy ustawiono remoteHost do pobierania przez SCP. |
channels.bluebubbles.mediaMaxMb |
channels.imessage.mediaMaxMb |
Domyślnie 16 MB w iMessage (wartość domyślna BlueBubbles wynosiła 8 MB). Ustaw jawnie, aby zachować niższy limit. |
channels.bluebubbles.textChunkLimit |
channels.imessage.textChunkLimit |
Domyślnie 4000 w obu przypadkach. |
channels.bluebubbles.coalesceSameSenderDms |
channels.imessage.coalesceSameSenderDms |
Ta sama opcja wymagająca jawnego włączenia. Dotyczy tylko wiadomości prywatnych — grupy zachowują wysyłanie każdej wiadomości osobno. Zwiększa domyślne opóźnienie stabilizujące wiadomości przychodzące do 7000 ms, chyba że ustawiono messages.inbound.byChannel.imessage lub globalne messages.inbound.debounceMs. Zobacz Scalanie dzielonych wiadomości prywatnych. |
channels.bluebubbles.enrichGroupParticipantsFromContacts |
(nie dotyczy) | imsg już udostępnia nazwy wyświetlane nadawców z chat.db. |
channels.bluebubbles.actions.* |
channels.imessage.actions.* |
Te same przełączniki poszczególnych akcji (reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment) oraz nowe polls. Wszystkie są domyślnie włączone; akcje prywatnego API nadal wymagają mostu. |
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
Pułapka migracji: BlueBubbles używał jako kluczy wpisów 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ć.
Wiadomości prywatne działają w obu przypadkach — korzystają z innej ścieżki kodu, więc ich poprawne działanie nie potwierdza prawidłowego kierowania wiadomości grupowych.
Minimalna konfiguracja ograniczona do nadawców z groupPolicy: "allowlist":
{ channels: { imessage: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123", "chat_guid:any;-;..."], }, },}Pozwala ona skonfigurowanym nadawcom pisać w dowolnej grupie. Dodaj wpisy 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:json5 { channels: { imessage: { enabled: false, // zmień na true, gdy wszystko będzie gotowe do przełączenia cliPath: "/opt/homebrew/bin/imsg", dmPolicy: "pairing", allowFrom: ["+15555550123"], // skopiuj z bluebubbles.allowFrom groupPolicy: "allowlist", groupAllowFrom: [], // skopiuj z bluebubbles.groupAllowFrom groups: { "*": { requireMention: true } }, // symbol wieloznaczny skopiuj bez zmian; wpisom poszczególnych czatów nadaj klucze według chat_id // działania są domyślnie włączone; ustaw poszczególne przełączniki na false, aby je wyłączyć }, },} -
Przełącz i wykonaj test. Ustaw
channels.imessage.enabled: true, uruchom ponownie Gateway i potwierdź, że kanał zgłasza prawidłowy stan:bash openclaw gateway restartopenclaw channels status --probe --channel imessage # oczekiwane "works"; --json pokazuje privateApi.available: trueTest 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ń
| Działanie | starsze BlueBubbles | wbudowane iMessage |
|---|---|---|
| Wysyłanie tekstu / awaryjne użycie SMS | ✅ | ✅ |
| Wysyłanie multimediów (zdjęcie, film, plik, głos) | ✅ | ✅ |
Odpowiedź w wątku (reply_to_guid) |
✅ | ✅ (rozwiązuje #51892) |
Reakcja Tapback (react) |
✅ | ✅ |
| Edycja / cofnięcie wysłania (odbiorcy z macOS 13+) | ✅ | ✅ |
| Wysyłanie z efektem ekranowym | ✅ | ✅ (częściowo rozwiązuje #9394) |
| Tekst sformatowany: pogrubienie / kursywa / podkreślenie / przekreślenie | ✅ | ✅ (formatowanie typowanych fragmentów przez attributedBody) |
| Natywne ankiety Messages (tworzenie i głosowanie) | ❌ | ✅ (actions.polls; odbiorcy potrzebują iOS/macOS 26+ do natywnego wyświetlania) |
| Zmiana nazwy grupy / ustawienie ikony grupy | ✅ | ✅ |
| Dodawanie / usuwanie uczestnika, opuszczanie grupy | ✅ | ✅ |
| Potwierdzenia odczytu i wskaźnik pisania | ✅ | ✅ (zależne od testu prywatnego API) |
| Scalanie wiadomości prywatnych od tego samego nadawcy | ✅ | ✅ (tylko wiadomości prywatne; opcjonalnie przez channels.imessage.coalesceSameSenderDms) |
| Odzyskiwanie wiadomości przychodzących po ponownym uruchomieniu | ✅ | ✅ (automatycznie: odtwarzanie since_rowid + deduplikacja GUID; szersze okno lokalnie) |
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, ustaw channels.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.