BlueBubbles (macOS REST)
Status: Mitgeliefertes Plugin, das über HTTP mit dem BlueBubbles macOS-Server kommuniziert. Empfohlen für die iMessage-Integration aufgrund der umfangreicheren API und einfacheren Einrichtung im Vergleich zum Legacy-imsg-Kanal.
Überblick
- Läuft auf macOS über die BlueBubbles-Hilfsapp (bluebubbles.app).
- Empfohlen/getestet: macOS Sequoia (15). macOS Tahoe (26) funktioniert; Bearbeiten ist auf Tahoe derzeit defekt, und Gruppensymbol-Aktualisierungen melden möglicherweise Erfolg, synchronisieren aber nicht.
- OpenClaw kommuniziert über die REST-API (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - Eingehende Nachrichten kommen via Webhooks; ausgehende Antworten, Tippindikatoren, Lesebestätigungen und Tapbacks sind REST-Aufrufe.
- Anhänge und Sticker werden als eingehende Medien aufgenommen (und dem Agent wenn möglich bereitgestellt).
- Pairing/Allowlist funktioniert wie bei anderen Kanälen (
/channels/pairingusw.) mitchannels.bluebubbles.allowFrom+ Pairing-Codes. - Reaktionen werden als Systemereignisse bereitgestellt, genau wie bei Slack/Telegram, sodass Agents sie vor der Antwort „erwähnen” können.
- Erweiterte Funktionen: Bearbeiten, Zurückziehen, Antwort-Threading, Nachrichteneffekte, Gruppenverwaltung.
Schnellstart
-
Installiere den BlueBubbles-Server auf deinem Mac (folge den Anweisungen unter bluebubbles.app/install).
-
Aktiviere in der BlueBubbles-Konfiguration die Web-API und setze ein Passwort.
-
Führe
openclaw onboardaus und wähle BlueBubbles, oder konfiguriere manuell:{ channels: { bluebubbles: { enabled: true, serverUrl: "http://192.168.1.100:1234", password: "example-password", webhookPath: "/bluebubbles-webhook", }, }, } -
Richte die BlueBubbles-Webhooks auf dein Gateway (Beispiel:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). -
Starte das Gateway; es registriert den Webhook-Handler und beginnt mit dem Pairing.
Sicherheitshinweis:
- Setze immer ein Webhook-Passwort.
- Webhook-Authentifizierung ist immer erforderlich. OpenClaw lehnt BlueBubbles-Webhook-Anfragen ab, sofern sie kein Passwort/GUID enthalten, das mit
channels.bluebubbles.passwordübereinstimmt (zum Beispiel?password=<password>oderx-password), unabhängig von Loopback-/Proxy-Topologie. - Die Passwortauthentifizierung wird geprüft, bevor vollständige Webhook-Bodies gelesen/geparst werden.
Messages.app aktiv halten (VM / Headless-Setups)
Einige macOS-VM-/Dauerbetrieb-Setups können dazu führen, dass Messages.app in den „Leerlauf” geht (eingehende Events stoppen, bis die App geöffnet/in den Vordergrund gebracht wird). Eine einfache Abhilfe ist, Messages alle 5 Minuten anzustoßen mit einem AppleScript + LaunchAgent.
1) AppleScript speichern
Speichere es als:
~/Scripts/poke-messages.scpt
Beispielskript (nicht-interaktiv; stiehlt keinen Fokus):
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) LaunchAgent installieren
Speichere es als:
~/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>
Hinweise:
- Dies wird alle 300 Sekunden und beim Login ausgeführt.
- Der erste Durchlauf kann macOS-Automation-Aufforderungen auslösen (
osascript-> Messages). Genehmige sie in derselben Benutzersitzung, die den LaunchAgent ausführt.
Laden:
launchctl unload ~/Library/LaunchAgents/com.user.poke-messages.plist 2>/dev/null || true
launchctl load ~/Library/LaunchAgents/com.user.poke-messages.plist
Onboarding
BlueBubbles ist im interaktiven Einrichtungsassistenten verfügbar:
openclaw onboard
Der Assistent fragt nach:
- Server-URL (erforderlich): BlueBubbles-Serveradresse (z. B.
http://192.168.1.100:1234) - Passwort (erforderlich): API-Passwort aus den BlueBubbles-Server-Einstellungen
- Webhook-Pfad (optional): Standard ist
/bluebubbles-webhook - DM-Richtlinie: pairing, allowlist, open oder disabled
- Allowlist: Telefonnummern, E-Mail-Adressen oder Chat-Ziele
Du kannst BlueBubbles auch über die CLI hinzufügen:
openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --password <password>
Zugriffssteuerung (DMs + Gruppen)
DMs:
- Standard:
channels.bluebubbles.dmPolicy = "pairing". - Unbekannte Absender erhalten einen Pairing-Code; Nachrichten werden ignoriert, bis sie genehmigt sind (Codes verfallen nach 1 Stunde).
- Genehmigung über:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- Pairing ist der Standard-Token-Austausch. Details: Pairing
Gruppen:
channels.bluebubbles.groupPolicy = open | allowlist | disabled(Standard:allowlist).channels.bluebubbles.groupAllowFromsteuert, wer in Gruppen auslösen kann, wennallowlistgesetzt ist.
Mention-Gating (Gruppen)
BlueBubbles unterstützt Mention-Gating für Gruppenchats, passend zum iMessage/WhatsApp-Verhalten:
- Verwendet
agents.list[].groupChat.mentionPatterns(odermessages.groupChat.mentionPatterns) zur Mention-Erkennung. - Wenn
requireMentionfür eine Gruppe aktiviert ist, antwortet der Agent nur bei Erwähnung. - Steuerbefehle von autorisierten Absendern umgehen das Mention-Gating.
Pro-Gruppen-Konfiguration:
{
channels: {
bluebubbles: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15555550123"],
groups: {
"*": { requireMention: true }, // Standard für alle Gruppen
"iMessage;-;chat123": { requireMention: false }, // Überschreibung für bestimmte Gruppe
},
},
},
}
Befehlsautorisierung
- Steuerbefehle (z. B.
/config,/model) erfordern Autorisierung. - Verwendet
allowFromundgroupAllowFromzur Bestimmung der Befehlsautorisierung. - Autorisierte Absender können Steuerbefehle in Gruppen auch ohne Erwähnung ausführen.
Tippanzeige + Lesebestätigungen
- Tippindikatoren: Werden automatisch vor und während der Antwortgenerierung gesendet.
- Lesebestätigungen: Gesteuert durch
channels.bluebubbles.sendReadReceipts(Standard:true). - Tippindikatoren: OpenClaw sendet Tipp-Start-Events; BlueBubbles löscht die Tippanzeige automatisch beim Senden oder Timeout (manuelles Stoppen via DELETE ist unzuverlässig).
{
channels: {
bluebubbles: {
sendReadReceipts: false, // Lesebestätigungen deaktivieren
},
},
}
Erweiterte Aktionen
BlueBubbles unterstützt erweiterte Nachrichtenaktionen, wenn sie in der Konfiguration aktiviert sind:
{
channels: {
bluebubbles: {
actions: {
reactions: true, // Tapbacks (Standard: true)
edit: true, // gesendete Nachrichten bearbeiten (macOS 13+, defekt auf macOS 26 Tahoe)
unsend: true, // Nachrichten zurückziehen (macOS 13+)
reply: true, // Antwort-Threading nach Nachrichten-GUID
sendWithEffect: true, // Nachrichteneffekte (Slam, Laut usw.)
renameGroup: true, // Gruppenchats umbenennen
setGroupIcon: true, // Gruppenchat-Symbol/Foto setzen (instabil auf macOS 26 Tahoe)
addParticipant: true, // Teilnehmer zu Gruppen hinzufügen
removeParticipant: true, // Teilnehmer aus Gruppen entfernen
leaveGroup: true, // Gruppenchats verlassen
sendAttachment: true, // Anhänge/Medien senden
},
},
},
}
Verfügbare Aktionen:
- react: Tapback-Reaktionen hinzufügen/entfernen (
messageId,emoji,remove) - edit: Gesendete Nachricht bearbeiten (
messageId,text) - unsend: Nachricht zurückziehen (
messageId) - reply: Auf bestimmte Nachricht antworten (
messageId,text,to) - sendWithEffect: Mit iMessage-Effekt senden (
text,to,effectId) - renameGroup: Gruppenchat umbenennen (
chatGuid,displayName) - setGroupIcon: Gruppenchat-Symbol/Foto setzen (
chatGuid,media) — instabil auf macOS 26 Tahoe (API meldet möglicherweise Erfolg, aber das Symbol synchronisiert nicht). - addParticipant: Jemanden zur Gruppe hinzufügen (
chatGuid,address) - removeParticipant: Jemanden aus der Gruppe entfernen (
chatGuid,address) - leaveGroup: Gruppenchat verlassen (
chatGuid) - sendAttachment: Medien/Dateien senden (
to,buffer,filename,asVoice)- Sprachnachrichten: Setze
asVoice: truemit MP3- oder CAF-Audio, um als iMessage-Sprachnachricht zu senden. BlueBubbles konvertiert MP3 zu CAF beim Senden von Sprachnachrichten.
- Sprachnachrichten: Setze
Nachrichten-IDs (kurz vs. vollständig)
OpenClaw kann kurze Nachrichten-IDs (z. B. 1, 2) bereitstellen, um Token zu sparen.
MessageSid/ReplyToIdkönnen kurze IDs sein.MessageSidFull/ReplyToIdFullenthalten die vollständigen Provider-IDs.- Kurze IDs sind im Speicher; sie können bei Neustart oder Cache-Eviction ablaufen.
- Aktionen akzeptieren kurze oder vollständige
messageId, aber kurze IDs ergeben einen Fehler, wenn sie nicht mehr verfügbar sind.
Verwende vollständige IDs für dauerhafte Automatisierungen und Speicherung:
- Templates:
{{MessageSidFull}},{{ReplyToIdFull}} - Kontext:
MessageSidFull/ReplyToIdFullin eingehenden Payloads
Siehe Configuration für Template-Variablen.
Block-Streaming
Steuere, ob Antworten als einzelne Nachricht oder in Blöcken gestreamt werden:
{
channels: {
bluebubbles: {
blockStreaming: true, // Block-Streaming aktivieren (standardmäßig aus)
},
},
}
Medien + Limits
- Eingehende Anhänge werden heruntergeladen und im Medien-Cache gespeichert.
- Medien-Obergrenze via
channels.bluebubbles.mediaMaxMbfür ein- und ausgehende Medien (Standard: 8 MB). - Ausgehender Text wird auf
channels.bluebubbles.textChunkLimitaufgeteilt (Standard: 4000 Zeichen).
Konfigurationsreferenz
Vollständige Konfiguration: Configuration
Provider-Optionen:
channels.bluebubbles.enabled: Kanal aktivieren/deaktivieren.channels.bluebubbles.serverUrl: BlueBubbles REST-API-Basis-URL.channels.bluebubbles.password: API-Passwort.channels.bluebubbles.webhookPath: Webhook-Endpunkt-Pfad (Standard:/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(Standard:pairing).channels.bluebubbles.allowFrom: DM-Allowlist (Handles, E-Mails, E.164-Nummern,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(Standard:allowlist).channels.bluebubbles.groupAllowFrom: Gruppen-Absender-Allowlist.channels.bluebubbles.groups: Pro-Gruppen-Konfiguration (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: Ausgehende Blockgröße in Zeichen (Standard: 4000).channels.bluebubbles.chunkMode:length(Standard) teilt nur auf, wenntextChunkLimitüberschritten wird;newlineteilt an Leerzeilen (Absatzgrenzen) vor dem Längen-Chunking.channels.bluebubbles.mediaMaxMb: Medien-Obergrenze ein-/ausgehend in MB (Standard: 8).channels.bluebubbles.mediaLocalRoots: Explizite Allowlist absoluter lokaler Verzeichnisse, die für ausgehende lokale Medienpfade erlaubt sind. Lokale Pfadsendungen werden standardmäßig verweigert, sofern dies nicht konfiguriert ist. Pro-Konto-Überschreibung:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: Max. Gruppennachrichten für Kontext (0 deaktiviert).channels.bluebubbles.dmHistoryLimit: DM-Verlaufslimit.channels.bluebubbles.actions: Bestimmte Aktionen aktivieren/deaktivieren.channels.bluebubbles.accounts: Multi-Account-Konfiguration.
Zugehörige globale Optionen:
agents.list[].groupChat.mentionPatterns(odermessages.groupChat.mentionPatterns).messages.responsePrefix.
Adressierung / Zustellziele
Bevorzuge chat_guid für stabiles Routing:
chat_guid:iMessage;-;+15555550123(bevorzugt für Gruppen)chat_id:123chat_identifier:...- Direkte Handles:
+15555550123,[email protected]- Wenn ein direktes Handle keinen bestehenden DM-Chat hat, erstellt OpenClaw einen via
POST /api/v1/chat/new. Dies erfordert, dass die BlueBubbles Private API aktiviert ist.
- Wenn ein direktes Handle keinen bestehenden DM-Chat hat, erstellt OpenClaw einen via
Sicherheit
- Webhook-Anfragen werden authentifiziert, indem
guid/password-Query-Parameter oder -Header mitchannels.bluebubbles.passwordverglichen werden. Anfragen vonlocalhostwerden ebenfalls akzeptiert. - Halte das API-Passwort und den Webhook-Endpunkt geheim (behandle sie wie Zugangsdaten).
- Localhost-Vertrauen bedeutet, dass ein Same-Host-Reverse-Proxy das Passwort unbeabsichtigt umgehen kann. Wenn du das Gateway proxiest, erzwinge Auth am Proxy und konfiguriere
gateway.trustedProxies. Siehe Gateway security. - Aktiviere HTTPS + Firewall-Regeln auf dem BlueBubbles-Server, wenn du ihn außerhalb deines LANs exponierst.
Fehlerbehebung
- Wenn Tipp-/Lese-Events nicht mehr funktionieren, prüfe die BlueBubbles-Webhook-Logs und stelle sicher, dass der Gateway-Pfad mit
channels.bluebubbles.webhookPathübereinstimmt. - Pairing-Codes verfallen nach einer Stunde; verwende
openclaw pairing list bluebubblesundopenclaw pairing approve bluebubbles <code>. - Reaktionen erfordern die BlueBubbles Private API (
POST /api/v1/message/react); stelle sicher, dass die Serverversion sie bereitstellt. - Bearbeiten/Zurückziehen erfordert macOS 13+ und eine kompatible BlueBubbles-Serverversion. Auf macOS 26 (Tahoe) ist Bearbeiten derzeit aufgrund von Private-API-Änderungen defekt.
- Gruppensymbol-Aktualisierungen können auf macOS 26 (Tahoe) instabil sein: Die API meldet möglicherweise Erfolg, aber das neue Symbol synchronisiert nicht.
- OpenClaw blendet bekannt defekte Aktionen basierend auf der macOS-Version des BlueBubbles-Servers automatisch aus. Wenn Bearbeiten auf macOS 26 (Tahoe) weiterhin erscheint, deaktiviere es manuell mit
channels.bluebubbles.actions.edit=false. - Für Status-/Gesundheitsinformationen:
openclaw status --alloderopenclaw status --deep.
Allgemeine Kanal-Workflow-Referenz findest du unter Channels und im Plugins-Leitfaden.