BlueBubbles (macOS REST)
Status: gebündeltes Plugin, das über HTTP mit dem BlueBubbles-macOS-Server kommuniziert. Empfohlen für die iMessage-Integration aufgrund der umfangreicheren API und der einfacheren Einrichtung im Vergleich zum Legacy-imsg-Kanal.Gebündeltes Plugin
Aktuelle OpenClaw-Releases enthalten BlueBubbles gebündelt, daher benötigen normale gepackte Builds keinen separaten Schrittopenclaw plugins install.
Überblick
- Läuft auf macOS über die BlueBubbles-Hilfs-App (bluebubbles.app).
- Empfohlen/getestet: macOS Sequoia (15). macOS Tahoe (26) funktioniert; Bearbeiten ist auf Tahoe derzeit defekt, und Aktualisierungen des Gruppensymbols können Erfolg melden, aber nicht synchronisiert werden.
- OpenClaw kommuniziert damit über dessen REST-API (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - Eingehende Nachrichten kommen über Webhooks an; ausgehende Antworten, Tippindikatoren, Lesebestätigungen und Tapbacks sind REST-Aufrufe.
- Anhänge und Sticker werden als eingehende Medien aufgenommen (und wenn möglich dem Agent zur Verfügung gestellt).
- Pairing/Allowlist funktioniert wie bei anderen Kanälen (
/channels/pairingusw.) mitchannels.bluebubbles.allowFrom+ Pairing-Codes. - Reaktionen werden genau wie bei Slack/Telegram als Systemereignisse bereitgestellt, sodass Agents sie vor dem Antworten „erwähnen“ können.
- Erweiterte Funktionen: Bearbeiten, Zurückziehen, Antwort-Threading, Nachrichteneffekte, Gruppenverwaltung.
Schnellstart
- Installieren Sie den BlueBubbles-Server auf Ihrem Mac (folgen Sie den Anweisungen unter bluebubbles.app/install).
- Aktivieren Sie in der BlueBubbles-Konfiguration die Web-API und legen Sie ein Passwort fest.
-
Führen Sie
openclaw onboardaus und wählen Sie BlueBubbles aus, oder konfigurieren Sie es manuell: -
Leiten Sie BlueBubbles-Webhooks an Ihr Gateway weiter (Beispiel:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). - Starten Sie das Gateway; es registriert den Webhook-Handler und startet das Pairing.
- Legen Sie immer ein Webhook-Passwort fest.
- Webhook-Authentifizierung ist immer erforderlich. OpenClaw lehnt BlueBubbles-Webhook-Anfragen ab, sofern sie kein Passwort/keine GUID enthalten, das bzw. die mit
channels.bluebubbles.passwordübereinstimmt (zum Beispiel?password=<password>oderx-password), unabhängig von der Loopback-/Proxy-Topologie. - Die Passwortauthentifizierung wird geprüft, bevor vollständige Webhook-Bodys gelesen/geparst werden.
Messages.app aktiv halten (VM-/Headless-Setups)
Einige macOS-VM-/Always-on-Setups können dazu führen, dass Messages.app in einen „Leerlauf“ gerät (eingehende Ereignisse stoppen, bis die App geöffnet/in den Vordergrund gebracht wird). Eine einfache Umgehung besteht darin, Messages alle 5 Minuten anzustoßen, mithilfe eines AppleScript + LaunchAgent.1) Das AppleScript speichern
Speichern Sie dies als:~/Scripts/poke-messages.scpt
2) Einen LaunchAgent installieren
Speichern Sie dies als:~/Library/LaunchAgents/com.user.poke-messages.plist
- Dies wird alle 300 Sekunden und bei der Anmeldung ausgeführt.
- Der erste Lauf kann macOS-Automation-Aufforderungen auslösen (
osascript→ Messages). Bestätigen Sie diese in derselben Benutzersitzung, in der der LaunchAgent ausgeführt wird.
Onboarding
BlueBubbles ist im interaktiven Onboarding verfügbar:- Server-URL (erforderlich): Adresse des BlueBubbles-Servers (z. B.
http://192.168.1.100:1234) - Passwort (erforderlich): API-Passwort aus den BlueBubbles-Servereinstellungen
- Webhook-Pfad (optional): Standard ist
/bluebubbles-webhook - DM-Richtlinie: pairing, allowlist, open oder disabled
- Allowlist: Telefonnummern, E-Mail-Adressen oder Chat-Ziele
Zugriffskontrolle (DMs + Gruppen)
DMs:- Standard:
channels.bluebubbles.dmPolicy = "pairing". - Unbekannte Absender erhalten einen Pairing-Code; Nachrichten werden ignoriert, bis sie genehmigt werden (Codes verfallen nach 1 Stunde).
- Genehmigung über:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- Pairing ist der Standard-Tokenaustausch. Details: Pairing
channels.bluebubbles.groupPolicy = open | allowlist | disabled(Standard:allowlist).channels.bluebubbles.groupAllowFromsteuert, wer in Gruppen auslösen kann, wennallowlistgesetzt ist.
Anreicherung von Kontaktnamen (macOS, optional)
BlueBubbles-Gruppen-Webhooks enthalten oft nur rohe Teilnehmeradressen. Wenn der KontextGroupMembers stattdessen lokale Kontaktnamen anzeigen soll, können Sie optional die lokale Kontakte-Anreicherung auf macOS aktivieren:
channels.bluebubbles.enrichGroupParticipantsFromContacts = trueaktiviert die Suche. Standard:false.- Suchen werden erst ausgeführt, nachdem Gruppenzugriff, Befehlsautorisierung und Mention-Gating die Nachricht durchgelassen haben.
- Nur unbenannte Teilnehmer mit Telefonnummern werden angereichert.
- Rohe Telefonnummern bleiben die Fallback-Option, wenn keine lokale Übereinstimmung gefunden wird.
Mention-Gating (Gruppen)
BlueBubbles unterstützt Mention-Gating für Gruppenchats und entspricht damit dem Verhalten von iMessage/WhatsApp:- Verwendet
agents.list[].groupChat.mentionPatterns(odermessages.groupChat.mentionPatterns) zur Erkennung von Erwähnungen. - Wenn
requireMentionfür eine Gruppe aktiviert ist, antwortet der Agent nur, wenn er erwähnt wird. - Steuerbefehle von autorisierten Absendern umgehen Mention-Gating.
Command-Gating
- Steuerbefehle (z. B.
/config,/model) erfordern eine Autorisierung. - Verwendet
allowFromundgroupAllowFrom, um die Befehlsautorisierung zu bestimmen. - Autorisierte Absender können Steuerbefehle auch ohne Erwähnung in Gruppen ausführen.
ACP-Konversationsbindungen
BlueBubbles-Chats können in dauerhafte ACP-Workspaces umgewandelt werden, ohne die Transportebene zu ändern. Schneller Operator-Ablauf:- Führen Sie
/acp spawn codex --bind hereinnerhalb der DM oder des erlaubten Gruppenchats aus. - Zukünftige Nachrichten in derselben BlueBubbles-Konversation werden an die gestartete ACP-Sitzung weitergeleitet.
/newund/resetsetzen dieselbe gebundene ACP-Sitzung direkt zurück./acp closeschließt die ACP-Sitzung und entfernt die Bindung.
bindings[] mit type: "acp" und match.channel: "bluebubbles" unterstützt.
match.peer.id kann jede unterstützte BlueBubbles-Zielform verwenden:
- normalisierter DM-Identifier wie
+15555550123oderuser@example.com chat_id:<id>chat_guid:<guid>chat_identifier:<identifier>
chat_id:* oder chat_identifier:* bevorzugen.
Beispiel:
Tippindikatoren + Lesebestätigungen
- Tippindikatoren: Werden automatisch vor und während der Antwortgenerierung gesendet.
- Lesebestätigungen: Gesteuert durch
channels.bluebubbles.sendReadReceipts(Standard:true). - Tippindikatoren: OpenClaw sendet Tippstart-Ereignisse; BlueBubbles entfernt die Tippanzeige beim Senden oder nach einem Timeout automatisch (manuelles Stoppen per DELETE ist unzuverlässig).
Erweiterte Aktionen
BlueBubbles unterstützt erweiterte Nachrichtenaktionen, wenn sie in der Konfiguration aktiviert sind:- react: Tapback-Reaktionen hinzufügen/entfernen (
messageId,emoji,remove) - edit: Eine gesendete Nachricht bearbeiten (
messageId,text) - unsend: Eine Nachricht zurückziehen (
messageId) - reply: Auf eine bestimmte Nachricht antworten (
messageId,text,to) - sendWithEffect: Mit iMessage-Effekt senden (
text,to,effectId) - renameGroup: Einen Gruppenchat umbenennen (
chatGuid,displayName) - setGroupIcon: Das Symbol/Foto eines Gruppenchats setzen (
chatGuid,media) — unzuverlässig auf macOS 26 Tahoe (API kann Erfolg zurückgeben, aber das Symbol wird nicht synchronisiert). - addParticipant: Jemanden zu einer Gruppe hinzufügen (
chatGuid,address) - removeParticipant: Jemanden aus einer Gruppe entfernen (
chatGuid,address) - leaveGroup: Einen Gruppenchat verlassen (
chatGuid) - upload-file: Medien/Dateien senden (
to,buffer,filename,asVoice)- Sprachnachrichten: Setzen Sie
asVoice: truemit MP3- oder CAF-Audio, um als iMessage-Sprachnachricht zu senden. BlueBubbles konvertiert MP3 → CAF beim Senden von Sprachnachrichten.
- Sprachnachrichten: Setzen Sie
- Legacy-Alias:
sendAttachmentfunktioniert weiterhin, aberupload-fileist der kanonische Aktionsname.
Nachrichten-IDs (kurz vs. vollständig)
OpenClaw kann kurze Nachrichten-IDs (z. B.1, 2) bereitstellen, um Tokens zu sparen.
MessageSid/ReplyToIdkönnen kurze IDs sein.MessageSidFull/ReplyToIdFullenthalten die vollständigen IDs des Providers.- Kurze IDs sind im Speicher; sie können nach Neustart oder Cache-Eviction ablaufen.
- Aktionen akzeptieren kurze oder vollständige
messageId, aber kurze IDs führen zu Fehlern, wenn sie nicht mehr verfügbar sind.
- Templates:
{{MessageSidFull}},{{ReplyToIdFull}} - Kontext:
MessageSidFull/ReplyToIdFullin eingehenden Payloads
Block-Streaming
Steuern Sie, ob Antworten als einzelne Nachricht gesendet oder in Blöcken gestreamt werden:Medien + Limits
- Eingehende Anhänge werden heruntergeladen und im Medien-Cache gespeichert.
- Medienlimit über
channels.bluebubbles.mediaMaxMbfür eingehende und ausgehende Medien (Standard: 8 MB). - Ausgehender Text wird auf
channels.bluebubbles.textChunkLimitaufgeteilt (Standard: 4000 Zeichen).
Konfigurationsreferenz
Vollständige Konfiguration: Konfiguration Provider-Optionen:channels.bluebubbles.enabled: Kanal aktivieren/deaktivieren.channels.bluebubbles.serverUrl: Basis-URL der BlueBubbles-REST-API.channels.bluebubbles.password: API-Passwort.channels.bluebubbles.webhookPath: Webhook-Endpunktpfad (Standard:/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(Standard:pairing).channels.bluebubbles.allowFrom: DM-Allowlist (Handles, E-Mail-Adressen, E.164-Nummern,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(Standard:allowlist).channels.bluebubbles.groupAllowFrom: Allowlist für Gruppenabsender.channels.bluebubbles.enrichGroupParticipantsFromContacts: Auf macOS optional unbenannte Gruppenteilnehmer aus lokalen Kontakten anreichern, nachdem das Gating erfolgreich war. Standard:false.channels.bluebubbles.groups: Konfiguration pro Gruppe (requireMentionusw.).channels.bluebubbles.sendReadReceipts: Lesebestätigungen senden (Standard:true).channels.bluebubbles.blockStreaming: Block-Streaming aktivieren (Standard:false; erforderlich für Streaming-Antworten).channels.bluebubbles.textChunkLimit: Größe ausgehender Blöcke in Zeichen (Standard: 4000).channels.bluebubbles.chunkMode:length(Standard) teilt nur, wenntextChunkLimitüberschritten wird;newlineteilt an Leerzeilen (Absatzgrenzen) vor der Längenaufteilung.channels.bluebubbles.mediaMaxMb: Limit für eingehende/ausgehende Medien in MB (Standard: 8).channels.bluebubbles.mediaLocalRoots: Explizite Allowlist absoluter lokaler Verzeichnisse, die für ausgehende lokale Medienpfade erlaubt sind. Das Senden lokaler Pfade ist standardmäßig verweigert, sofern dies nicht konfiguriert ist. Überschreibung pro Account:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: Maximale Anzahl von Gruppennachrichten für den Kontext (0 deaktiviert).channels.bluebubbles.dmHistoryLimit: DM-Verlaufslimit.channels.bluebubbles.actions: Bestimmte Aktionen aktivieren/deaktivieren.channels.bluebubbles.accounts: Multi-Account-Konfiguration.
agents.list[].groupChat.mentionPatterns(odermessages.groupChat.mentionPatterns).messages.responsePrefix.
Adressierung / Zustellziele
Bevorzugen Siechat_guid für stabiles Routing:
chat_guid:iMessage;-;+15555550123(bevorzugt für Gruppen)chat_id:123chat_identifier:...- Direkte Handles:
+15555550123,user@example.com- Wenn für ein direktes Handle kein bestehender DM-Chat vorhanden ist, erstellt OpenClaw einen über
POST /api/v1/chat/new. Dafür muss die BlueBubbles-Private-API aktiviert sein.
- Wenn für ein direktes Handle kein bestehender DM-Chat vorhanden ist, erstellt OpenClaw einen über
Sicherheit
- Webhook-Anfragen werden authentifiziert, indem Query-Parameter oder Header
guid/passwordmitchannels.bluebubbles.passwordverglichen werden. - Halten Sie das API-Passwort und den Webhook-Endpunkt geheim (behandeln Sie sie wie Anmeldeinformationen).
- Es gibt keinen localhost-Bypass für die BlueBubbles-Webhook-Authentifizierung. Wenn Sie Webhook-Datenverkehr per Proxy weiterleiten, halten Sie das BlueBubbles-Passwort in der Anfrage durchgehend bei.
gateway.trustedProxiesersetzt hier nichtchannels.bluebubbles.password. Siehe Gateway-Sicherheit. - Aktivieren Sie HTTPS + Firewall-Regeln auf dem BlueBubbles-Server, wenn Sie ihn außerhalb Ihres LAN bereitstellen.
Fehlerbehebung
- Wenn Tipp-/Leseereignisse nicht mehr funktionieren, prüfen Sie die BlueBubbles-Webhook-Logs und verifizieren Sie, dass der Gateway-Pfad mit
channels.bluebubbles.webhookPathübereinstimmt. - Pairing-Codes verfallen nach einer Stunde; verwenden Sie
openclaw pairing list bluebubblesundopenclaw pairing approve bluebubbles <code>. - Reaktionen erfordern die BlueBubbles-Private-API (
POST /api/v1/message/react); stellen Sie sicher, dass die Serverversion sie bereitstellt. - Bearbeiten/Zurückziehen erfordern macOS 13+ und eine kompatible BlueBubbles-Serverversion. Unter macOS 26 (Tahoe) ist Bearbeiten derzeit aufgrund von Änderungen an der Private-API defekt.
- Aktualisierungen des Gruppensymbols können auf macOS 26 (Tahoe) unzuverlässig sein: Die API kann Erfolg melden, aber das neue Symbol wird nicht synchronisiert.
- OpenClaw blendet bekannte defekte Aktionen basierend auf der macOS-Version des BlueBubbles-Servers automatisch aus. Wenn Bearbeiten auf macOS 26 (Tahoe) weiterhin angezeigt wird, deaktivieren Sie es manuell mit
channels.bluebubbles.actions.edit=false. - Für Status-/Health-Informationen:
openclaw status --alloderopenclaw status --deep.
Verwandt
- Kanäle im Überblick — alle unterstützten Kanäle
- Pairing — DM-Authentifizierung und Pairing-Ablauf
- Gruppen — Verhalten von Gruppenchats und Mention-Gating
- Kanal-Routing — Sitzungsrouting für Nachrichten
- Sicherheit — Zugriffsmodell und Härtung