BlueBubbles (REST macOS)
Stato: plugin incluso che comunica con il server macOS BlueBubbles tramite HTTP. Consigliato per l’integrazione con iMessage grazie alla sua API più ricca e alla configurazione più semplice rispetto al canale imsg legacy.Plugin incluso
Le attuali release di OpenClaw includono BlueBubbles, quindi le normali build pacchettizzate non richiedono un passaggio separatoopenclaw plugins install.
Panoramica
- Funziona su macOS tramite l’app helper BlueBubbles (bluebubbles.app).
- Consigliato/testato: macOS Sequoia (15). macOS Tahoe (26) funziona; la modifica è attualmente non funzionante su Tahoe e gli aggiornamenti dell’icona di gruppo possono risultare riusciti ma non sincronizzarsi.
- OpenClaw comunica con esso tramite la sua API REST (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - I messaggi in ingresso arrivano tramite webhook; le risposte in uscita, gli indicatori di digitazione, le conferme di lettura e i tapback sono chiamate REST.
- Gli allegati e gli sticker vengono acquisiti come media in ingresso (e mostrati all’agente quando possibile).
- Il pairing/la allowlist funziona come per gli altri canali (
/channels/pairingecc.) conchannels.bluebubbles.allowFrom+ codici di pairing. - Le reazioni vengono mostrate come eventi di sistema proprio come in Slack/Telegram, così gli agenti possono “menzionarle” prima di rispondere.
- Funzionalità avanzate: modifica, annullamento invio, thread di risposta, effetti messaggio, gestione dei gruppi.
Avvio rapido
- Installa il server BlueBubbles sul tuo Mac (segui le istruzioni su bluebubbles.app/install).
- Nella configurazione di BlueBubbles, abilita la web API e imposta una password.
-
Esegui
openclaw onboarde seleziona BlueBubbles, oppure configura manualmente: -
Punta i webhook BlueBubbles al tuo gateway (esempio:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). - Avvia il gateway; registrerà il gestore del webhook e avvierà il pairing.
- Imposta sempre una password per il webhook.
- L’autenticazione del webhook è sempre obbligatoria. OpenClaw rifiuta le richieste webhook BlueBubbles a meno che non includano una password/guid che corrisponda a
channels.bluebubbles.password(ad esempio?password=<password>ox-password), indipendentemente dalla topologia loopback/proxy. - L’autenticazione tramite password viene verificata prima di leggere/analizzare i corpi completi dei webhook.
Mantenere attiva Messages.app (VM / configurazioni headless)
Alcune configurazioni macOS VM / always-on possono portare Messages.app a entrare in stato di “idle” (gli eventi in ingresso si interrompono finché l’app non viene aperta/portata in primo piano). Un semplice workaround consiste nel sollecitare Messages ogni 5 minuti usando un AppleScript + LaunchAgent.1) Salva l’AppleScript
Salvalo come:~/Scripts/poke-messages.scpt
2) Installa un LaunchAgent
Salvalo come:~/Library/LaunchAgents/com.user.poke-messages.plist
- Viene eseguito ogni 300 secondi e all’accesso.
- La prima esecuzione può attivare richieste macOS di Automazione (
osascript→ Messages). Approvale nella stessa sessione utente che esegue il LaunchAgent.
Onboarding
BlueBubbles è disponibile nell’onboarding interattivo:- URL del server (obbligatorio): indirizzo del server BlueBubbles (ad es.
http://192.168.1.100:1234) - Password (obbligatoria): password API dalle impostazioni di BlueBubbles Server
- Percorso webhook (facoltativo): valore predefinito
/bluebubbles-webhook - Criterio DM: pairing, allowlist, open o disabled
- Allow list: numeri di telefono, email o destinazioni chat
Controllo accessi (DM + gruppi)
DM:- Predefinito:
channels.bluebubbles.dmPolicy = "pairing". - I mittenti sconosciuti ricevono un codice di pairing; i messaggi vengono ignorati finché non vengono approvati (i codici scadono dopo 1 ora).
- Approva tramite:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- Il pairing è lo scambio di token predefinito. Dettagli: Pairing
channels.bluebubbles.groupPolicy = open | allowlist | disabled(predefinito:allowlist).channels.bluebubbles.groupAllowFromcontrolla chi può attivare nei gruppi quando è impostatoallowlist.
Arricchimento dei nomi contatto (macOS, facoltativo)
I webhook di gruppo BlueBubbles spesso includono solo gli indirizzi grezzi dei partecipanti. Se invece vuoi che il contestoGroupMembers mostri i nomi dei contatti locali, puoi attivare facoltativamente l’arricchimento dai Contatti locali su macOS:
channels.bluebubbles.enrichGroupParticipantsFromContacts = trueabilita la ricerca. Predefinito:false.- Le ricerche vengono eseguite solo dopo che accesso al gruppo, autorizzazione dei comandi e gating delle menzioni hanno consentito il passaggio del messaggio.
- Vengono arricchiti solo i partecipanti telefonici senza nome.
- I numeri di telefono grezzi restano il fallback quando non viene trovata alcuna corrispondenza locale.
Gating delle menzioni (gruppi)
BlueBubbles supporta il gating delle menzioni per le chat di gruppo, in linea con il comportamento di iMessage/WhatsApp:- Usa
agents.list[].groupChat.mentionPatterns(oppuremessages.groupChat.mentionPatterns) per rilevare le menzioni. - Quando
requireMentionè abilitato per un gruppo, l’agente risponde solo quando viene menzionato. - I comandi di controllo dei mittenti autorizzati bypassano il gating delle menzioni.
Gating dei comandi
- I comandi di controllo (ad es.
/config,/model) richiedono autorizzazione. - Usa
allowFromegroupAllowFromper determinare l’autorizzazione ai comandi. - I mittenti autorizzati possono eseguire comandi di controllo anche senza menzione nei gruppi.
Binding conversazione ACP
Le chat BlueBubbles possono essere trasformate in workspace ACP persistenti senza cambiare il livello di trasporto. Flusso rapido per l’operatore:- Esegui
/acp spawn codex --bind hereall’interno del DM o del gruppo consentito. - I messaggi futuri in quella stessa conversazione BlueBubbles verranno instradati alla sessione ACP generata.
/newe/resetreimpostano sul posto la stessa sessione ACP associata./acp closechiude la sessione ACP e rimuove il binding.
bindings[] di primo livello con type: "acp" e match.channel: "bluebubbles".
match.peer.id può usare qualsiasi formato di destinazione BlueBubbles supportato:
- handle DM normalizzato come
+15555550123ouser@example.com chat_id:<id>chat_guid:<guid>chat_identifier:<identifier>
chat_id:* o chat_identifier:*.
Esempio:
Digitazione + conferme di lettura
- Indicatori di digitazione: inviati automaticamente prima e durante la generazione della risposta.
- Conferme di lettura: controllate da
channels.bluebubbles.sendReadReceipts(predefinito:true). - Indicatori di digitazione: OpenClaw invia eventi di avvio digitazione; BlueBubbles cancella automaticamente la digitazione all’invio o al timeout (l’arresto manuale tramite DELETE non è affidabile).
Azioni avanzate
BlueBubbles supporta azioni avanzate sui messaggi quando abilitate nella configurazione:- react: aggiunge/rimuove reazioni tapback (
messageId,emoji,remove) - edit: modifica un messaggio inviato (
messageId,text) - unsend: annulla l’invio di un messaggio (
messageId) - reply: risponde a un messaggio specifico (
messageId,text,to) - sendWithEffect: invia con effetto iMessage (
text,to,effectId) - renameGroup: rinomina una chat di gruppo (
chatGuid,displayName) - setGroupIcon: imposta l’icona/foto di una chat di gruppo (
chatGuid,media) — può essere instabile su macOS 26 Tahoe (l’API può restituire successo ma l’icona non si sincronizza). - addParticipant: aggiunge qualcuno a un gruppo (
chatGuid,address) - removeParticipant: rimuove qualcuno da un gruppo (
chatGuid,address) - leaveGroup: esce da una chat di gruppo (
chatGuid) - upload-file: invia media/file (
to,buffer,filename,asVoice)- Memo vocali: imposta
asVoice: truecon audio MP3 o CAF per inviare un messaggio vocale iMessage. BlueBubbles converte MP3 → CAF durante l’invio dei memo vocali.
- Memo vocali: imposta
- Alias legacy:
sendAttachmentcontinua a funzionare, maupload-fileè il nome canonico dell’azione.
ID messaggio (brevi vs completi)
OpenClaw può esporre ID messaggio brevi (ad es.1, 2) per risparmiare token.
MessageSid/ReplyToIdpossono essere ID brevi.MessageSidFull/ReplyToIdFullcontengono gli ID completi del provider.- Gli ID brevi sono in memoria; possono scadere al riavvio o con l’espulsione della cache.
- Le azioni accettano
messageIdbrevi o completi, ma gli ID brevi restituiranno errore se non sono più disponibili.
- Template:
{{MessageSidFull}},{{ReplyToIdFull}} - Contesto:
MessageSidFull/ReplyToIdFullnei payload in ingresso
Streaming a blocchi
Controlla se le risposte vengono inviate come un singolo messaggio o in streaming a blocchi:Media + limiti
- Gli allegati in ingresso vengono scaricati e archiviati nella cache dei media.
- Limite dei media tramite
channels.bluebubbles.mediaMaxMbper i media in ingresso e in uscita (predefinito: 8 MB). - Il testo in uscita viene suddiviso in blocchi secondo
channels.bluebubbles.textChunkLimit(predefinito: 4000 caratteri).
Riferimento configurazione
Configurazione completa: Configuration Opzioni del provider:channels.bluebubbles.enabled: abilita/disabilita il canale.channels.bluebubbles.serverUrl: URL base dell’API REST BlueBubbles.channels.bluebubbles.password: password API.channels.bluebubbles.webhookPath: percorso endpoint del webhook (predefinito:/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(predefinito:pairing).channels.bluebubbles.allowFrom: allowlist DM (handle, email, numeri E.164,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(predefinito:allowlist).channels.bluebubbles.groupAllowFrom: allowlist dei mittenti di gruppo.channels.bluebubbles.enrichGroupParticipantsFromContacts: su macOS, arricchisce facoltativamente i partecipanti senza nome dei gruppi dai Contatti locali dopo il superamento del gating. Predefinito:false.channels.bluebubbles.groups: configurazione per gruppo (requireMention, ecc.).channels.bluebubbles.sendReadReceipts: invia conferme di lettura (predefinito:true).channels.bluebubbles.blockStreaming: abilita lo streaming a blocchi (predefinito:false; necessario per le risposte in streaming).channels.bluebubbles.textChunkLimit: dimensione dei blocchi in uscita in caratteri (predefinito: 4000).channels.bluebubbles.chunkMode:length(predefinito) divide solo quando superatextChunkLimit;newlinedivide sulle righe vuote (confini di paragrafo) prima della suddivisione per lunghezza.channels.bluebubbles.mediaMaxMb: limite media in ingresso/uscita in MB (predefinito: 8).channels.bluebubbles.mediaLocalRoots: allowlist esplicita di directory locali assolute consentite per i percorsi di media locali in uscita. L’invio tramite percorso locale è negato per impostazione predefinita a meno che questo non sia configurato. Override per account:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: numero massimo di messaggi di gruppo per il contesto (0 disabilita).channels.bluebubbles.dmHistoryLimit: limite cronologia DM.channels.bluebubbles.actions: abilita/disabilita azioni specifiche.channels.bluebubbles.accounts: configurazione multi-account.
agents.list[].groupChat.mentionPatterns(oppuremessages.groupChat.mentionPatterns).messages.responsePrefix.
Indirizzamento / destinazioni di consegna
Preferiscichat_guid per un instradamento stabile:
chat_guid:iMessage;-;+15555550123(preferito per i gruppi)chat_id:123chat_identifier:...- Handle diretti:
+15555550123,user@example.com- Se un handle diretto non ha una chat DM esistente, OpenClaw ne creerà una tramite
POST /api/v1/chat/new. Questo richiede che la BlueBubbles Private API sia abilitata.
- Se un handle diretto non ha una chat DM esistente, OpenClaw ne creerà una tramite
Sicurezza
- Le richieste webhook vengono autenticate confrontando i parametri query o header
guid/passwordconchannels.bluebubbles.password. - Mantieni segreti la password API e l’endpoint webhook (trattali come credenziali).
- Non esiste alcun bypass localhost per l’autenticazione webhook BlueBubbles. Se fai proxy del traffico webhook, mantieni la password BlueBubbles nella richiesta end-to-end.
gateway.trustedProxiesnon sostituisce quichannels.bluebubbles.password. Consulta Gateway security. - Abilita HTTPS + regole firewall sul server BlueBubbles se lo esponi al di fuori della tua LAN.
Risoluzione dei problemi
- Se gli eventi di digitazione/lettura smettono di funzionare, controlla i log del webhook BlueBubbles e verifica che il percorso del gateway corrisponda a
channels.bluebubbles.webhookPath. - I codici di pairing scadono dopo un’ora; usa
openclaw pairing list bluebubbleseopenclaw pairing approve bluebubbles <code>. - Le reazioni richiedono la BlueBubbles private API (
POST /api/v1/message/react); assicurati che la versione del server la esponga. - Modifica/annullamento invio richiedono macOS 13+ e una versione compatibile del server BlueBubbles. Su macOS 26 (Tahoe), la modifica è attualmente non funzionante a causa di cambiamenti della private API.
- Gli aggiornamenti dell’icona di gruppo possono essere instabili su macOS 26 (Tahoe): l’API può restituire successo ma la nuova icona non si sincronizza.
- OpenClaw nasconde automaticamente le azioni note come non funzionanti in base alla versione macOS del server BlueBubbles. Se la modifica compare ancora su macOS 26 (Tahoe), disabilitala manualmente con
channels.bluebubbles.actions.edit=false. - Per informazioni su stato/salute:
openclaw status --alloopenclaw status --deep.
Correlati
- Channels Overview — tutti i canali supportati
- Pairing — autenticazione DM e flusso di pairing
- Groups — comportamento delle chat di gruppo e gating delle menzioni
- Channel Routing — instradamento delle sessioni per i messaggi
- Security — modello di accesso e hardening