Zum Inhalt springen

OpenClaw mit BlueBubbles für iMessage verbinden

Aktuelle OpenClaw-Releases enthalten BlueBubbles bereits als festen Bestandteil, daher ist bei normalen Paket-Builds kein separater openclaw plugins install-Schritt erforderlich.

Diese Komponente läuft auf macOS über die BlueBubbles-Hilfs-App (bluebubbles.app). Empfohlen und getestet ist macOS Sequoia (15); macOS Tahoe (26) funktioniert ebenfalls, wobei die Bearbeitungsfunktion auf Tahoe derzeit fehlerhaft ist und Aktualisierungen von Gruppen-Icons zwar als erfolgreich gemeldet werden, aber unter Umständen nicht synchronisieren. OpenClaw kommuniziert über die REST API (GET /api/v1/ping, POST /message/text, POST /chat/:id/*) mit dem Server. Eingehende Nachrichten werden über webhook-Aufrufe empfangen, während ausgehende Antworten, Tipp-Indikatoren, Lesebestätigungen und Tapbacks als REST-Aufrufe ausgeführt werden. Anhänge und Sticker werden als eingehende Medien verarbeitet und dem Agenten nach Möglichkeit zur Verfügung gestellt. Das Pairing und die Allowlist funktionieren wie bei anderen Kanälen (/channels/pairing etc.) über channels.bluebubbles.allowFrom und Pairing-Codes. Reaktionen werden wie bei Slack oder Telegram als Systemereignisse angezeigt, damit Agenten diese vor einer Antwort “erwähnen” können. Zu den erweiterten Funktionen gehören Bearbeiten, Zurückziehen, Antwort-Threading, Nachrichteneffekte und Gruppenverwaltung.

  1. Installiere den BlueBubbles-Server auf deinem Mac (folge dazu den Anweisungen auf bluebubbles.app/install).

  2. Aktiviere in der BlueBubbles-Konfiguration die Web API und lege ein Passwort fest.

  3. Führe openclaw onboard aus und wähle BlueBubbles aus oder konfiguriere es manuell:

    {
    channels: {
    bluebubbles: {
    enabled: true,
    serverUrl: "http://192.168.1.100:1234",
    password: "example-password",
    webhookPath: "/bluebubbles-webhook",
    },
    },
    }
  4. Leite die BlueBubbles webhook-Anfragen an dein Gateway weiter (Beispiel: https://your-gateway-host:3000/bluebubbles-webhook?password=<password>).

  5. Starte das Gateway; es registriert den webhook-Handler und beginnt mit dem Pairing.

Sicherheitshinweis:

  • Setze immer ein webhook-Passwort.
  • Die webhook-Authentifizierung ist zwingend erforderlich. OpenClaw weist BlueBubbles-webhook-Anfragen ab, sofern sie kein Passwort/GUID enthalten, das mit channels.bluebubbles.password übereinstimmt (zum Beispiel ?password=<password> oder x-password), unabhängig von der Loopback- oder Proxy-Topologie.
  • Die Passwort-Authentifizierung wird geprüft, bevor die vollständigen webhook-Bodys gelesen oder geparst werden.

Einige macOS-VMs oder Always-on-Setups können dazu führen, dass die Messages.app in den “Leerlauf” geht (eingehende Ereignisse stoppen, bis die App geöffnet oder in den Vordergrund geholt wird). Eine einfache Lösung besteht darin, Messages alle 5 Minuten mittels AppleScript und LaunchAgent zu “stupsen”.

Speichere dies unter:

  • ~/Scripts/poke-messages.scpt

Beispiel-Skript (nicht-interaktiv; stiehlt nicht den 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

Speichere dies unter:

  • ~/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 &quot;$HOME/Scripts/poke-messages.scpt&quot;</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-Automatisierungs-Abfragen auslösen (osascript → Messages). Bestätige diese in derselben Benutzersitzung, in der der LaunchAgent ausgeführt wird.

Lade den Agenten:

Terminal-Fenster
launchctl unload ~/Library/LaunchAgents/com.user.poke-messages.plist 2>/dev/null || true
launchctl load ~/Library/LaunchAgents/com.user.poke-messages.plist

AI Setup Assistant

OpenClaw bietet ein interaktives Onboarding, mit dem du BlueBubbles schnell und einfach konfigurieren kannst:

openclaw onboard

Der Assistent fragt dich nach den folgenden Informationen:

  1. Server URL (erforderlich): Die Adresse deines BlueBubbles-Servers (z. B. http://192.168.1.100:1234).
  2. Password (erforderlich): Das API-Passwort aus deinen BlueBubbles-Servereinstellungen.
  3. Webhook path (optional): Standardmäßig auf /bluebubbles-webhook gesetzt.
  4. DM policy: Wähle zwischen pairing, allowlist, open oder disabled.
  5. Allow list: Definiere Telefonnummern, E-Mails oder Chat-Ziele.

Du kannst BlueBubbles alternativ auch direkt über die CLI hinzufügen:

openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --password <password>

Die Verwaltung von Berechtigungen für Direktnachrichten und Gruppen erfolgt über spezifische Richtlinien, um den Zugriff auf dein System zu steuern.

Direktnachrichten:

  1. Standardeinstellung: channels.bluebubbles.dmPolicy = "pairing".
  2. Unbekannte Absender erhalten einen Pairing-Code; Nachrichten werden ignoriert, bis sie genehmigt wurden (Codes laufen nach 1 Stunde ab).
  3. Genehmigung erfolgt über:
    • openclaw pairing list bluebubbles
    • openclaw pairing approve bluebubbles <CODE>
  4. Pairing ist der Standard-Token-Austausch. Details findest du unter: Pairing

Gruppen:

  1. channels.bluebubbles.groupPolicy = open | allowlist | disabled (Standard ist allowlist).
  2. channels.bluebubbles.groupAllowFrom steuert, wer in Gruppen agieren darf, wenn allowlist aktiviert ist.

BlueBubbles-Gruppen-webhooks enthalten oft nur die rohen Teilnehmeradressen. Wenn du möchtest, dass der GroupMembers-Kontext lokale Kontaktnamen anzeigt, kannst du die Anreicherung auf macOS aktivieren:

  1. channels.bluebubbles.enrichGroupParticipantsFromContacts = true aktiviert die Suche. Der Standardwert ist false.
  2. Suchvorgänge werden erst ausgeführt, nachdem der Gruppenzugriff, die Befehlsautorisierung und das Erwähnungs-Gating die Nachricht zugelassen haben.
  3. Nur unbenannte Telefon-Teilnehmer werden angereichert.
  4. Rohe Telefonnummern bleiben als Fallback erhalten, wenn kein lokaler Treffer gefunden wird.
{
channels: {
bluebubbles: {
enrichGroupParticipantsFromContacts: true,
},
},
}

BlueBubbles unterstützt ein Erwähnungs-Gating für Gruppenchats, das dem Verhalten von iMessage oder WhatsApp entspricht:

  1. Nutzt agents.list[].groupChat.mentionPatterns (oder messages.groupChat.mentionPatterns), um Erwähnungen zu erkennen.
  2. Wenn requireMention für eine Gruppe aktiviert ist, antwortet der Agent nur, wenn er erwähnt wird.
  3. Steuerbefehle von autorisierten Absendern umgehen das Erwähnungs-Gating.

Konfiguration pro Gruppe:

{
channels: {
bluebubbles: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15555550123"],
groups: {
"*": { requireMention: true }, // default for all groups
"iMessage;-;chat123": { requireMention: false }, // override for specific group
},
},
},
}
  1. Steuerbefehle (z. B. /config, /model) erfordern eine Autorisierung.
  2. Verwendet allowFrom und groupAllowFrom, um die Befehlsautorisierung zu bestimmen.
  3. Autorisierte Absender können Steuerbefehle auch ohne Erwähnung in Gruppen ausführen.

BlueBubbles-Chats können in dauerhafte ACP-Arbeitsbereiche umgewandelt werden, ohne die Transportschicht zu verändern.

Schneller Operator-Ablauf:

  1. Führe /acp spawn codex --bind here innerhalb der Direktnachricht oder des erlaubten Gruppenchats aus.
  2. Zukünftige Nachrichten in dieser BlueBubbles-Konversation werden an die erstellte ACP-Sitzung weitergeleitet.
  3. /new und /reset setzen dieselbe gebundene ACP-Sitzung zurück.
  4. /acp close schließt die ACP-Sitzung und entfernt die Bindung.

Konfigurierte persistente Bindungen werden ebenfalls über bindings[]-Einträge auf oberster Ebene mit type: "acp" und match.channel: "bluebubbles" unterstützt.

match.peer.id kann jede unterstützte BlueBubbles-Zielform verwenden:

  1. Normalisierter DM-Handle wie +15555550123 oder user@example.com
  2. chat_id:<id>
  3. chat_guid:<guid>
  4. chat_identifier:<identifier>

Für stabile Gruppenbindungen solltest du chat_id:* oder chat_identifier:* bevorzugen.

Beispiel:

{
agents: {
list: [
{
id: "codex",
runtime: {
type: "acp",
acp: { agent: "codex", backend: "acpx", mode: "persistent" },
},
},
],
},
bindings: [
{
type: "acp",
agentId: "codex",
match: {
channel: "bluebubbles",
accountId: "default",
peer: { kind: "dm", id: "+15555550123" },
},
acp: { label: "codex-imessage" },
},
],
}

Weitere Informationen findest du unter ACP Agents.

Die Kommunikation wird durch Statusanzeigen ergänzt, um den Benutzerfluss natürlicher zu gestalten.

  1. Tippindikatoren: Werden automatisch vor und während der Antwortgenerierung gesendet.
  2. Lesebestätigungen: Gesteuert durch channels.bluebubbles.sendReadReceipts (Standard ist true).
  3. Tippindikatoren: OpenClaw sendet Ereignisse für den Tippbeginn; BlueBubbles löscht den Tippstatus automatisch beim Senden oder nach einem Timeout (manuelles Stoppen via DELETE ist unzuverlässig).
{
channels: {
bluebubbles: {
sendReadReceipts: false, // disable read receipts
},
},
}

OpenClaw unterstützt erweiterte Nachrichtenaktionen für BlueBubbles, sobald du diese in deiner Konfiguration aktiviert hast. Hier ist ein Beispiel, wie du die verschiedenen Funktionen freischaltest:

{
channels: {
bluebubbles: {
actions: {
reactions: true, // tapbacks (default: true)
edit: true, // edit sent messages (macOS 13+, broken on macOS 26 Tahoe)
unsend: true, // unsend messages (macOS 13+)
reply: true, // reply threading by message GUID
sendWithEffect: true, // message effects (slam, loud, etc.)
renameGroup: true, // rename group chats
setGroupIcon: true, // set group chat icon/photo (flaky on macOS 26 Tahoe)
addParticipant: true, // add participants to groups
removeParticipant: true, // remove participants from groups
leaveGroup: true, // leave group chats
sendAttachment: true, // send attachments/media
},
},
},
}

Die folgenden Aktionen stehen dir zur Verfügung:

  1. react: Füge Tapback-Reaktionen hinzu oder entferne sie (messageId, emoji, remove).
  2. edit: Bearbeite eine bereits gesendete Nachricht (messageId, text).
  3. unsend: Mache das Senden einer Nachricht rückgängig (messageId).
  4. reply: Antworte direkt auf eine bestimmte Nachricht (messageId, text, to).
  5. sendWithEffect: Sende eine Nachricht mit einem iMessage-Effekt (text, to, effectId).
  6. renameGroup: Ändere den Namen eines Gruppenchats (chatGuid, displayName).
  7. setGroupIcon: Lege ein Icon oder Foto für einen Gruppenchat fest (chatGuid, media) — auf macOS 26 Tahoe kann dies unzuverlässig sein (die API meldet Erfolg, aber das Icon wird nicht synchronisiert).
  8. addParticipant: Füge jemanden zu einer Gruppe hinzu (chatGuid, address).
  9. removeParticipant: Entferne jemanden aus einer Gruppe (chatGuid, address).
  10. leaveGroup: Verlasse einen Gruppenchat (chatGuid).
  11. upload-file: Sende Medien oder Dateien (to, buffer, filename, asVoice).
    • Sprachnotizen: Setze asVoice: true bei einer MP3- oder CAF-Audiodatei, um sie als iMessage-Sprachnachricht zu versenden. BlueBubbles konvertiert MP3 automatisch in das CAF-Format, wenn du Sprachnotizen verschickst.
    • Der Legacy-Alias sendAttachment funktioniert weiterhin, aber upload-file ist der offizielle Name der Aktion.

OpenClaw verwendet manchmal kurze Nachrichten-IDs (z. B. 1, 2), um Tokens zu sparen.

  1. MessageSid / ReplyToId können kurze IDs sein.
  2. MessageSidFull / ReplyToIdFull enthalten die vollständigen IDs des Anbieters.
  3. Kurze IDs existieren nur im Arbeitsspeicher; sie können nach einem Neustart oder durch das Leeren des Caches ungültig werden.
  4. Die Aktionen akzeptieren sowohl kurze als auch volle messageId-Werte, aber kurze IDs führen zu einem Fehler, falls sie nicht mehr verfügbar sind.

Verwende für dauerhafte Automatisierungen und die Speicherung immer die vollständigen IDs:

  1. Vorlagen: {{MessageSidFull}}, {{ReplyToIdFull}}.
  2. Kontext: MessageSidFull / ReplyToIdFull in eingehenden Payloads.

Weitere Informationen zu Vorlagenvariablen findest du unter Konfiguration.

Du kannst steuern, ob Antworten als einzelne Nachricht oder in Blöcken gestreamt werden sollen, um die Übertragung zu optimieren:

{
channels: {
bluebubbles: {
blockStreaming: true, // enable block streaming (off by default)
},
},
}

Eingehende Anhänge werden automatisch heruntergeladen und im Medien-Cache gespeichert. OpenClaw verwaltet diese Daten effizient, um die Performance deines Gateways zu optimieren.

  1. Eingehende Anhänge werden heruntergeladen und im Medien-Cache gespeichert.
  2. Das Medienlimit wird über channels.bluebubbles.mediaMaxMb für ein- und ausgehende Medien gesteuert (Standard: 8 MB).
  3. Ausgehender Text wird gemäß channels.bluebubbles.textChunkLimit in Stücke unterteilt (Standard: 4000 Zeichen).

Die vollständige Konfiguration findest du in der Konfiguration. Hier sind die spezifischen Optionen für den BlueBubbles-Provider:

  1. channels.bluebubbles.enabled: Aktiviert oder deaktiviert den Kanal.
  2. channels.bluebubbles.serverUrl: Die Basis-URL der BlueBubbles REST API.
  3. channels.bluebubbles.password: Das API-Passwort.
  4. channels.bluebubbles.webhookPath: Der Pfad für den webhook-Endpunkt (Standard: /bluebubbles-webhook).
  5. channels.bluebubbles.dmPolicy: Legt die Richtlinie für Direktnachrichten fest: pairing | allowlist | open | disabled (Standard: pairing).
  6. channels.bluebubbles.allowFrom: Die Whitelist für Direktnachrichten (Handles, E-Mails, E.164-Nummern, chat_id:*, chat_guid:*).
  7. channels.bluebubbles.groupPolicy: Richtlinie für Gruppen: open | allowlist | disabled (Standard: allowlist).
  8. channels.bluebubbles.groupAllowFrom: Whitelist für Absender in Gruppen.
  9. channels.bluebubbles.enrichGroupParticipantsFromContacts: Auf macOS kannst du optional unbenannte Gruppenteilnehmer nach der Filterung aus den lokalen Kontakten anreichern. Standard: false.
  10. channels.bluebubbles.groups: Gruppenspezifische Konfiguration (z. B. requireMention).
  11. channels.bluebubbles.sendReadReceipts: Sendet Lesebestätigungen (Standard: true).
  12. channels.bluebubbles.blockStreaming: Aktiviert das Block-Streaming (Standard: false; erforderlich für Streaming-Antworten).
  13. channels.bluebubbles.textChunkLimit: Größe der ausgehenden Textblöcke in Zeichen (Standard: 4000).
  14. channels.bluebubbles.sendTimeoutMs: Timeout pro Anfrage in ms für ausgehende Textnachrichten via /api/v1/message/text (Standard: 30000). Erhöhe diesen Wert bei macOS 26-Setups, bei denen Private API iMessage-Sendevorgänge im iMessage-Framework länger als 60 Sekunden dauern können; nutze beispielsweise 45000 oder 60000. Probes, Chat-Lookups, Reaktionen, Bearbeitungen und Gesundheitsprüfungen nutzen weiterhin den kürzeren Standard von 10s. Eine konto-spezifische Überschreibung ist über channels.bluebubbles.accounts.<accountId>.sendTimeoutMs möglich.
  15. channels.bluebubbles.chunkMode: length (Standard) teilt nur bei Überschreitung des textChunkLimit; newline teilt bei Leerzeilen (Absatzgrenzen) vor der Längenbegrenzung.
  16. channels.bluebubbles.mediaMaxMb: Limit für ein-/ausgehende Medien in MB (Standard: 8).
  17. channels.bluebubbles.mediaLocalRoots: Explizite Whitelist absoluter lokaler Verzeichnisse für ausgehende lokale Medienpfade. Lokale Pfade sind standardmäßig gesperrt, sofern dies nicht konfiguriert ist. Konto-spezifische Überschreibung via channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.
  18. channels.bluebubbles.historyLimit: Maximale Anzahl an Gruppennachrichten für den Kontext (0 deaktiviert dies).
  19. channels.bluebubbles.dmHistoryLimit: Limit für den Verlauf von Direktnachrichten.
  20. channels.bluebubbles.actions: Aktiviert oder deaktiviert spezifische Aktionen.
  21. channels.bluebubbles.accounts: Konfiguration für mehrere Konten.

Zugehörige globale Optionen:

  1. agents.list[].groupChat.mentionPatterns (oder messages.groupChat.mentionPatterns).
  2. messages.responsePrefix.

AI Setup Assistant

Verwende am besten die chat_guid für ein stabiles Routing deiner Nachrichten. Diese stellt sicher, dass deine Anfragen immer das richtige Ziel erreichen.

  1. chat_guid:iMessage;-;+15555550123 (bevorzugt für Gruppen)
  2. chat_id:123
  3. chat_identifier:...
  4. Direkte Handles: +15555550123, user@example.com
    • Falls für ein direktes Handle noch kein DM-Chat existiert, erstellt OpenClaw automatisch einen über POST /api/v1/chat/new. Hierfür muss die BlueBubbles Private API aktiviert sein.

Die Absicherung deiner webhook-Anfragen ist entscheidend, um unbefugten Zugriff auf deine Kommunikation zu verhindern. Behandle diese Zugangsdaten immer mit der gleichen Sorgfalt wie deine Passwörter.

  1. Webhook-Anfragen werden authentifiziert, indem die guid oder das password in den Query-Parametern oder Headern mit channels.bluebubbles.password abgeglichen werden.
  2. Halte das API-Passwort und den webhook-Endpunkt unbedingt geheim.
  3. Es gibt keinen Localhost-Bypass für die webhook-Authentifizierung von BlueBubbles. Wenn du den webhook-Datenverkehr über einen Gateway weiterleitest, muss das BlueBubbles-Passwort durchgehend in der Anfrage enthalten sein. gateway.trustedProxies ersetzt hier nicht channels.bluebubbles.password. Weitere Informationen findest du unter Gateway security.
  4. Aktiviere HTTPS und richte Firewall-Regeln auf dem BlueBubbles-Server ein, falls du diesen außerhalb deines LANs erreichbar machst.

Wenn du Probleme mit der Verbindung oder der Synchronisation hast, helfen dir diese Schritte, um die Ursache schnell zu finden. Überprüfe bei Unregelmäßigkeiten zuerst die webhook-Logs und den Status deiner Verbindung.

  1. Wenn Tipp- oder Lesebestätigungen nicht mehr funktionieren, prüfe die webhook-Logs von BlueBubbles und vergewissere dich, dass der Gateway-Pfad mit channels.bluebubbles.webhookPath übereinstimmt.
  2. Pairing-Codes sind nur eine Stunde lang gültig; verwende openclaw pairing list bluebubbles und openclaw pairing approve bluebubbles <code>, um das Pairing abzuschließen.
  3. Reaktionen erfordern die private API von BlueBubbles (POST /api/v1/message/react); stelle sicher, dass deine Server-Version diese unterstützt.
  4. Bearbeiten und Zurückziehen von Nachrichten erfordern macOS 13+ sowie eine kompatible BlueBubbles-Server-Version. Unter macOS 26 (Tahoe) ist die Bearbeitungsfunktion aufgrund von Änderungen an der private API aktuell fehlerhaft.
  5. Aktualisierungen von Gruppen-Icons können unter macOS 26 (Tahoe) unzuverlässig sein: Die API meldet zwar Erfolg, das neue Icon wird jedoch nicht synchronisiert.
  6. OpenClaw blendet bekannte, fehlerhafte Aktionen basierend auf der macOS-Version des BlueBubbles-Servers automatisch aus. Falls die Bearbeiten-Funktion unter macOS 26 (Tahoe) weiterhin angezeigt wird, deaktiviere sie manuell mit channels.bluebubbles.actions.edit=false.
  7. Für Status- oder Gesundheitsinformationen nutze openclaw status —all oder openclaw status —deep.

Für allgemeine Informationen zum Workflow der Kanäle, siehe Channels und den Plugins Leitfaden.

Hier findest du weiterführende Informationen, um dein Setup zu optimieren und tiefer in die Konfiguration einzusteigen. Diese Dokumentationen helfen dir dabei, die verschiedenen Komponenten von OpenClaw besser zu verstehen.

  1. Channels Overview — Alle unterstützten Kanäle in der Übersicht.
  2. Pairing — Authentifizierung für Direktnachrichten und der Pairing-Prozess.
  3. Groups — Verhalten von Gruppenchats und Erwähnungs-Filter.
  4. Channel Routing — Session-Routing für Nachrichten.
  5. Security — Zugriffsmodell und Sicherheitsmaßnahmen.

AI Setup Assistant

OpenClaw

OpenClaw Expert

Noch festgefahren?

Wenn diese Seite nicht hilft, frage OpenClaw Expert nach Schritt-fuer-Schritt-Loesungen.