imsg na tym samym hoście macOS zalogowanym do Wiadomości. Jeśli Gateway działa gdzie indziej, ustaw channels.imessage.cliPath tak, aby wskazywał przezroczysty wrapper SSH uruchamiający imsg na Macu.Odzyskiwanie wiadomości przychodzących jest automatyczne. Po ponownym uruchomieniu mostu lub Gateway iMessage odtwarza wiadomości pominięte podczas przerwy w działaniu i pomija nieaktualną „bombę zaległości”, którą Apple może wysłać po odzyskaniu połączenia Push, usuwając duplikaty, aby żadna wiadomość nie została przekazana dwukrotnie. Nie ma konfiguracji, która to włącza — zobacz Odzyskiwanie wiadomości przychodzących po ponownym uruchomieniu mostu lub Gateway.imsg rpc i komunikuje się przez JSON-RPC za pośrednictwem standardowego wejścia i wyjścia — bez osobnego demona ani portu. Tryb prywatnego API jest zdecydowanie zalecany do uzyskania pełnej funkcjonalności kanału iMessage; odpowiedzi, reakcje Tapback, efekty, ankiety, odpowiedzi na załączniki i działania grupowe wymagają imsg launch oraz pomyślnego sprawdzenia prywatnego API.
W typowej konfiguracji lokalnej instalator OpenClaw może zaproponować potwierdzoną przez użytkownika instalację lub aktualizację imsg przez Homebrew na Macu zalogowanym do Wiadomości. Konfiguracja ręczna i topologie z wrapperem SSH pozostają zarządzane przez operatora: zainstaluj lub zaktualizuj imsg w tym samym kontekście użytkownika, w którym będzie działać Gateway lub wrapper.
Działania prywatnego API
Parowanie
Zdalny Mac
Dokumentacja konfiguracji
Szybka konfiguracja
- Lokalny Mac (szybka ścieżka)
- Zdalny Mac przez SSH
Zainstaluj i zweryfikuj imsg
imsg, może zaproponować instalację steipete/tap/imsg przez Homebrew. Jeśli wykryje imsg zarządzany przez Homebrew, może zaproponować jego ponowną instalację lub aktualizację. Niestandardowe wrappery cliPath nie są modyfikowane.Skonfiguruj OpenClaw
Uruchom Gateway
Zatwierdź pierwsze parowanie wiadomości prywatnej (domyślna zasada dmPolicy)
Wymagania i uprawnienia (macOS)
- Na Macu, na którym działa
imsg, użytkownik musi być zalogowany do Wiadomości. - Kontekst procesu uruchamiającego OpenClaw/
imsgwymaga pełnego dostępu do dysku (dostęp do bazy danych Wiadomości). - Wysyłanie wiadomości przez Messages.app wymaga uprawnienia do automatyzacji.
- W przypadku zaawansowanych działań (reakcja / edycja / cofnięcie wysłania / odpowiedź w wątku / efekty / ankiety / operacje grupowe) ochrona integralności systemu musi być wyłączona — zobacz Włączanie prywatnego API imsg. Podstawowe wysyłanie i odbieranie tekstu oraz multimediów działa bez jej wyłączania.
Wysyłanie przez wrapper SSH kończy się błędem AppleEvents -1743
Wysyłanie przez wrapper SSH kończy się błędem AppleEvents -1743
channels status --probe i przetwarzać wiadomości przychodzące, podczas gdy wysyłanie wiadomości nadal kończy się błędem autoryzacji AppleEvents:/usr/libexec/sshd-keygen-wrapper, a nie dla procesu imsg lub lokalnej powłoki, macOS może nie udostępnić użytecznego przełącznika Wiadomości dla tego klienta po stronie serwera SSH:tccutil reset AppleEvents lub ponowne uruchamianie imsg send przez ten sam wrapper SSH może nadal kończyć się niepowodzeniem, ponieważ kontekstem procesu wymagającym automatyzacji Wiadomości jest wrapper SSH, a nie aplikacja, której interfejs może przyznać uprawnienie.Zamiast tego użyj jednego z obsługiwanych kontekstów procesu imsg:- Uruchom Gateway lub przynajmniej most
imsgw lokalnej sesji użytkownika zalogowanego do Wiadomości. - Uruchom Gateway za pomocą LaunchAgent dla tego użytkownika po przyznaniu pełnego dostępu do dysku i automatyzacji w tej samej sesji.
- Jeśli zachowujesz topologię SSH z dwoma użytkownikami, przed włączeniem kanału sprawdź, czy rzeczywiste wychodzące polecenie
imsg senddziała przez dokładnie ten wrapper. Jeśli nie można przyznać mu automatyzacji, zamiast polegać na wrapperze SSH do wysyłania, zmień konfigurację naimsgz jednym użytkownikiem.
Włączanie prywatnego API imsg
imsg jest dostępny w dwóch trybach działania. W przypadku OpenClaw zalecaną konfiguracją jest tryb prywatnego API, ponieważ udostępnia on kanałowi natywne działania iMessage oczekiwane przez użytkowników. Tryb podstawowy pozostaje przydatny w instalacjach o niskim poziomie ryzyka, do wstępnej weryfikacji lub na hostach, na których nie można wyłączyć SIP.
- Tryb podstawowy (domyślny, nie wymaga zmian SIP): wychodzący tekst i multimedia przez
send, obserwowanie i historia wiadomości przychodzących oraz lista czatów. Te funkcje są dostępne od razu po świeżej instalacjibrew install steipete/tap/imsgi przyznaniu opisanych powyżej standardowych uprawnień systemu macOS. - Tryb prywatnego API:
imsgwstrzykuje pomocniczą bibliotekę dylib doMessages.app, aby wywoływać wewnętrzne funkcjeIMCore. Odblokowuje toreact,edit,unsend,reply(w wątku),sendWithEffect,pollipoll-vote(natywne ankiety Wiadomości),renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroup, a także wskaźniki pisania i potwierdzenia odczytu.
imsg jasno określa to wymaganie:
Funkcje zaawansowane, takie jakTechnika wstrzykiwania pomocnika wykorzystuje własną bibliotekę dylibread,typing,launch, rozbudowane wysyłanie obsługiwane przez most, modyfikowanie wiadomości i zarządzanie czatami, są opcjonalne. Wymagają wyłączenia SIP i wstrzyknięcia pomocniczej biblioteki dylib doMessages.app.imsg launchodmawia wstrzyknięcia, gdy SIP jest włączona.
imsg do uzyskania dostępu do prywatnych interfejsów API Wiadomości. Ścieżka iMessage w OpenClaw nie korzysta z serwera innej firmy ani środowiska wykonawczego BlueBubbles.
Konfiguracja
-
Zainstaluj (lub uaktualnij)
imsgna Macu, na którym działa Messages.app:Dane wyjścioweimsg status --jsonzawierająbridge_version,rpc_methodsorazselectorsdla poszczególnych metod, dzięki czemu przed rozpoczęciem można sprawdzić, co obsługuje bieżąca kompilacja. -
Wyłącz System Integrity Protection oraz (we współczesnych wersjach macOS) Library Validation. Wstrzyknięcie pomocniczej biblioteki dylib firmy innej niż Apple do podpisanego przez Apple procesu
Messages.appwymaga wyłączenia SIP oraz złagodzenia weryfikacji bibliotek. Krok dotyczący SIP w trybie odzyskiwania zależy od wersji macOS:- macOS 10.13–10.15 (Sierra–Catalina): wyłącz Library Validation za pomocą Terminala, uruchom ponownie komputer w trybie odzyskiwania, wykonaj
csrutil disable, a następnie ponownie uruchom komputer. - macOS 11+ (Big Sur i nowsze), Intel: przejdź do trybu odzyskiwania (lub odzyskiwania przez Internet), wykonaj
csrutil disable, a następnie ponownie uruchom komputer. - macOS 11+, Apple Silicon: użyj sekwencji uruchamiania przyciskiem zasilania, aby przejść do trybu odzyskiwania; w najnowszych wersjach macOS przytrzymaj klawisz Left Shift podczas klikania Continue, a następnie wykonaj
csrutil disable. Konfiguracje maszyn wirtualnych wymagają osobnej procedury, dlatego najpierw utwórz migawkę maszyny wirtualnej.
csrutil disablezwykle nie wystarcza. Apple nadal wymusza weryfikację bibliotek dlaMessages.appjako pliku binarnego platformy, dlatego pomocniczy komponent podpisany ad hoc zostaje odrzucony (Library Validation failed: ... platform binary, but mapped file is not) nawet przy wyłączonym SIP. Po wyłączeniu SIP wyłącz również weryfikację bibliotek i ponownie uruchom komputer:macOS 26 (Tahoe), zweryfikowano w wersji 26.5.1: wyłączony SIP wraz z powyższym poleceniemDisableLibraryValidationwystarcza do wstrzyknięcia komponentu pomocniczego we wszystkich wersjach od 26.0 do 26.5.x. Żadne argumenty rozruchowe nie są wymagane. Plik plist jest czynnikiem decydującym i najczęściej pomijanym krokiem, gdy wstrzykiwanie w Tahoe kończy się niepowodzeniem:- Z plikiem plist:
imsg launchwykonuje wstrzyknięcie, aimsg statuszgłaszaadvanced_features: true. - Bez pliku plist (nawet przy wyłączonym SIP):
imsg launchkończy się niepowodzeniem z komunikatemFailed to launch: Timeout waiting for Messages.app to initialize. AMFI odrzuca podczas ładowania komponent pomocniczy podpisany ad hoc, przez co most nigdy nie osiąga gotowości, a uruchamianie przekracza limit czasu. To przekroczenie limitu czasu jest objawem, z którym większość osób spotyka się w Tahoe; rozwiązaniem jest powyższy plik plist, a nie bardziej drastyczne działania.
imsg launchlub określoneselectorszaczynają zwracać wartość false, zwykle przyczyną jest ta blokada. Zanim uznasz, że sam krok dotyczący SIP się nie powiódł, sprawdź stan SIP i weryfikacji bibliotek. Jeśli te ustawienia są prawidłowe, ale most nadal nie może wykonać wstrzyknięcia, zbierzimsg status --jsonwraz z wynikiemimsg launchi zgłoś problem w projekcieimsgzamiast osłabiać dodatkowe zabezpieczenia całego systemu. - macOS 10.13–10.15 (Sierra–Catalina): wyłącz Library Validation za pomocą Terminala, uruchom ponownie komputer w trybie odzyskiwania, wykonaj
-
Wstrzyknij komponent pomocniczy. Po wyłączeniu SIP i zalogowaniu się w Messages.app:
imsg launchodmawia wykonania wstrzyknięcia, jeśli SIP jest nadal włączony, więc służy to również jako potwierdzenie wykonania kroku 2. -
Zweryfikuj most z poziomu OpenClaw:
Wpis iMessage powinien zgłaszać
works, aimsg status --json | jq '{rpc_methods, selectors}'powinien przedstawiać możliwości udostępniane przez używaną kompilację macOS. Tworzenie ankiet wymagaselectors.pollPayloadMessage; głosowanie wymaga zarównoselectors.pollVoteMessage, jak i metody RPCpoll.vote. Plugin OpenClaw udostępnia tylko działania obsługiwane przez wynik sondowania zapisany w pamięci podręcznej, natomiast przy pustej pamięci podręcznej zachowuje optymistyczne założenia i wykonuje sondowanie przy pierwszym wysłaniu.
openclaw channels status --probe zgłasza kanał jako works, ale określone działania podczas wysyłania zgłaszają błąd „iMessage <action> requires the imsg private API bridge”, ponownie uruchom imsg launch — komponent pomocniczy może przestać działać (po ponownym uruchomieniu Messages.app, aktualizacji systemu operacyjnego itp.), a zapisany w pamięci podręcznej stan available: true będzie nadal udostępniać działania do czasu odświeżenia go przez kolejne sondowanie.
Gdy SIP pozostaje włączony
Jeśli wyłączenie SIP jest nieakceptowalne w danym modelu zagrożeń:imsgprzechodzi do trybu podstawowego — obsługuje tylko tekst, multimedia i odbieranie.- Plugin OpenClaw nadal udostępnia wysyłanie tekstu i multimediów oraz monitorowanie wiadomości przychodzących; ukrywa
react,edit,unsend,reply,sendWithEffecti operacje grupowe z powierzchni działań (zgodnie z blokadą możliwości poszczególnych metod). - Można użyć osobnego komputera Mac bez Apple Silicon (lub dedykowanego komputera Mac dla bota) z wyłączonym SIP do obsługi obciążenia iMessage, pozostawiając SIP włączony na urządzeniach głównych. Zobacz poniżej sekcję Dedykowany użytkownik macOS dla bota (osobna tożsamość iMessage).
Kontrola dostępu i trasowanie
- Zasady wiadomości bezpośrednich
- Zasady grup i wzmianki
- Sesje i deterministyczne odpowiedzi
channels.imessage.dmPolicy steruje wiadomościami bezpośrednimi:pairing(domyślnie)allowlist(wymaga co najmniej jednego wpisuallowFrom)open(wymaga, abyallowFromzawierało"*")disabled
channels.imessage.allowFrom.Wpisy listy dozwolonych muszą identyfikować nadawców: uchwyty lub statyczne grupy dostępu nadawców (accessGroup:<name>). Użyj channels.imessage.groupAllowFrom dla celów czatów, takich jak chat_id:*, chat_guid:* lub chat_identifier:*; użyj channels.imessage.groups dla numerycznych kluczy rejestru chat_id.Powiązania konwersacji ACP
Czaty iMessage można powiązać z sesjami ACP. Szybka procedura operatora:- Uruchom
/acp spawn codex --bind herew wiadomości bezpośredniej lub dozwolonym czacie grupowym. - Przyszłe wiadomości w tej samej konwersacji iMessage są kierowane do utworzonej sesji ACP.
/newi/resetresetują tę samą powiązaną sesję ACP bez jej zastępowania./acp closezamyka sesję ACP i usuwa powiązanie.
bindings[] najwyższego poziomu z type: "acp" i match.channel: "imessage".
match.peer.id może używać:
- znormalizowanego uchwytu wiadomości bezpośredniej, takiego jak
+15555550123lubuser@example.com chat_id:<id>(zalecane dla stabilnych powiązań grupowych)chat_guid:<guid>chat_identifier:<identifier>
Wzorce wdrażania
Dedykowany użytkownik macOS dla bota (osobna tożsamość iMessage)
Dedykowany użytkownik macOS dla bota (osobna tożsamość iMessage)
- Utwórz dedykowanego użytkownika systemu macOS lub zaloguj się na jego konto.
- W ramach tego konta użytkownika zaloguj się w Wiadomościach przy użyciu Apple ID bota.
- Zainstaluj
imsgw ramach tego konta użytkownika. - Utwórz skrypt opakowujący SSH, aby OpenClaw mógł uruchamiać
imsgw kontekście tego użytkownika. - Skieruj
channels.imessage.accounts.<id>.cliPathi.dbPathdo profilu tego użytkownika.
Zdalny Mac przez Tailscale (przykład)
Zdalny Mac przez Tailscale (przykład)
- Gateway działa w systemie Linux/na maszynie wirtualnej
- iMessage i
imsgdziałają na Macu w sieci tailnet - skrypt opakowujący
cliPathużywa SSH do uruchamianiaimsg remoteHostumożliwia pobieranie załączników przez SCP
ssh bot@mac-mini.tailnet-1234.ts.net), aby plik known_hosts został uzupełniony.Wzorzec wielu kont
Wzorzec wielu kont
channels.imessage.accounts.Każde konto może nadpisywać pola takie jak cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, ustawienia historii oraz listy dozwolonych katalogów głównych załączników.Historia wiadomości bezpośrednich
Historia wiadomości bezpośrednich
channels.imessage.dmHistoryLimit, aby inicjować nowe sesje wiadomości bezpośrednich ostatnią zdekodowaną historią imsg danej rozmowy. Użyj channels.imessage.dms["<sender>"].historyLimit do określenia nadpisań dla poszczególnych nadawców, w tym 0, aby wyłączyć historię dla danego nadawcy.Historia wiadomości bezpośrednich iMessage jest pobierana na żądanie z imsg. Pozostawienie dmHistoryLimit bez ustawionej wartości wyłącza globalne inicjowanie historii wiadomości bezpośrednich, ale dodatnia wartość channels.imessage.dms["<sender>"].historyLimit dla konkretnego nadawcy nadal włącza inicjowanie historii dla tego nadawcy.Multimedia, dzielenie na fragmenty i cele dostarczania
Załączniki i multimedia
Załączniki i multimedia
- odbieranie przychodzących załączników jest domyślnie wyłączone — ustaw
channels.imessage.includeAttachments: true, aby przekazywać agentowi zdjęcia, notatki głosowe, filmy i inne załączniki. Gdy ta opcja jest wyłączona, wiadomości iMessage zawierające wyłącznie załączniki są odrzucane przed dotarciem do agenta i mogą w ogóle nie generować wpisuInbound messagew dzienniku. - zdalne ścieżki załączników można pobierać przez SCP, gdy ustawiono
remoteHost - ścieżki załączników muszą odpowiadać dozwolonym katalogom głównym:
channels.imessage.attachmentRoots(lokalnie)channels.imessage.remoteAttachmentRoots(zdalny tryb SCP)- skonfigurowane katalogi główne rozszerzają domyślny wzorzec katalogu głównego
/Users/*/Library/Messages/Attachments(są łączone, a nie zastępowane)
- SCP używa ścisłego sprawdzania klucza hosta (
StrictHostKeyChecking=yes) - rozmiar wychodzących multimediów jest określany przez
channels.imessage.mediaMaxMb(domyślnie 16 MB)
Tekst wychodzący i dzielenie na fragmenty
Tekst wychodzący i dzielenie na fragmenty
- limit fragmentu tekstu:
channels.imessage.textChunkLimit(domyślnie 4000) - tryb dzielenia na fragmenty:
channels.imessage.streaming.chunkModelength(domyślnie)newline(dzielenie w pierwszej kolejności według akapitów)
- wychodzące formatowanie Markdown obejmujące pogrubienie, kursywę, podkreślenie i przekreślenie jest konwertowane na natywnie stylizowany tekst (odbiorcy korzystający z systemu macOS 15 lub nowszego widzą stylizację, a odbiorcy korzystający ze starszych wersji widzą zwykły tekst bez znaczników); tabele Markdown są konwertowane zgodnie z trybem tabel Markdown kanału
channels.imessage.sendTransport(domyślnieauto,bridge,applescript) określa sposób realizacji wysyłania przezimsg
Formaty adresowania
Formaty adresowania
chat_id:123(zalecane do stabilnego routingu)chat_guid:...chat_identifier:...
imessage:+1555...sms:+1555...user@example.com
Akcje prywatnego API
Gdyimsg launch jest uruchomiony, a openclaw channels status --probe zgłasza privateApi.available: true, narzędzie wiadomości może oprócz zwykłego wysyłania tekstu korzystać z natywnych akcji iMessage.
Wszystkie akcje są domyślnie włączone; użyj channels.imessage.actions, aby wyłączyć poszczególne akcje:
Dostępne akcje
Dostępne akcje
- react: Dodaje/usuwa reakcje Tapback iMessage (
messageId,emoji,remove). Obsługiwane reakcje Tapback odpowiadają reakcjom: serce, „lubię”, „nie lubię”, śmiech, podkreślenie i pytajnik. Usunięcie bez emoji kasuje dowolną ustawioną reakcję Tapback. - reply: Wysyła odpowiedź w wątku do istniejącej wiadomości (
messageId,textlubmessage, a takżechatGuid,chatId,chatIdentifierlubto). Odpowiedź z załącznikiem dodatkowo wymaga kompilacjiimsg, w którejsend-richobsługuje--file. - sendWithEffect: Wysyła tekst z efektem iMessage (
textlubmessage,effectlubeffectId). Nazwy skrócone: slam, loud, gentle, invisibleink, confetti, lasers, fireworks, balloon, heart, echo, happybirthday, shootingstar, sparkles, spotlight. - edit: Edytuje wysłaną wiadomość w obsługiwanych wersjach systemu macOS/prywatnego API (
messageId,textlubnewText). Edytować można tylko wiadomości wysłane przez sam Gateway. - unsend: Wycofuje wysłaną wiadomość w obsługiwanych wersjach systemu macOS/prywatnego API (
messageId). Wycofać można tylko wiadomości wysłane przez sam Gateway. - upload-file: Wysyła multimedia/pliki (
bufferjako base64 lub wypełnionymedia/path/filePath,filename, opcjonalnieasVoice). Starszy alias:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: Zarządza czatami grupowymi, gdy bieżącym celem jest rozmowa grupowa. Akcje te modyfikują tożsamość Wiadomości na hoście, dlatego wymagają nadawcy będącego właścicielem lub klienta Gateway
operator.admin. - poll: Tworzy natywną ankietę Apple Messages (
pollQuestion,pollOptionpowtórzone od 2 do 12 razy, a takżechatGuid,chatId,chatIdentifierlubto). Odbiorcy korzystający z systemu iOS/iPadOS/macOS 26 lub nowszego widzą ją i głosują w niej natywnie; starsze wersje systemów operacyjnych otrzymują zastępczy tekst „Sent a poll”. Wymagaselectors.pollPayloadMessage. - poll-vote: Oddaje głos w istniejącej ankiecie (
pollIdlubmessageId, a także dokładnie jeden zpollOptionIndex,pollOptionIdlubpollOptionText). Wymagaselectors.pollVoteMessagei metody RPCpoll.vote.
poll-vote.Identyfikatory wiadomości
Identyfikatory wiadomości
MessageSid, jak i pełne identyfikatory GUID wiadomości (MessageSidFull), gdy są dostępne. Krótkie identyfikatory są ograniczone do ostatniej pamięci podręcznej odpowiedzi opartej na SQLite i przed użyciem są sprawdzane względem bieżącego czatu. Jeśli krótki identyfikator wygaśnie, spróbuj ponownie, używając jego MessageSidFull i wskazując rozmowę, z której pochodzi. Pełne identyfikatory nie omijają powiązania z rozmową ani kontem, dlatego identyfikator z innego czatu należy zastąpić identyfikatorem z bieżącego celu. Zdalnie delegowane wywołania mogą odrzucać nieaktualne pełne identyfikatory, gdy brakuje dowodu ich powiązania z bieżącą rozmową.Wykrywanie możliwości
Wykrywanie możliwości
imsg launch bez osobnego ręcznego odświeżania statusu.Potwierdzenia odczytu i wskaźnik pisania
Potwierdzenia odczytu i wskaźnik pisania
imsg, pochodzące sprzed wprowadzenia listy możliwości poszczególnych metod, po cichu wyłączają wskaźnik pisania i potwierdzenia odczytu; OpenClaw rejestruje jednorazowe ostrzeżenie po każdym ponownym uruchomieniu, aby można było ustalić przyczynę braku potwierdzenia.Przychodzące reakcje Tapback
Przychodzące reakcje Tapback
channels.imessage.reactionNotifications:"own"(domyślnie): powiadamiaj tylko wtedy, gdy użytkownicy reagują na wiadomości napisane przez bota."all": powiadamiaj o wszystkich przychodzących reakcjach Tapback od autoryzowanych nadawców."off": ignoruj przychodzące reakcje Tapback.
channels.imessage.accounts.<id>.reactionNotifications.Reakcje zatwierdzające (👍 / 👎)
Reakcje zatwierdzające (👍 / 👎)
approvals.exec.enabled lub approvals.plugin.enabled ma wartość true, a żądanie jest kierowane do iMessage, Gateway natywnie dostarcza monit o zatwierdzenie i akceptuje reakcję Tapback w celu jego rozstrzygnięcia:👍(reakcja Tapback „Like”) →allow-once👎(reakcja Tapback „Dislike”) →denyallow-alwayspozostaje ręcznym rozwiązaniem zastępczym: wyślij/approve <id> allow-alwaysjako zwykłą odpowiedź.
channels.imessage.allowFrom (lub channels.imessage.accounts.<id>.allowFrom); dodaj numer telefonu użytkownika w formacie E.164 lub jego adres e-mail Apple ID (cele czatu takie jak chat_id:* nie są prawidłowymi wpisami osób zatwierdzających). Wpis wieloznaczny "*" jest respektowany, ale pozwala zatwierdzać każdemu nadawcy; pusta lista osób zatwierdzających całkowicie wyłącza skrót reakcji. Skrót reakcji celowo pomija reactionNotifications, dmPolicy i groupAllowFrom, ponieważ jawna lista dozwolonych osób zatwierdzających jest jedyną kontrolą mającą znaczenie przy rozstrzyganiu zatwierdzenia.Autoryzacja polecenia tekstowego /approve korzysta z tej samej listy: gdy channels.imessage.allowFrom nie jest puste, /approve <id> <decision> jest autoryzowane na podstawie tej listy osób zatwierdzających (a nie szerszej listy dozwolonych wiadomości bezpośrednich), a nadawcy dopuszczeni na liście dozwolonych wiadomości bezpośrednich, ale nieobecni w allowFrom, otrzymują jawną odmowę. Gdy allowFrom jest puste, nadal obowiązuje rozwiązanie zastępcze dla tego samego czatu, a /approve autoryzuje każdą osobę dopuszczoną przez listę dozwolonych wiadomości bezpośrednich. Dodaj każdego operatora, który powinien mieć możliwość zatwierdzania — za pomocą /approve lub reakcji — do allowFrom.Uwagi dla operatora:- Powiązanie reakcji jest przechowywane zarówno w pamięci, jak i w trwałym magazynie Gateway opartym na kluczach (TTL jest dopasowany do terminu wygaśnięcia zatwierdzenia), a Gateway odpytuje również oczekujące monity o tapbacki, dzięki czemu tapback otrzymany krótko po ponownym uruchomieniu Gateway nadal rozstrzyga zatwierdzenie.
- Tapback operatora
is_from_me=true(na przykład ze sparowanego urządzenia Apple) rozstrzyga zatwierdzenie, gdy ten identyfikator jest jawnym zatwierdzającym. - Monity o zatwierdzenie są kierowane do rozmowy grupowej tylko wtedy, gdy skonfigurowano jawnych zatwierdzających; w przeciwnym razie zatwierdzenia mógłby dokonać dowolny członek grupy.
- Starsze tapbacki w formie tekstowej (
Liked "…"zwykły tekst z bardzo starych klientów Apple) nie mogą rozstrzygać zatwierdzeń, ponieważ nie zawierają identyfikatora GUID wiadomości; rozstrzyganie reakcji wymaga ustrukturyzowanych metadanych tapbacka emitowanych przez obecne klienty macOS / iOS.
Zapisy konfiguracji
iMessage domyślnie zezwala na inicjowane przez kanał zapisy konfiguracji (dla/config set|unset, gdy commands.config: true).
Wyłączanie:
Scalanie podzielonych wiadomości prywatnych (polecenie + adres URL w jednej kompozycji)
Gdy użytkownik wpisze razem polecenie i adres URL — np.Dump https://example.com/article — aplikacja Wiadomości firmy Apple dzieli wysyłkę na dwa oddzielne wiersze chat.db:
- Wiadomość tekstową (
"Dump"). - Dymek podglądu adresu URL (
"https://...") z obrazami podglądu OG jako załącznikami.
imsg.
channels.imessage.coalesceSameSenderDms włącza dla wiadomości prywatnych buforowanie kolejnych wierszy od tego samego nadawcy. Gdy imsg udostępnia strukturalny znacznik podglądu adresu URL balloon_bundle_id: "com.apple.messages.URLBalloonProvider" w jednym z wierszy źródłowych, OpenClaw scala tylko tę rzeczywiście podzieloną wysyłkę, a pozostałe buforowane wiersze zachowuje jako osobne tury. W starszych kompilacjach imsg, które nie emitują żadnych metadanych dymka, OpenClaw nie potrafi odróżnić podzielonej wysyłki od osobnych wysyłek, dlatego awaryjnie scala zawartość bufora. Zachowuje to zachowanie sprzed wprowadzenia metadanych, zamiast powodować regresję polegającą na dzieleniu wysyłek Dump <url> na dwie tury. Czaty grupowe nadal przekazują każdą wiadomość osobno, aby zachować strukturę tur wielu użytkowników.
- Kiedy włączyć
- Włączanie
- Kompromisy
- Udostępniane Skills oczekują
command + payloadw jednej wiadomości (zrzut, wklejenie, zapisanie, dodanie do kolejki itd.). - Użytkownicy wklejają adresy URL razem z poleceniami.
- Można zaakceptować dodatkowe opóźnienie tur wiadomości prywatnych (patrz niżej).
- Wymagane jest minimalne opóźnienie poleceń dla jednowyrazowych wyzwalaczy w wiadomościach prywatnych.
- Wszystkie przepływy składają się z jednorazowych poleceń bez późniejszych wiadomości z ładunkiem.
Scenariusze i dane widoczne dla agenta
Kolumna „Flaga włączona” przedstawia zachowanie kompilacjiimsg, która emituje balloon_bundle_id. W starszych kompilacjach imsg, które nie emitują żadnych metadanych dymka, wiersze oznaczone niżej jako „Dwie tury” / „N tur” korzystają zamiast tego ze starszego scalania awaryjnego (jedna tura): OpenClaw nie potrafi strukturalnie odróżnić podzielonej wysyłki od osobnych wysyłek, dlatego zachowuje scalanie sprzed wprowadzenia metadanych. Precyzyjne rozdzielanie włącza się, gdy kompilacja zaczyna emitować metadane dymka.
Odzyskiwanie wiadomości przychodzących po ponownym uruchomieniu mostu lub Gateway
iMessage odzyskuje wiadomości pominięte podczas niedostępności Gateway, a jednocześnie tłumi nieaktualną „bombę zaległości”, którą Apple może wysłać po odzyskaniu połączenia Push. Domyślne zachowanie jest zawsze włączone i opiera się na deduplikacji wiadomości przychodzących.- Deduplikacja powtórzeń. Każda przekazana wiadomość przychodząca jest rejestrowana według identyfikatora GUID Apple w trwałym stanie pluginu (
imessage.inbound-dedupe): zostaje zarezerwowana podczas pobierania i zatwierdzona po obsłużeniu (rezerwacja jest zwalniana po przejściowym błędzie, aby umożliwić ponowną próbę). Wszystko, co już obsłużono, jest odrzucane zamiast przekazywane dwukrotnie. Umożliwia to agresywne odtwarzanie podczas odzyskiwania bez prowadzenia ewidencji poszczególnych wiadomości. - Odzyskiwanie po przestoju. Podczas uruchamiania monitor zapamiętuje ostatni przekazany identyfikator rowid
chat.db(trwały kursor dla każdego konta) i przekazuje go doimsg watch.subscribejakosince_rowid, dzięki czemu imsg odtwarza wiersze otrzymane podczas niedostępności Gateway, a następnie śledzi wiadomości na żywo. Odtwarzanie jest ograniczone do 500 najnowszych wierszy oraz wiadomości sprzed maksymalnie około 2 godzin, a deduplikacja odrzuca wszystko, co już obsłużono. - Ograniczenie wieku nieaktualnych zaległości. Wiersze powyżej granicy uruchomienia są faktycznie odbierane na żywo; jeśli data wysłania jednego z nich jest starsza od czasu nadejścia o ponad około 15 minut, jest on zaległością opróżnioną przez Push i zostaje stłumiony. Odtwarzane wiersze (na granicy lub poniżej niej) korzystają natomiast z szerszego okna odzyskiwania, dzięki czemu niedawno pominięta wiadomość zostaje dostarczona, a dawna historia nie.
cliPath, ponieważ odtwarzanie since_rowid odbywa się przez to samo połączenie RPC imsg. Różnica dotyczy okna: gdy Gateway może odczytać chat.db (lokalnie), ustala na jego podstawie graniczny identyfikator rowid uruchomienia, ogranicza zakres odtwarzania i dostarcza pominięte wiadomości sprzed maksymalnie kilku godzin. W przypadku zdalnego cliPath przez SSH nie może odczytać bazy danych, dlatego odtwarzanie nie ma limitu, a każdy wiersz korzysta z ograniczenia wieku wiadomości na żywo — nadal odzyskuje niedawno pominięte wiadomości i tłumi stare zaległości, ale używa węższego okna wiadomości na żywo. Aby uzyskać szersze okno odzyskiwania, należy uruchomić Gateway na Macu obsługującym Wiadomości.
Sygnał widoczny dla operatora
Stłumione zaległości są rejestrowane na domyślnym poziomie i nigdy nie są odrzucane bez informacji (flagarecovery wskazuje zastosowane okno):
Migracja
channels.imessage.catchup.* jest przestarzałe — odzyskiwanie po przestoju jest automatyczne i w nowych konfiguracjach nie wymaga ustawień. Istniejące konfiguracje z catchup.enabled: true nadal są respektowane jako profil zgodności dla okna odtwarzania podczas odzyskiwania. Wyłączone bloki nadrabiania zaległości (enabled: false lub brak enabled: true) zostały wycofane; openclaw doctor --fix je usuwa.
Rozwiązywanie problemów
Nie znaleziono imsg lub RPC nie jest obsługiwane
Nie znaleziono imsg lub RPC nie jest obsługiwane
imsg. Jeśli działania prywatnego API są niedostępne, uruchom imsg launch w sesji zalogowanego użytkownika macOS i ponownie wykonaj sondowanie. Jeśli Gateway nie działa w systemie macOS, zamiast domyślnej lokalnej ścieżki imsg użyj opisanej wyżej konfiguracji zdalnego Maca przez SSH.Wiadomości są wysyłane, ale przychodzące wiadomości iMessage nie docierają
Wiadomości są wysyłane, ale przychodzące wiadomości iMessage nie docierają
chat.db się nie zmienia, OpenClaw nie może odebrać wiadomości, nawet gdy imsg status --json zgłasza prawidłowo działający most.chat.db lub zdarzenia imsg watch. Nie uruchamiaj tego jako okresowej pętli ponownie uruchamiającej most; powtarzające się imsg launch wraz z ponownymi uruchomieniami Gateway podczas aktywnej pracy mogą przerywać dostarczanie wiadomości i pozostawiać trwające uruchomienia kanału w stanie zawieszenia.Gateway nie działa w systemie macOS
Gateway nie działa w systemie macOS
cliPath: "imsg" musi działać na Macu zalogowanym do Wiadomości. W systemie Linux lub Windows ustaw channels.imessage.cliPath na skrypt opakowujący, który łączy się przez SSH z tym Makiem i uruchamia imsg "$@".Wiadomości prywatne są ignorowane
Wiadomości prywatne są ignorowane
channels.imessage.dmPolicychannels.imessage.allowFrom- zatwierdzenia parowania (
openclaw pairing list imessage)
Wiadomości grupowe są ignorowane
Wiadomości grupowe są ignorowane
channels.imessage.groupPolicychannels.imessage.groupAllowFromchannels.imessage.groupsdziałanie listy dozwolonych- konfiguracja wzorca wzmianek (
agents.list[].groupChat.mentionPatterns)
Załączniki zdalne nie działają
Załączniki zdalne nie działają
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- uwierzytelnianie kluczem SSH/SCP z hosta Gateway
- klucz hosta istnieje w
~/.ssh/known_hostsna hoście Gateway - możliwość odczytu ścieżki zdalnej na Macu, na którym działa Messages
Pominięto monity o uprawnienia systemu macOS
Pominięto monity o uprawnienia systemu macOS
imsg przyznano pełny dostęp do dysku i uprawnienia automatyzacji.Odnośniki do dokumentacji konfiguracji
Powiązane materiały
- Przegląd kanałów — wszystkie obsługiwane kanały
- Usunięcie BlueBubbles i ścieżka iMessage oparta na imsg — ogłoszenie i podsumowanie migracji
- Przejście z BlueBubbles — tabela mapowania konfiguracji i instrukcja migracji krok po kroku
- Parowanie — uwierzytelnianie wiadomości prywatnych i proces parowania
- Grupy — działanie czatów grupowych i ograniczanie obsługi na podstawie wzmianek
- Routing kanałów — routing sesji dla wiadomości
- Bezpieczeństwo — model dostępu i wzmacnianie zabezpieczeń