WhatsApp (Web-Kanal)
Status: Nur WhatsApp Web über Baileys. Das Gateway besitzt die Sitzung(en).Schnellstart (Anfänger)
- Verwenden Sie nach Möglichkeit eine separate Telefonnummer (empfohlen).
- Konfigurieren Sie WhatsApp in
~/.openclaw/openclaw.json. - Führen Sie
openclaw channels loginaus, um den QR-Code zu scannen (Verknüpfte Geräte). - Starten Sie das Gateway.
Ziele
- Mehrere WhatsApp-Konten (Multi-Account) in einem Gateway-Prozess.
- Deterministisches Routing: Antworten gehen zurück zu WhatsApp, kein Modell-Routing.
- Das Modell sieht ausreichend Kontext, um zitierte Antworten zu verstehen.
Konfigurationsschreibzugriffe
Standardmäßig darf WhatsApp Konfigurationsupdates schreiben, die durch/config set|unset ausgelöst werden (erfordert commands.config: true).
Deaktivieren mit:
Architektur (wer besitzt was)
- Gateway besitzt den Baileys-Socket und die Inbox-Schleife.
- CLI / macOS-App kommunizieren mit dem Gateway; keine direkte Baileys-Nutzung.
- Aktiver Listener ist für ausgehende Sendungen erforderlich; andernfalls schlägt das Senden sofort fehl.
Eine Telefonnummer erhalten (zwei Modi)
WhatsApp erfordert eine echte Mobilnummer zur Verifizierung. VoIP- und virtuelle Nummern werden meist blockiert. Es gibt zwei unterstützte Wege, OpenClaw mit WhatsApp zu betreiben:Dedizierte Nummer (empfohlen)
Verwenden Sie eine separate Telefonnummer für OpenClaw. Beste UX, sauberes Routing, keine Self-Chat-Eigenheiten. Ideales Setup: Ersatz-/altes Android-Telefon + eSIM. Lassen Sie es mit WLAN und Strom verbunden und verknüpfen Sie es per QR. WhatsApp Business: Sie können WhatsApp Business auf demselben Gerät mit einer anderen Nummer verwenden. Ideal, um Ihr persönliches WhatsApp getrennt zu halten — installieren Sie WhatsApp Business und registrieren Sie dort die OpenClaw-Nummer. Beispielkonfiguration (dedizierte Nummer, Single-User-Allowlist):Wenn Sie Pairing statt Allowlist möchten, setzen Sie
channels.whatsapp.dmPolicy auf pairing. Unbekannte Absender erhalten einen Pairing-Code; genehmigen Sie mit:
openclaw pairing approve whatsapp <code>
Persönliche Nummer (Fallback)
Schneller Fallback: Betreiben Sie OpenClaw mit Ihrer eigenen Nummer. Schreiben Sie sich selbst (WhatsApp „Nachricht an mich“) zum Testen, damit Sie keine Kontakte spammen. Rechnen Sie damit, während Setup und Experimenten Verifizierungscodes auf Ihrem Haupttelefon zu lesen. Self-Chat-Modus muss aktiviert sein.Wenn der Assistent nach Ihrer persönlichen WhatsApp-Nummer fragt, geben Sie das Telefon ein, von dem Sie schreiben werden (Eigentümer/Absender), nicht die Assistenten-Nummer. Beispielkonfiguration (persönliche Nummer, Self-Chat):
[{identity.name}], wenn gesetzt (ansonsten [openclaw]),falls
messages.responsePrefix nicht gesetzt ist. Setzen Sie es explizit, um das Präfix anzupassen oder zu deaktivieren(verwenden Sie
"", um es zu entfernen).
Tipps zur Nummernbeschaffung
- Lokale eSIM Ihres Mobilfunkanbieters (am zuverlässigsten)
- Prepaid-SIM — günstig, muss nur eine SMS zur Verifizierung empfangen
creds.json bestehen.
Warum nicht Twilio?
- Frühe OpenClaw-Builds unterstützten Twilios WhatsApp-Business-Integration.
- WhatsApp-Business-Nummern sind für einen persönlichen Assistenten ungeeignet.
- Meta erzwingt ein 24‑Stunden-Antwortfenster; wenn Sie in den letzten 24 Stunden nicht geantwortet haben, kann die Business-Nummer keine neuen Nachrichten initiieren.
- Hohe Volumina oder „chatty“ Nutzung führen zu aggressiven Sperren, da Business-Konten nicht für dutzende persönliche Assistenten-Nachrichten gedacht sind.
- Ergebnis: Unzuverlässige Zustellung und häufige Sperren, daher wurde der Support entfernt.
Login + Anmeldedaten
- Login-Befehl:
openclaw channels login(QR über Verknüpfte Geräte). - Multi-Account-Login:
openclaw channels login --account <id>(<id>=accountId). - Standardkonto (wenn
--accountweggelassen wird):default, falls vorhanden, sonst die erste konfigurierte Konto-ID (sortiert). - Anmeldedaten gespeichert in
~/.openclaw/credentials/whatsapp/<accountId>/creds.json. - Sicherungskopie unter
creds.json.bak(wird bei Beschädigung wiederhergestellt). - Legacy-Kompatibilität: Ältere Installationen speicherten Baileys-Dateien direkt in
~/.openclaw/credentials/. - Logout:
openclaw channels logout(oder--account <id>) löscht den WhatsApp-Auth-Status (behält jedoch gemeinsameoauth.json). - Abgemeldeter Socket ⇒ Fehler weist auf erneutes Verknüpfen hin.
Eingehender Fluss (DM + Gruppe)
- WhatsApp-Ereignisse kommen von
messages.upsert(Baileys). - Inbox-Listener werden beim Shutdown getrennt, um das Ansammeln von Event-Handlern bei Tests/Neustarts zu vermeiden.
- Status-/Broadcast-Chats werden ignoriert.
- Direktchats verwenden E.164; Gruppen verwenden Group-JID.
- DM-Richtlinie:
channels.whatsapp.dmPolicysteuert den Zugriff auf Direktchats (Standard:pairing).- Pairing: Unbekannte Absender erhalten einen Pairing-Code (Genehmigung über
openclaw pairing approve whatsapp <code>; Codes laufen nach 1 Stunde ab). - Offen: erfordert, dass
channels.whatsapp.allowFrom"*"enthält. - Ihre verknüpfte WhatsApp-Nummer ist implizit vertrauenswürdig, daher überspringen Selbstnachrichten die Prüfungen
channels.whatsapp.dmPolicyundchannels.whatsapp.allowFrom.
- Pairing: Unbekannte Absender erhalten einen Pairing-Code (Genehmigung über
Persönliche-Nummer-Modus (Fallback)
Wenn Sie OpenClaw mit Ihrer persönlichen WhatsApp-Nummer betreiben, aktivieren Siechannels.whatsapp.selfChatMode (siehe Beispiel oben).
Verhalten:
- Ausgehende DMs lösen niemals Pairing-Antworten aus (verhindert das Spammen von Kontakten).
- Eingehende unbekannte Absender folgen weiterhin
channels.whatsapp.dmPolicy. - Self-Chat-Modus (allowFrom enthält Ihre Nummer) vermeidet automatische Lesebestätigungen und ignoriert Mention-JIDs.
- Lesebestätigungen werden für Nicht-Self-Chat-DMs gesendet.
Lesebestätigungen
Standardmäßig markiert das Gateway eingehende WhatsApp-Nachrichten als gelesen (blaue Häkchen), sobald sie akzeptiert werden. Global deaktivieren:- Im Self-Chat-Modus werden Lesebestätigungen immer übersprungen.
WhatsApp-FAQ: Nachrichten senden + Pairing
Wird OpenClaw zufällige Kontakte anschreiben, wenn ich WhatsApp verknüpfe?Nein. Die Standard-DM-Richtlinie ist Pairing, daher erhalten unbekannte Absender nur einen Pairing-Code und ihre Nachricht wird nicht verarbeitet. OpenClaw antwortet nur auf Chats, die es erhält, oder auf Sendungen, die Sie explizit auslösen (Agent/CLI). Wie funktioniert Pairing bei WhatsApp?
Pairing ist ein DM-Gate für unbekannte Absender:
- Erste DM eines neuen Absenders gibt einen kurzen Code zurück (Nachricht wird nicht verarbeitet).
- Genehmigen mit:
openclaw pairing approve whatsapp <code>(Liste mitopenclaw pairing list whatsapp). - Codes laufen nach 1 Stunde ab; ausstehende Anfragen sind auf 3 pro Kanal begrenzt.
Yes, by routing each sender to a different agent via
bindings (peer kind: "direct", sender E.164 like +15551234567). Replies still come from the same WhatsApp account, and direct chats collapse to each agent’s main session, so use one agent per person. Die DM-Zugriffskontrolle (dmPolicy/allowFrom) ist global pro WhatsApp-Konto. Siehe Multi-Agent Routing.
Warum fragt der Assistent nach meiner Telefonnummer?Der Assistent verwendet sie, um Ihre Allowlist/Eigentümer zu setzen, damit Ihre eigenen DMs erlaubt sind. Sie wird nicht für automatisches Senden verwendet. Wenn Sie mit Ihrer persönlichen WhatsApp-Nummer arbeiten, verwenden Sie dieselbe Nummer und aktivieren Sie
channels.whatsapp.selfChatMode.
Nachrichten-Normalisierung (was das Modell sieht)
-
Bodyist der aktuelle Nachrichtenkörper mit Umschlag. -
Kontext zitierter Antworten wird immer angehängt:
-
Antwort-Metadaten werden ebenfalls gesetzt:
ReplyToId= stanzaIdReplyToBody= zitierter Textkörper oder Medien-PlatzhalterReplyToSender= E.164, wenn bekannt
-
Eingehende Nachrichten nur mit Medien verwenden Platzhalter:
<media:image|video|audio|document|sticker>
Gruppen
- Gruppen werden auf
agent:<agentId>:whatsapp:group:<jid>-Sitzungen abgebildet. - Gruppenrichtlinie:
channels.whatsapp.groupPolicy = open|disabled|allowlist(Standardallowlist). - Aktivierungsmodi:
mention(Standard): erfordert @Erwähnung oder Regex-Treffer.always: löst immer aus.
/activation mention|alwaysist nur für Eigentümer und muss als eigenständige Nachricht gesendet werden.- Eigentümer =
channels.whatsapp.allowFrom(oder Self E.164, wenn nicht gesetzt). - History Injection (nur ausstehend):
- Aktuelle unverarbeitete Nachrichten (Standard 50) werden eingefügt unter:
[Chat messages since your last reply - for context](Nachrichten, die bereits in der Sitzung sind, werden nicht erneut injiziert) - Aktuelle Nachricht unter:
[Current message - respond to this] - Absender-Suffix angehängt:
[from: Name (+E164)]
- Aktuelle unverarbeitete Nachrichten (Standard 50) werden eingefügt unter:
- Gruppenmetadaten werden 5 Minuten gecacht (Thema + Teilnehmer).
Antwortzustellung (Threading)
- WhatsApp Web sendet Standardnachrichten (kein Zitier-Threading im aktuellen Gateway).
- Antwort-Tags werden in diesem Kanal ignoriert.
Bestätigungsreaktionen (Auto-Reaktion beim Empfang)
WhatsApp kann automatisch Emoji-Reaktionen auf eingehende Nachrichten senden, unmittelbar nach dem Empfang, bevor der Bot eine Antwort generiert. Dies gibt Nutzern sofortiges Feedback, dass ihre Nachricht eingegangen ist. Konfiguration:emoji(String): Emoji für die Bestätigung (z. B. „👀“, „✅“, „📨“). Leer oder nicht gesetzt = Funktion deaktiviert.direct(Boolean, Standard:true): Reaktionen in Direkt-/DM-Chats senden.group(String, Standard:"mentions"): Verhalten in Gruppenchats:"always": Auf alle Gruppennachrichten reagieren (auch ohne @Erwähnung)"mentions": Nur reagieren, wenn der Bot @erwähnt wird"never": Niemals in Gruppen reagieren
- Reaktionen werden sofort beim Nachrichteneingang gesendet, vor Tippindikatoren oder Bot-Antworten.
- In Gruppen mit
requireMention: false(Aktivierung: immer) reagiertgroup: "mentions"auf alle Nachrichten (nicht nur @Erwähnungen). - Fire-and-forget: Fehler bei Reaktionen werden protokolliert, verhindern aber keine Bot-Antwort.
- Teilnehmer-JID wird für Gruppenreaktionen automatisch eingeschlossen.
- WhatsApp ignoriert
messages.ackReaction; verwenden Sie stattdessenchannels.whatsapp.ackReaction.
Agent-Werkzeug (Reaktionen)
- Werkzeug:
whatsappmit Aktionreact(chatJid,messageId,emoji, optionalremove). - Optional:
participant(Gruppenabsender),fromMe(Reaktion auf eigene Nachricht),accountId(Multi-Account). - Semantik zum Entfernen von Reaktionen: siehe /tools/reactions.
- Werkzeug-Gating:
channels.whatsapp.actions.reactions(Standard: aktiviert).
Limits
- Ausgehender Text wird in
channels.whatsapp.textChunkLimitgechunked (Standard 4000). - Optionale Newline-Chunking: Setzen Sie
channels.whatsapp.chunkMode="newline", um vor dem Längen-Chunking an Leerzeilen (Absatzgrenzen) zu trennen. - Eingehende Medienspeicher sind durch
channels.whatsapp.mediaMaxMbbegrenzt (Standard 50 MB). - Ausgehende Medien sind durch
agents.defaults.mediaMaxMbbegrenzt (Standard 5 MB).
Ausgehendes Senden (Text + Medien)
- Verwendet aktiven Web-Listener; Fehler, wenn das Gateway nicht läuft.
- Text-Chunking: max. 4k pro Nachricht (konfigurierbar über
channels.whatsapp.textChunkLimit, optionalchannels.whatsapp.chunkMode). - Medien:
- Bild/Video/Audio/Dokument unterstützt.
- Audio wird als PTT gesendet;
audio/ogg⇒audio/ogg; codecs=opus. - Beschriftung nur beim ersten Medienelement.
- Medienabruf unterstützt HTTP(S) und lokale Pfade.
- Animierte GIFs: WhatsApp erwartet MP4 mit
gifPlayback: truefür Inline-Looping.- CLI:
openclaw message send --media <mp4> --gif-playback - Gateway:
send-Parameter enthaltengifPlayback: true
- CLI:
Sprachnachrichten (PTT-Audio)
WhatsApp sendet Audio als Sprachnachrichten (PTT-Blase).- Beste Ergebnisse: OGG/Opus. OpenClaw schreibt
audio/oggzuaudio/ogg; codecs=opusum. [[audio_as_voice]]wird für WhatsApp ignoriert (Audio wird bereits als Sprachnachricht geliefert).
Medienlimits + Optimierung
- Standard-Limit ausgehend: 5 MB (pro Medienelement).
- Override:
agents.defaults.mediaMaxMb. - Bilder werden automatisch zu JPEG unter das Limit optimiert (Resize + Qualitäts-Sweep).
- Übergroße Medien ⇒ Fehler; Medienantwort fällt auf Textwarnung zurück.
Heartbeats
- Gateway-Heartbeat protokolliert den Verbindungszustand (
web.heartbeatSeconds, Standard 60 s). - Agent-Heartbeat kann pro Agent (
agents.list[].heartbeat) oder global
überagents.defaults.heartbeatkonfiguriert werden (Fallback, wenn keine Pro-Agent-Einträge gesetzt sind).- Verwendet den konfigurierten Heartbeat-Prompt (Standard:
Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.) +HEARTBEAT_OK-Skip-Verhalten. - Zustellung standardmäßig über den zuletzt verwendeten Kanal (oder konfiguriertes Ziel).
- Verwendet den konfigurierten Heartbeat-Prompt (Standard:
Wiederverbindungsverhalten
- Backoff-Richtlinie:
web.reconnect:initialMs,maxMs,factor,jitter,maxAttempts.
- Wenn maxAttempts erreicht ist, stoppt das Web-Monitoring (degradiert).
- Abgemeldet ⇒ stoppen und erneutes Verknüpfen erforderlich.
Konfigurations-Schnellübersicht
channels.whatsapp.dmPolicy(DM-Richtlinie: pairing/allowlist/open/disabled).channels.whatsapp.selfChatMode(Same-Phone-Setup; Bot verwendet Ihre persönliche WhatsApp-Nummer).channels.whatsapp.allowFrom(DM-Allowlist). WhatsApp verwendet E.164-Telefonnummern (keine Benutzernamen).channels.whatsapp.mediaMaxMb(Limit für eingehende Medienspeicherung).channels.whatsapp.ackReaction(Auto-Reaktion beim Nachrichteneingang:{emoji, direct, group}).channels.whatsapp.accounts.<accountId>.*(Pro-Konto-Einstellungen + optionalauthDir).channels.whatsapp.accounts.<accountId>.mediaMaxMb(Pro-Konto-Limit für eingehende Medien).channels.whatsapp.accounts.<accountId>.ackReaction(Pro-Konto-Override für Bestätigungsreaktionen).channels.whatsapp.groupAllowFrom(Allowlist für Gruppenabsender).channels.whatsapp.groupPolicy(Gruppenrichtlinie).channels.whatsapp.historyLimit/channels.whatsapp.accounts.<accountId>.historyLimit(Gruppen-History-Kontext;0deaktiviert).channels.whatsapp.dmHistoryLimit(DM-History-Limit in Benutzer-Turns). Pro-Benutzer-Overrides:channels.whatsapp.dms["<phone>"].historyLimit.channels.whatsapp.groups(Gruppen-Allowlist + Mention-Gating-Defaults; verwenden Sie"*", um alle zu erlauben)channels.whatsapp.actions.reactions(Gating für WhatsApp-Werkzeugreaktionen).agents.list[].groupChat.mentionPatterns(odermessages.groupChat.mentionPatterns)messages.groupChat.historyLimitchannels.whatsapp.messagePrefix(eingehendes Präfix; pro Konto:channels.whatsapp.accounts.<accountId>.messagePrefix; veraltet:messages.messagePrefix)messages.responsePrefix(ausgehendes Präfix)agents.defaults.mediaMaxMbagents.defaults.heartbeat.everyagents.defaults.heartbeat.model(optional Override)agents.defaults.heartbeat.targetagents.defaults.heartbeat.toagents.defaults.heartbeat.sessionagents.list[].heartbeat.*(Pro-Agent-Overrides)session.*(Scope, Idle, Store, mainKey)web.enabled(deaktiviert den Kanalstart, wenn false)web.heartbeatSecondsweb.reconnect.*
Logs + Fehlerbehebung
- Subsysteme:
whatsapp/inbound,whatsapp/outbound,web-heartbeat,web-reconnect. - Logdatei:
/tmp/openclaw/openclaw-YYYY-MM-DD.log(konfigurierbar). - Leitfaden zur Fehlerbehebung: Gateway troubleshooting.
Fehlerbehebung (kurz)
Nicht verknüpft / QR-Login erforderlich- Symptom:
channels statuszeigtlinked: falseoder warnt „Not linked“. - Lösung: Führen Sie
openclaw channels loginauf dem Gateway-Host aus und scannen Sie den QR (WhatsApp → Einstellungen → Verknüpfte Geräte).
- Symptom:
channels statuszeigtrunning, disconnectedoder warnt „Linked but disconnected“. - Lösung:
openclaw doctor(oder Gateway neu starten). Wenn es anhält, erneut verknüpfen überchannels loginundopenclaw logs --followprüfen.
- Bun wird nicht empfohlen. WhatsApp (Baileys) und Telegram sind unter Bun unzuverlässig. Führen Sie das Gateway mit Node aus. (Siehe Hinweis zur Runtime in Erste Schritte.)