BlueBubbles (REST na macOS)
Status: dołączony plugin, który komunikuje się z serwerem BlueBubbles na macOS przez HTTP. Zalecany do integracji z iMessage ze względu na bogatsze API i łatwiejszą konfigurację w porównaniu ze starszym kanałem imsg.Dołączony plugin
Bieżące wydania OpenClaw zawierają BlueBubbles, więc zwykłe spakowane kompilacje nie wymagają osobnego krokuopenclaw plugins install.
Omówienie
- Działa na macOS przez aplikację pomocniczą BlueBubbles (bluebubbles.app).
- Zalecane/testowane: macOS Sequoia (15). macOS Tahoe (26) działa; edycja jest obecnie uszkodzona w Tahoe, a aktualizacje ikon grup mogą zgłaszać sukces, ale nie synchronizować się.
- OpenClaw komunikuje się z nim przez jego REST API (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - Wiadomości przychodzące docierają przez webhooki; odpowiedzi wychodzące, wskaźniki pisania, potwierdzenia odczytu i tapbacki są wywołaniami REST.
- Załączniki i naklejki są pobierane jako media przychodzące (i przekazywane agentowi, gdy to możliwe).
- Parowanie/lista dozwolonych działa tak samo jak w innych kanałach (
/channels/pairingitd.) zchannels.bluebubbles.allowFrom+ kodami parowania. - Reakcje są przedstawiane jako zdarzenia systemowe tak samo jak w Slack/Telegram, dzięki czemu agenci mogą o nich „wspomnieć” przed odpowiedzią.
- Funkcje zaawansowane: edycja, cofanie wysłania, wątki odpowiedzi, efekty wiadomości, zarządzanie grupą.
Szybki start
- Zainstaluj serwer BlueBubbles na swoim Macu (postępuj zgodnie z instrukcjami na bluebubbles.app/install).
- W konfiguracji BlueBubbles włącz web API i ustaw hasło.
-
Uruchom
openclaw onboardi wybierz BlueBubbles albo skonfiguruj ręcznie: -
Skieruj webhooki BlueBubbles do swojego gatewaya (przykład:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). - Uruchom gateway; zarejestruje obsługę webhooka i rozpocznie parowanie.
- Zawsze ustawiaj hasło webhooka.
- Uwierzytelnianie webhooka jest zawsze wymagane. OpenClaw odrzuca żądania webhooka BlueBubbles, jeśli nie zawierają hasła/guid zgodnego z
channels.bluebubbles.password(na przykład?password=<password>lubx-password), niezależnie od topologii local loopback/proxy. - Uwierzytelnianie hasłem jest sprawdzane przed odczytem/przetwarzaniem pełnych treści webhooka.
Utrzymywanie aktywności Messages.app (konfiguracje VM / bezgłowe)
W niektórych konfiguracjach macOS VM / always-on może się zdarzyć, że Messages.app przejdzie w stan „idle” (zdarzenia przychodzące zatrzymują się, dopóki aplikacja nie zostanie otwarta/przeniesiona na pierwszy plan). Prostym obejściem jest szturchanie Messages co 5 minut za pomocą AppleScript + LaunchAgent.1) Zapisz AppleScript
Zapisz to jako:~/Scripts/poke-messages.scpt
2) Zainstaluj LaunchAgent
Zapisz to jako:~/Library/LaunchAgents/com.user.poke-messages.plist
- To uruchamia się co 300 sekund i przy logowaniu.
- Pierwsze uruchomienie może wywołać monity macOS Automation (
osascript→ Messages). Zatwierdź je w tej samej sesji użytkownika, w której działa LaunchAgent.
Onboarding
BlueBubbles jest dostępny w interaktywnym onboardingu:- Server URL (wymagane): adres serwera BlueBubbles (np.
http://192.168.1.100:1234) - Password (wymagane): hasło API z ustawień BlueBubbles Server
- Webhook path (opcjonalne): domyślnie
/bluebubbles-webhook - DM policy: pairing, allowlist, open lub disabled
- Allow list: numery telefonów, adresy e-mail lub cele czatu
Kontrola dostępu (DM-y + grupy)
DM-y:- Domyślnie:
channels.bluebubbles.dmPolicy = "pairing". - Nieznani nadawcy otrzymują kod parowania; wiadomości są ignorowane do momentu zatwierdzenia (kody wygasają po 1 godzinie).
- Zatwierdź przez:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- Parowanie jest domyślnym mechanizmem wymiany tokenów. Szczegóły: Parowanie
channels.bluebubbles.groupPolicy = open | allowlist | disabled(domyślnie:allowlist).channels.bluebubbles.groupAllowFromokreśla, kto może uruchamiać w grupach, gdy ustawionoallowlist.
Wzbogacanie nazw kontaktów (macOS, opcjonalne)
Webhooki grup BlueBubbles często zawierają tylko surowe adresy uczestników. Jeśli chcesz, aby kontekstGroupMembers pokazywał zamiast tego lokalne nazwy kontaktów, możesz opcjonalnie włączyć lokalne wzbogacanie z Kontaktów na macOS:
channels.bluebubbles.enrichGroupParticipantsFromContacts = truewłącza wyszukiwanie. Domyślnie:false.- Wyszukiwania są uruchamiane dopiero po tym, jak dostęp do grupy, autoryzacja poleceń i bramkowanie wzmianek przepuszczą wiadomość.
- Wzbogacani są tylko nienazwani uczestnicy z numerami telefonów.
- Surowe numery telefonów pozostają opcją zapasową, gdy nie zostanie znalezione lokalne dopasowanie.
Bramkowanie wzmianek (grupy)
BlueBubbles obsługuje bramkowanie wzmianek dla czatów grupowych, zgodnie z zachowaniem iMessage/WhatsApp:- Używa
agents.list[].groupChat.mentionPatterns(lubmessages.groupChat.mentionPatterns) do wykrywania wzmianek. - Gdy
requireMentionjest włączone dla grupy, agent odpowiada tylko wtedy, gdy zostanie wspomniany. - Polecenia sterujące od autoryzowanych nadawców omijają bramkowanie wzmianek.
Bramkowanie poleceń
- Polecenia sterujące (np.
/config,/model) wymagają autoryzacji. - Używa
allowFromigroupAllowFromdo określenia autoryzacji poleceń. - Autoryzowani nadawcy mogą uruchamiać polecenia sterujące nawet bez wzmianki w grupach.
Powiązania konwersacji ACP
Czaty BlueBubbles można przekształcić w trwałe obszary robocze ACP bez zmiany warstwy transportowej. Szybki przepływ dla operatora:- Uruchom
/acp spawn codex --bind herew DM-ie lub dozwolonym czacie grupowym. - Przyszłe wiadomości w tej samej konwersacji BlueBubbles będą kierowane do uruchomionej sesji ACP.
/newi/resetresetują tę samą powiązaną sesję ACP na miejscu./acp closezamyka sesję ACP i usuwa powiązanie.
bindings[] z type: "acp" i match.channel: "bluebubbles".
match.peer.id może używać dowolnej obsługiwanej formy celu BlueBubbles:
- znormalizowany identyfikator DM, taki jak
+15555550123lubuser@example.com chat_id:<id>chat_guid:<guid>chat_identifier:<identifier>
chat_id:* lub chat_identifier:*.
Przykład:
Pisanie + potwierdzenia odczytu
- Wskaźniki pisania: wysyłane automatycznie przed i podczas generowania odpowiedzi.
- Potwierdzenia odczytu: kontrolowane przez
channels.bluebubbles.sendReadReceipts(domyślnie:true). - Wskaźniki pisania: OpenClaw wysyła zdarzenia rozpoczęcia pisania; BlueBubbles czyści stan pisania automatycznie po wysłaniu lub po przekroczeniu limitu czasu (ręczne zatrzymanie przez DELETE jest zawodne).
Zaawansowane działania
BlueBubbles obsługuje zaawansowane działania na wiadomościach, gdy są włączone w konfiguracji:- react: dodaj/usuń reakcje tapback (
messageId,emoji,remove) - edit: edytuj wysłaną wiadomość (
messageId,text) - unsend: cofnij wysłanie wiadomości (
messageId) - reply: odpowiedz na konkretną wiadomość (
messageId,text,to) - sendWithEffect: wyślij z efektem iMessage (
text,to,effectId) - renameGroup: zmień nazwę czatu grupowego (
chatGuid,displayName) - setGroupIcon: ustaw ikonę/zdjęcie czatu grupowego (
chatGuid,media) — niestabilne na macOS 26 Tahoe (API może zwrócić sukces, ale ikona się nie synchronizuje). - addParticipant: dodaj kogoś do grupy (
chatGuid,address) - removeParticipant: usuń kogoś z grupy (
chatGuid,address) - leaveGroup: opuść czat grupowy (
chatGuid) - upload-file: wyślij media/pliki (
to,buffer,filename,asVoice)- Notatki głosowe: ustaw
asVoice: truez dźwiękiem MP3 lub CAF, aby wysłać jako wiadomość głosową iMessage. BlueBubbles konwertuje MP3 → CAF podczas wysyłania notatek głosowych.
- Notatki głosowe: ustaw
- Starszy alias:
sendAttachmentnadal działa, aleupload-fileto kanoniczna nazwa działania.
Identyfikatory wiadomości (krótkie vs pełne)
OpenClaw może udostępniać krótkie identyfikatory wiadomości (np.1, 2), aby oszczędzać tokeny.
MessageSid/ReplyToIdmogą być krótkimi identyfikatorami.MessageSidFull/ReplyToIdFullzawierają pełne identyfikatory dostawcy.- Krótkie identyfikatory są przechowywane w pamięci; mogą wygasnąć po restarcie lub usunięciu z pamięci podręcznej.
- Działania akceptują krótki lub pełny
messageId, ale krótkie identyfikatory spowodują błąd, jeśli nie są już dostępne.
- Szablony:
{{MessageSidFull}},{{ReplyToIdFull}} - Kontekst:
MessageSidFull/ReplyToIdFullw ładunkach przychodzących
Blokowe strumieniowanie
Kontroluj, czy odpowiedzi są wysyłane jako pojedyncza wiadomość, czy strumieniowane w blokach:Media + limity
- Załączniki przychodzące są pobierane i przechowywane w pamięci podręcznej mediów.
- Limit mediów przez
channels.bluebubbles.mediaMaxMbdla mediów przychodzących i wychodzących (domyślnie: 8 MB). - Tekst wychodzący jest dzielony na fragmenty według
channels.bluebubbles.textChunkLimit(domyślnie: 4000 znaków).
Dokumentacja konfiguracji
Pełna konfiguracja: Konfiguracja Opcje dostawcy:channels.bluebubbles.enabled: włącz/wyłącz kanał.channels.bluebubbles.serverUrl: podstawowy URL REST API BlueBubbles.channels.bluebubbles.password: hasło API.channels.bluebubbles.webhookPath: ścieżka punktu końcowego webhooka (domyślnie:/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(domyślnie:pairing).channels.bluebubbles.allowFrom: lista dozwolonych dla DM-ów (identyfikatory, e-maile, numery E.164,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(domyślnie:allowlist).channels.bluebubbles.groupAllowFrom: lista dozwolonych nadawców grupowych.channels.bluebubbles.enrichGroupParticipantsFromContacts: na macOS opcjonalnie wzbogaca nienazwanych uczestników grupy z lokalnych Kontaktów po przejściu bramek. Domyślnie:false.channels.bluebubbles.groups: konfiguracja per grupa (requireMentionitd.).channels.bluebubbles.sendReadReceipts: wysyłaj potwierdzenia odczytu (domyślnie:true).channels.bluebubbles.blockStreaming: włącz blokowe strumieniowanie (domyślnie:false; wymagane dla odpowiedzi strumieniowych).channels.bluebubbles.textChunkLimit: rozmiar fragmentu wychodzącego w znakach (domyślnie: 4000).channels.bluebubbles.chunkMode:length(domyślnie) dzieli tylko po przekroczeniutextChunkLimit;newlinedzieli po pustych liniach (granice akapitów) przed dzieleniem według długości.channels.bluebubbles.mediaMaxMb: limit mediów przychodzących/wychodzących w MB (domyślnie: 8).channels.bluebubbles.mediaLocalRoots: jawna lista dozwolonych bezwzględnych katalogów lokalnych dla wychodzących lokalnych ścieżek mediów. Wysyłanie lokalnych ścieżek jest domyślnie odrzucane, chyba że to zostanie skonfigurowane. Nadpisanie per konto:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: maksymalna liczba wiadomości grupowych dla kontekstu (0 wyłącza).channels.bluebubbles.dmHistoryLimit: limit historii DM.channels.bluebubbles.actions: włącz/wyłącz konkretne działania.channels.bluebubbles.accounts: konfiguracja wielu kont.
agents.list[].groupChat.mentionPatterns(lubmessages.groupChat.mentionPatterns).messages.responsePrefix.
Adresowanie / cele dostarczania
Dla stabilnego routingu preferujchat_guid:
chat_guid:iMessage;-;+15555550123(preferowane dla grup)chat_id:123chat_identifier:...- Bezpośrednie identyfikatory:
+15555550123,user@example.com- Jeśli bezpośredni identyfikator nie ma istniejącego czatu DM, OpenClaw utworzy go przez
POST /api/v1/chat/new. Wymaga to włączenia BlueBubbles Private API.
- Jeśli bezpośredni identyfikator nie ma istniejącego czatu DM, OpenClaw utworzy go przez
Bezpieczeństwo
- Żądania webhooka są uwierzytelniane przez porównanie parametrów zapytania lub nagłówków
guid/passwordzchannels.bluebubbles.password. - Zachowaj hasło API i punkt końcowy webhooka w tajemnicy (traktuj je jak poświadczenia).
- Nie ma obejścia localhost dla uwierzytelniania webhooka BlueBubbles. Jeśli przekazujesz ruch webhooka przez proxy, zachowaj hasło BlueBubbles w żądaniu od końca do końca.
gateway.trustedProxiesnie zastępuje tutajchannels.bluebubbles.password. Zobacz Bezpieczeństwo gatewaya. - Włącz HTTPS + reguły zapory na serwerze BlueBubbles, jeśli udostępniasz go poza swoją siecią LAN.
Rozwiązywanie problemów
- Jeśli zdarzenia pisania/odczytu przestaną działać, sprawdź logi webhooka BlueBubbles i zweryfikuj, czy ścieżka gatewaya odpowiada
channels.bluebubbles.webhookPath. - Kody parowania wygasają po godzinie; użyj
openclaw pairing list bluebubblesiopenclaw pairing approve bluebubbles <code>. - Reakcje wymagają BlueBubbles private API (
POST /api/v1/message/react); upewnij się, że wersja serwera je udostępnia. - Edycja/cofanie wysłania wymagają macOS 13+ i zgodnej wersji serwera BlueBubbles. W macOS 26 (Tahoe) edycja jest obecnie uszkodzona z powodu zmian w private API.
- Aktualizacje ikon grup mogą być niestabilne na macOS 26 (Tahoe): API może zwrócić sukces, ale nowa ikona się nie synchronizuje.
- OpenClaw automatycznie ukrywa znane uszkodzone działania na podstawie wersji macOS serwera BlueBubbles. Jeśli edycja nadal pojawia się na macOS 26 (Tahoe), wyłącz ją ręcznie przez
channels.bluebubbles.actions.edit=false. - Informacje o stanie/zdrowiu:
openclaw status --alllubopenclaw status --deep.
Powiązane
- Przegląd kanałów — wszystkie obsługiwane kanały
- Parowanie — uwierzytelnianie DM i przepływ parowania
- Grupy — zachowanie czatów grupowych i bramkowanie wzmianek
- Routing kanałów — routing sesji dla wiadomości
- Bezpieczeństwo — model dostępu i utwardzanie