BlueBubbles (macOS REST)
Status: dolaczony plugin komunikujacy sie z serwerem BlueBubbles macOS przez HTTP. Zalecany do integracji iMessage dzieki bogatszemu API i latwiejszej konfiguracji w porownaniu z przestarzalym kanalem imsg.
Przeglad
- Dziala na macOS przez aplikacje pomocnicza BlueBubbles (bluebubbles.app).
- Zalecane/przetestowane: macOS Sequoia (15). macOS Tahoe (26) dziala; edycja jest obecnie zepsuta na Tahoe, a aktualizacje ikon grup moga raportowac sukces, ale sie nie synchronizowac.
- OpenClaw komunikuje sie z nim przez REST API (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - Wiadomosci przychodzace docieraja przez webhooki; odpowiedzi wychodzace, wskazniki pisania, potwierdzenia odczytu i tapbacki to wywolania REST.
- Zalaczniki i naklejki sa pobierane jako media przychodzace (i udostepniane agentowi gdy to mozliwe).
- Parowanie/lista dozwolonych dziala tak samo jak inne kanaly (
/channels/pairingitp.) zchannels.bluebubbles.allowFrom+ kodami parowania. - Reakcje sa wyswietlane jako zdarzenia systemowe tak jak Slack/Telegram, wiec agenci moga je “wspomniec” przed odpowiedzia.
- Zaawansowane funkcje: edycja, cofniecie wyslania, watkowanie odpowiedzi, efekty wiadomosci, zarzadzanie grupami.
Szybki start
-
Zainstaluj serwer BlueBubbles na swoim Macu (postepuj zgodnie z instrukcjami na bluebubbles.app/install).
-
W konfiguracji BlueBubbles wlacz web API i ustaw haslo.
-
Uruchom
openclaw onboardi wybierz BlueBubbles, lub skonfiguruj recznie:{ channels: { bluebubbles: { enabled: true, serverUrl: "http://192.168.1.100:1234", password: "example-password", webhookPath: "/bluebubbles-webhook", }, }, } -
Skieruj webhooki BlueBubbles na gateway (przyklad:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). -
Uruchom gateway; zarejestruje handler webhooka i rozpocznie parowanie.
Uwaga bezpieczenstwa:
- Zawsze ustaw haslo webhooka.
- Uwierzytelnianie webhooka jest zawsze wymagane. OpenClaw odrzuca zadania webhooka BlueBubbles, chyba ze zawieraja haslo/guid pasujace do
channels.bluebubbles.password(np.?password=<password>lubx-password), niezaleznie od topologii loopback/proxy. - Uwierzytelnianie haslem jest sprawdzane przed odczytaniem/parsowaniem pelnych cial webhooka.
Utrzymywanie Messages.app przy zyciu (VM / konfiguracje bezgraficzne)
Niektore konfiguracje macOS VM / always-on moga skonczyc sie z Messages.app przechodzacym w stan “idle” (zdarzenia przychodzace zatrzymuja sie do momentu otwarcia/wysuniecia aplikacji na pierwszy plan). Prostym obejsciem jest pobudzanie Messages co 5 minut za pomoca AppleScript + LaunchAgent.
1) Zapisz AppleScript
Zapisz jako:
~/Scripts/poke-messages.scpt
Przykladowy skrypt (nieinteraktywny; nie kradnie fokusu):
try
tell application "Messages"
if not running then
launch
end if
-- Touch the scripting interface to keep the process responsive.
set _chatCount to (count of chats)
end tell
on error
-- Ignore transient failures (first-run prompts, locked session, etc).
end try
2) Zainstaluj LaunchAgent
Zapisz jako:
~/Library/LaunchAgents/com.user.poke-messages.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.poke-messages</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-lc</string>
<string>/usr/bin/osascript "$HOME/Scripts/poke-messages.scpt"</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>300</integer>
<key>StandardOutPath</key>
<string>/tmp/poke-messages.log</string>
<key>StandardErrorPath</key>
<string>/tmp/poke-messages.err</string>
</dict>
</plist>
Uwagi:
- Uruchamia sie co 300 sekund i przy logowaniu.
- Pierwsze uruchomienie moze wyzwolic monity Automatyzacji macOS (
osascript-> Messages). Zatwierdz je w tej samej sesji uzytkownika, ktora uruchamia LaunchAgent.
Zaladuj:
launchctl unload ~/Library/LaunchAgents/com.user.poke-messages.plist 2>/dev/null || true
launchctl load ~/Library/LaunchAgents/com.user.poke-messages.plist
Onboarding
BlueBubbles jest dostepny w interaktywnym kreatorze konfiguracji:
openclaw onboard
Kreator pyta o:
- URL serwera (wymagany): adres serwera BlueBubbles (np.
http://192.168.1.100:1234) - Haslo (wymagane): haslo API z ustawien serwera BlueBubbles
- Sciezka webhooka (opcjonalna): domyslnie
/bluebubbles-webhook - Polityka DM: parowanie, lista dozwolonych, otwarta lub wylaczona
- Lista dozwolonych: numery telefonow, emaile lub cele czatu
Mozesz rowniez dodac BlueBubbles przez CLI:
openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --password <password>
Kontrola dostepu (DM + grupy)
DM:
- Domyslnie:
channels.bluebubbles.dmPolicy = "pairing". - Nieznani nadawcy otrzymuja kod parowania; wiadomosci sa ignorowane do momentu zatwierdzenia (kody wygasaja po 1 godzinie).
- Zatwierdzanie przez:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- Parowanie to domyslna wymiana tokenow. Szczegoly: Parowanie
Grupy:
channels.bluebubbles.groupPolicy = open | allowlist | disabled(domyslnie:allowlist).channels.bluebubbles.groupAllowFromkontroluje, kto moze wyzwalac w grupach gdyallowlistjest ustawione.
Bramkowanie wzmiankami (grupy)
BlueBubbles obsluguje bramkowanie wzmiankami dla czatow grupowych, pasujace do zachowania iMessage/WhatsApp:
- Uzywa
agents.list[].groupChat.mentionPatterns(lubmessages.groupChat.mentionPatterns) do wykrywania wzmianek. - Gdy
requireMentionjest wlaczone dla grupy, agent odpowiada tylko gdy wspomniano. - Polecenia sterujace od autoryzowanych nadawcow omijaja bramkowanie wzmiankami.
Konfiguracja per grupe:
{
channels: {
bluebubbles: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15555550123"],
groups: {
"*": { requireMention: true }, // domyslne dla wszystkich grup
"iMessage;-;chat123": { requireMention: false }, // nadpisanie dla konkretnej grupy
},
},
},
}
Bramkowanie polecen
- Polecenia sterujace (np.
/config,/model) wymagaja autoryzacji. - Uzywa
allowFromigroupAllowFromdo okreslenia autoryzacji polecen. - Autoryzowani nadawcy moga uruchamiac polecenia sterujace nawet bez wzmianki w grupach.
Pisanie + potwierdzenia odczytu
- Wskazniki pisania: Wysylane automatycznie przed i podczas generowania odpowiedzi.
- Potwierdzenia odczytu: Kontrolowane przez
channels.bluebubbles.sendReadReceipts(domyslnie:true). - Wskazniki pisania: OpenClaw wysyla zdarzenia rozpoczecia pisania; BlueBubbles automatycznie czysci pisanie przy wyslaniu lub timeout (reczne zatrzymanie przez DELETE jest niewiarygodne).
{
channels: {
bluebubbles: {
sendReadReceipts: false, // wylacz potwierdzenia odczytu
},
},
}
Zaawansowane akcje
BlueBubbles obsluguje zaawansowane akcje wiadomosci gdy wlaczone w konfiguracji:
{
channels: {
bluebubbles: {
actions: {
reactions: true, // tapbacki (domyslnie: true)
edit: true, // edycja wyslanych wiadomosci (macOS 13+, zepsute na macOS 26 Tahoe)
unsend: true, // cofniecie wyslania wiadomosci (macOS 13+)
reply: true, // watkowanie odpowiedzi po GUID wiadomosci
sendWithEffect: true, // efekty wiadomosci (slam, loud itp.)
renameGroup: true, // zmiana nazwy czatow grupowych
setGroupIcon: true, // ustawienie ikony/zdjecia czatu grupowego (niestabilne na macOS 26 Tahoe)
addParticipant: true, // dodawanie uczestnikow do grup
removeParticipant: true, // usuwanie uczestnikow z grup
leaveGroup: true, // opuszczanie czatow grupowych
sendAttachment: true, // wysylanie zalacznikow/mediow
},
},
},
}
Dostepne akcje:
- react: Dodawanie/usuwanie reakcji tapback (
messageId,emoji,remove) - edit: Edycja wyslanej wiadomosci (
messageId,text) - unsend: Cofniecie wyslania wiadomosci (
messageId) - reply: Odpowiedz na konkretna wiadomosc (
messageId,text,to) - sendWithEffect: Wyslanie z efektem iMessage (
text,to,effectId) - renameGroup: Zmiana nazwy czatu grupowego (
chatGuid,displayName) - setGroupIcon: Ustawienie ikony/zdjecia czatu grupowego (
chatGuid,media) — niestabilne na macOS 26 Tahoe (API moze zwrocic sukces, ale ikona sie nie synchronizuje). - addParticipant: Dodanie kogos do grupy (
chatGuid,address) - removeParticipant: Usuniecie kogos z grupy (
chatGuid,address) - leaveGroup: Opuszczenie czatu grupowego (
chatGuid) - sendAttachment: Wyslanie mediow/plikow (
to,buffer,filename,asVoice)- Notatki glosowe: ustaw
asVoice: truez dzwiekiem MP3 lub CAF aby wyslac jako wiadomosc glosowa iMessage. BlueBubbles konwertuje MP3 na CAF podczas wysylania notatek glosowych.
- Notatki glosowe: ustaw
ID wiadomosci (krotkie vs pelne)
OpenClaw moze wyswietlac krotkie ID wiadomosci (np. 1, 2) aby oszczedzic tokeny.
MessageSid/ReplyToIdmoga byc krotkimi ID.MessageSidFull/ReplyToIdFullzawieraja pelne ID dostawcy.- Krotkie ID sa w pamieci; moga wygasnac po restarcie lub eksmisji z cache.
- Akcje akceptuja krotkie lub pelne
messageId, ale krotkie ID zwroca blad jesli nie sa juz dostepne.
Uzyj pelnych ID dla trwalych automatyzacji i przechowywania:
- Szablony:
{{MessageSidFull}},{{ReplyToIdFull}} - Kontekst:
MessageSidFull/ReplyToIdFullw payloadach przychodzacych
Zobacz Konfiguracja dla zmiennych szablonowych.
Strumieniowanie blokowe
Kontroluj, czy odpowiedzi sa wysylane jako jedna wiadomosc czy strumieniowane w blokach:
{
channels: {
bluebubbles: {
blockStreaming: true, // wlacz strumieniowanie blokowe (domyslnie wylaczone)
},
},
}
Media + limity
- Przychodzace zalaczniki sa pobierane i przechowywane w cache mediow.
- Limit mediow przez
channels.bluebubbles.mediaMaxMbdla mediow przychodzacych i wychodzacych (domyslnie: 8 MB). - Tekst wychodzacy jest dzielony na kawalki do
channels.bluebubbles.textChunkLimit(domyslnie: 4000 znakow).
Referencja konfiguracji
Pelna konfiguracja: Konfiguracja
Opcje dostawcy:
channels.bluebubbles.enabled: Wlaczenie/wylaczenie kanalu.channels.bluebubbles.serverUrl: Bazowy URL REST API BlueBubbles.channels.bluebubbles.password: Haslo API.channels.bluebubbles.webhookPath: Sciezka endpointu webhooka (domyslnie:/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(domyslnie:pairing).channels.bluebubbles.allowFrom: Lista dozwolonych DM (identyfikatory, emaile, numery E.164,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(domyslnie:allowlist).channels.bluebubbles.groupAllowFrom: Lista dozwolonych nadawcow grupowych.channels.bluebubbles.groups: Konfiguracja per grupe (requireMentionitp.).channels.bluebubbles.sendReadReceipts: Wysylanie potwierdzen odczytu (domyslnie:true).channels.bluebubbles.blockStreaming: Wlaczenie strumieniowania blokowego (domyslnie:false; wymagane do strumieniowania odpowiedzi).channels.bluebubbles.textChunkLimit: Rozmiar kawalka wychodzacego w znakach (domyslnie: 4000).channels.bluebubbles.chunkMode:length(domyslnie) dzieli tylko po przekroczeniutextChunkLimit;newlinedzieli na pustych liniach (granice akapitow) przed dzieleniem wedlug dlugosci.channels.bluebubbles.mediaMaxMb: Limit mediow przychodzacych/wychodzacych w MB (domyslnie: 8).channels.bluebubbles.mediaLocalRoots: Jawna lista dozwolonych absolutnych katalogow lokalnych dozwolonych dla sciezek lokalnych mediow wychodzacych. Wysylanie sciezek lokalnych jest domyslnie odrzucane, chyba ze jest to skonfigurowane. Nadpisanie per konto:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: Max wiadomosci grupowych dla kontekstu (0 wylacza).channels.bluebubbles.dmHistoryLimit: Limit historii DM.channels.bluebubbles.actions: Wlaczenie/wylaczenie konkretnych akcji.channels.bluebubbles.accounts: Konfiguracja wielokontowa.
Powiazane opcje globalne:
agents.list[].groupChat.mentionPatterns(lubmessages.groupChat.mentionPatterns).messages.responsePrefix.
Adresowanie / cele dostarczania
Preferuj chat_guid dla stabilnego routingu:
chat_guid:iMessage;-;+15555550123(preferowane dla grup)chat_id:123chat_identifier:...- Bezposrednie identyfikatory:
+15555550123,[email protected]- Jesli bezposredni identyfikator nie ma istniejacego czatu DM, OpenClaw utworzy go przez
POST /api/v1/chat/new. Wymaga to wlaczenia BlueBubbles Private API.
- Jesli bezposredni identyfikator nie ma istniejacego czatu DM, OpenClaw utworzy go przez
Bezpieczenstwo
- Zadania webhooka sa uwierzytelniane przez porownywanie parametrow zapytania
guid/passwordlub naglowkow zchannels.bluebubbles.password. Zadania zlocalhostsa rowniez akceptowane. - Trzymaj haslo API i endpoint webhooka w tajemnicy (traktuj jak dane logowania).
- Zaufanie localhost oznacza, ze reverse proxy na tym samym hoscie moze niezamierzenie ominac haslo. Jesli proxyujesz gateway, wymagaj autoryzacji na proxy i skonfiguruj
gateway.trustedProxies. Zobacz Bezpieczenstwo Gateway. - Wlacz HTTPS + reguly firewall na serwerze BlueBubbles jesli udostepniasz go poza LAN.
Rozwiazywanie problemow
- Jesli zdarzenia pisania/odczytu przestaja dzialac, sprawdz logi webhooka BlueBubbles i zweryfikuj, ze sciezka gateway pasuje do
channels.bluebubbles.webhookPath. - Kody parowania wygasaja po godzinie; uzyj
openclaw pairing list bluebubblesiopenclaw pairing approve bluebubbles <code>. - Reakcje wymagaja BlueBubbles private API (
POST /api/v1/message/react); upewnij sie, ze wersja serwera go udostepnia. - Edycja/cofniecie wyslania wymagaja macOS 13+ i kompatybilnej wersji serwera BlueBubbles. Na macOS 26 (Tahoe) edycja jest obecnie zepsuta z powodu zmian private API.
- Aktualizacje ikon grup moga byc niestabilne na macOS 26 (Tahoe): API moze zwrocic sukces, ale nowa ikona sie nie synchronizuje.
- OpenClaw automatycznie ukrywa znane zepsute akcje na podstawie wersji macOS serwera BlueBubbles. Jesli edycja nadal pojawia sie na macOS 26 (Tahoe), wylacz ja recznie przez
channels.bluebubbles.actions.edit=false. - Dla informacji o statusie/zdrowiu:
openclaw status --alllubopenclaw status --deep.
Ogolna referencja przepływu kanalow: Kanaly i przewodnik Pluginy.