BlueBubbles (REST macOS)
Status: plugin bawaan yang berkomunikasi dengan server macOS BlueBubbles melalui HTTP. Direkomendasikan untuk integrasi iMessage karena API-nya lebih kaya dan penyiapannya lebih mudah dibandingkan channel imsg lama.Plugin bawaan
Rilis OpenClaw saat ini menyertakan BlueBubbles, jadi build paket normal tidak memerlukan langkahopenclaw plugins install terpisah.
Gambaran umum
- Berjalan di macOS melalui aplikasi helper BlueBubbles (bluebubbles.app).
- Direkomendasikan/teruji: macOS Sequoia (15). macOS Tahoe (26) berfungsi; edit saat ini rusak di Tahoe, dan pembaruan ikon grup dapat dilaporkan berhasil tetapi tidak tersinkron.
- OpenClaw berkomunikasi dengannya melalui API REST-nya (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - Pesan masuk tiba melalui webhook; balasan keluar, indikator mengetik, tanda baca, dan tapback adalah panggilan REST.
- Lampiran dan stiker diingest sebagai media masuk (dan ditampilkan ke agen jika memungkinkan).
- Pairing/allowlist berfungsi sama seperti channel lain (
/channels/pairingdan seterusnya) denganchannels.bluebubbles.allowFrom+ kode pairing. - Reaksi ditampilkan sebagai event sistem seperti Slack/Telegram sehingga agen dapat “menyebutkannya” sebelum membalas.
- Fitur lanjutan: edit, batalkan kirim, utas balasan, efek pesan, manajemen grup.
Mulai cepat
- Instal server BlueBubbles di Mac Anda (ikuti petunjuk di bluebubbles.app/install).
- Di konfigurasi BlueBubbles, aktifkan web API dan tetapkan kata sandi.
-
Jalankan
openclaw onboarddan pilih BlueBubbles, atau konfigurasi secara manual: -
Arahkan webhook BlueBubbles ke gateway Anda (contoh:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). - Mulai gateway; gateway akan mendaftarkan handler webhook dan memulai pairing.
- Selalu tetapkan kata sandi webhook.
- Autentikasi webhook selalu wajib. OpenClaw menolak permintaan webhook BlueBubbles kecuali permintaan tersebut menyertakan password/guid yang cocok dengan
channels.bluebubbles.password(misalnya?password=<password>ataux-password), terlepas dari topologi loopback/proxy. - Autentikasi kata sandi diperiksa sebelum membaca/mengurai body webhook secara penuh.
Menjaga Messages.app tetap aktif (VM / penyiapan headless)
Beberapa penyiapan VM macOS / selalu aktif dapat membuat Messages.app menjadi “idle” (event masuk berhenti sampai aplikasi dibuka/dijadikan foreground). Solusi sederhananya adalah menyentuh Messages setiap 5 menit menggunakan AppleScript + LaunchAgent.1) Simpan AppleScript
Simpan sebagai:~/Scripts/poke-messages.scpt
2) Instal LaunchAgent
Simpan sebagai:~/Library/LaunchAgents/com.user.poke-messages.plist
- Ini berjalan setiap 300 detik dan saat login.
- Proses pertama kali berjalan dapat memicu prompt macOS Automation (
osascript→ Messages). Setujui prompt tersebut di sesi pengguna yang sama yang menjalankan LaunchAgent.
Onboarding
BlueBubbles tersedia dalam onboarding interaktif:- URL Server (wajib): alamat server BlueBubbles (misalnya,
http://192.168.1.100:1234) - Password (wajib): kata sandi API dari pengaturan BlueBubbles Server
- Path webhook (opsional): default ke
/bluebubbles-webhook - Kebijakan DM: pairing, allowlist, open, atau disabled
- Daftar izinkan: nomor telepon, email, atau target chat
Kontrol akses (DM + grup)
DM:- Default:
channels.bluebubbles.dmPolicy = "pairing". - Pengirim yang tidak dikenal menerima kode pairing; pesan diabaikan sampai disetujui (kode kedaluwarsa setelah 1 jam).
- Setujui melalui:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- Pairing adalah pertukaran token default. Detail: Pairing
channels.bluebubbles.groupPolicy = open | allowlist | disabled(default:allowlist).channels.bluebubbles.groupAllowFrommengontrol siapa yang dapat memicu di grup ketikaallowlistditetapkan.
Pengayaan nama kontak (macOS, opsional)
Webhook grup BlueBubbles sering kali hanya menyertakan alamat peserta mentah. Jika Anda ingin konteksGroupMembers menampilkan nama kontak lokal sebagai gantinya, Anda dapat memilih pengayaan Contacts lokal di macOS:
channels.bluebubbles.enrichGroupParticipantsFromContacts = truemengaktifkan lookup. Default:false.- Lookup hanya dijalankan setelah akses grup, otorisasi perintah, dan penggatingan mention mengizinkan pesan lolos.
- Hanya peserta telepon tanpa nama yang diperkaya.
- Nomor telepon mentah tetap menjadi fallback saat tidak ditemukan kecocokan lokal.
Penggatingan mention (grup)
BlueBubbles mendukung penggatingan mention untuk chat grup, selaras dengan perilaku iMessage/WhatsApp:- Menggunakan
agents.list[].groupChat.mentionPatterns(ataumessages.groupChat.mentionPatterns) untuk mendeteksi mention. - Ketika
requireMentiondiaktifkan untuk sebuah grup, agen hanya merespons saat disebut. - Perintah kontrol dari pengirim yang berwenang melewati penggatingan mention.
Penggatingan perintah
- Perintah kontrol (misalnya,
/config,/model) memerlukan otorisasi. - Menggunakan
allowFromdangroupAllowFromuntuk menentukan otorisasi perintah. - Pengirim yang berwenang dapat menjalankan perintah kontrol bahkan tanpa mention di grup.
Binding percakapan ACP
Chat BlueBubbles dapat diubah menjadi workspace ACP yang persisten tanpa mengubah lapisan transport. Alur operator cepat:- Jalankan
/acp spawn codex --bind heredi dalam DM atau chat grup yang diizinkan. - Pesan berikutnya dalam percakapan BlueBubbles yang sama akan dirutekan ke sesi ACP yang telah di-spawn.
/newdan/resetmereset sesi ACP terikat yang sama di tempat./acp closemenutup sesi ACP dan menghapus binding.
bindings[] tingkat atas dengan type: "acp" dan match.channel: "bluebubbles".
match.peer.id dapat menggunakan bentuk target BlueBubbles yang didukung:
- handle DM yang dinormalisasi seperti
+15555550123atauuser@example.com chat_id:<id>chat_guid:<guid>chat_identifier:<identifier>
chat_id:* atau chat_identifier:*.
Contoh:
Mengetik + tanda baca
- Indikator mengetik: Dikirim secara otomatis sebelum dan selama pembuatan respons.
- Tanda baca: Dikontrol oleh
channels.bluebubbles.sendReadReceipts(default:true). - Indikator mengetik: OpenClaw mengirim event mulai mengetik; BlueBubbles menghapus status mengetik secara otomatis saat mengirim atau saat timeout (penghentian manual via DELETE tidak andal).
Tindakan lanjutan
BlueBubbles mendukung tindakan pesan lanjutan saat diaktifkan di konfigurasi:- react: Tambahkan/hapus reaksi tapback (
messageId,emoji,remove) - edit: Edit pesan yang telah dikirim (
messageId,text) - unsend: Batalkan kirim pesan (
messageId) - reply: Balas pesan tertentu (
messageId,text,to) - sendWithEffect: Kirim dengan efek iMessage (
text,to,effectId) - renameGroup: Ganti nama chat grup (
chatGuid,displayName) - setGroupIcon: Setel ikon/foto chat grup (
chatGuid,media) — tidak stabil di macOS 26 Tahoe (API mungkin mengembalikan sukses tetapi ikon tidak tersinkron). - addParticipant: Tambahkan seseorang ke grup (
chatGuid,address) - removeParticipant: Hapus seseorang dari grup (
chatGuid,address) - leaveGroup: Keluar dari chat grup (
chatGuid) - upload-file: Kirim media/file (
to,buffer,filename,asVoice)- Memo suara: setel
asVoice: truedengan audio MP3 atau CAF untuk mengirim sebagai pesan suara iMessage. BlueBubbles mengonversi MP3 → CAF saat mengirim memo suara.
- Memo suara: setel
- Alias lama:
sendAttachmentmasih berfungsi, tetapiupload-fileadalah nama tindakan kanonis.
ID pesan (singkat vs penuh)
OpenClaw dapat menampilkan ID pesan singkat (misalnya,1, 2) untuk menghemat token.
MessageSid/ReplyToIddapat berupa ID singkat.MessageSidFull/ReplyToIdFullberisi ID penuh provider.- ID singkat berada di memori; ID ini dapat kedaluwarsa saat restart atau pengusiran cache.
- Tindakan menerima
messageIdsingkat atau penuh, tetapi ID singkat akan menghasilkan error jika sudah tidak tersedia.
- Template:
{{MessageSidFull}},{{ReplyToIdFull}} - Konteks:
MessageSidFull/ReplyToIdFulldi payload masuk
Streaming blok
Kontrol apakah respons dikirim sebagai satu pesan atau di-stream dalam blok:Media + batasan
- Lampiran masuk diunduh dan disimpan di cache media.
- Batas media melalui
channels.bluebubbles.mediaMaxMbuntuk media masuk dan keluar (default: 8 MB). - Teks keluar dipecah menjadi
channels.bluebubbles.textChunkLimit(default: 4000 karakter).
Referensi konfigurasi
Konfigurasi lengkap: Konfigurasi Opsi provider:channels.bluebubbles.enabled: Aktifkan/nonaktifkan channel.channels.bluebubbles.serverUrl: URL dasar API REST BlueBubbles.channels.bluebubbles.password: Kata sandi API.channels.bluebubbles.webhookPath: Path endpoint webhook (default:/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(default:pairing).channels.bluebubbles.allowFrom: allowlist DM (handle, email, nomor E.164,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(default:allowlist).channels.bluebubbles.groupAllowFrom: allowlist pengirim grup.channels.bluebubbles.enrichGroupParticipantsFromContacts: Di macOS, secara opsional memperkaya peserta grup tanpa nama dari Contacts lokal setelah gating lolos. Default:false.channels.bluebubbles.groups: Konfigurasi per grup (requireMention, dll.).channels.bluebubbles.sendReadReceipts: Kirim tanda baca (default:true).channels.bluebubbles.blockStreaming: Aktifkan streaming blok (default:false; diperlukan untuk balasan streaming).channels.bluebubbles.textChunkLimit: Ukuran potongan keluar dalam karakter (default: 4000).channels.bluebubbles.chunkMode:length(default) membagi hanya saat melebihitextChunkLimit;newlinemembagi pada baris kosong (batas paragraf) sebelum pemotongan berdasarkan panjang.channels.bluebubbles.mediaMaxMb: Batas media masuk/keluar dalam MB (default: 8).channels.bluebubbles.mediaLocalRoots: allowlist eksplisit direktori lokal absolut yang diizinkan untuk path media lokal keluar. Pengiriman path lokal ditolak secara default kecuali ini dikonfigurasi. Override per akun:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: Maks pesan grup untuk konteks (0 menonaktifkan).channels.bluebubbles.dmHistoryLimit: Batas riwayat DM.channels.bluebubbles.actions: Aktifkan/nonaktifkan tindakan tertentu.channels.bluebubbles.accounts: Konfigurasi multi-akun.
agents.list[].groupChat.mentionPatterns(ataumessages.groupChat.mentionPatterns).messages.responsePrefix.
Pengalamatan / target pengiriman
Utamakanchat_guid untuk perutean yang stabil:
chat_guid:iMessage;-;+15555550123(disarankan untuk grup)chat_id:123chat_identifier:...- Handle langsung:
+15555550123,user@example.com- Jika handle langsung tidak memiliki chat DM yang sudah ada, OpenClaw akan membuatnya melalui
POST /api/v1/chat/new. Ini mengharuskan BlueBubbles Private API diaktifkan.
- Jika handle langsung tidak memiliki chat DM yang sudah ada, OpenClaw akan membuatnya melalui
Keamanan
- Permintaan webhook diautentikasi dengan membandingkan parameter query atau header
guid/passworddenganchannels.bluebubbles.password. - Jaga kerahasiaan kata sandi API dan endpoint webhook (perlakukan keduanya seperti kredensial).
- Tidak ada bypass localhost untuk autentikasi webhook BlueBubbles. Jika Anda mem-proxy lalu lintas webhook, pertahankan kata sandi BlueBubbles pada permintaan secara end-to-end.
gateway.trustedProxiestidak menggantikanchannels.bluebubbles.passworddi sini. Lihat Keamanan gateway. - Aktifkan HTTPS + aturan firewall pada server BlueBubbles jika diekspos di luar LAN Anda.
Pemecahan masalah
- Jika event mengetik/baca berhenti berfungsi, periksa log webhook BlueBubbles dan verifikasi path gateway cocok dengan
channels.bluebubbles.webhookPath. - Kode pairing kedaluwarsa setelah satu jam; gunakan
openclaw pairing list bluebubblesdanopenclaw pairing approve bluebubbles <code>. - Reaksi memerlukan BlueBubbles private API (
POST /api/v1/message/react); pastikan versi server mengeksposnya. - Edit/batalkan kirim memerlukan macOS 13+ dan versi server BlueBubbles yang kompatibel. Di macOS 26 (Tahoe), edit saat ini rusak karena perubahan private API.
- Pembaruan ikon grup bisa tidak stabil di macOS 26 (Tahoe): API mungkin mengembalikan sukses tetapi ikon baru tidak tersinkron.
- OpenClaw secara otomatis menyembunyikan tindakan yang diketahui rusak berdasarkan versi macOS server BlueBubbles. Jika edit masih muncul di macOS 26 (Tahoe), nonaktifkan secara manual dengan
channels.bluebubbles.actions.edit=false. - Untuk info status/kesehatan:
openclaw status --allatauopenclaw status --deep.
Terkait
- Ikhtisar Channels — semua channel yang didukung
- Pairing — autentikasi DM dan alur pairing
- Groups — perilaku chat grup dan penggatingan mention
- Perutean Channel — perutean sesi untuk pesan
- Keamanan — model akses dan hardening