Zum Hauptinhalt springen

WhatsApp (Web-Kanal)

Status: produktionsreif über WhatsApp Web (Baileys). Das Gateway verwaltet verknüpfte Sitzung(en).

Installation (bei Bedarf)

  • Onboarding (openclaw onboard) und openclaw channels add --channel whatsapp fordern zur Installation des WhatsApp-Plugins auf, wenn du es zum ersten Mal auswählst.
  • openclaw channels login --channel whatsapp bietet den Installationsablauf ebenfalls an, wenn das Plugin noch nicht vorhanden ist.
  • Dev-Kanal + Git-Checkout: standardmäßig wird der lokale Plugin-Pfad verwendet.
  • Stable/Beta: standardmäßig wird das npm-Paket @openclaw/whatsapp verwendet.
Die manuelle Installation bleibt verfügbar:
openclaw plugins install @openclaw/whatsapp

Kopplung

Die Standard-DM-Richtlinie ist Kopplung für unbekannte Absender.

Fehlerbehebung für Kanäle

Kanalübergreifende Diagnose- und Reparaturleitfäden.

Gateway-Konfiguration

Vollständige Konfigurationsmuster und Beispiele für Kanäle.

Schnelleinrichtung

1

WhatsApp-Zugriffsrichtlinie konfigurieren

{
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      allowFrom: ["+15551234567"],
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15551234567"],
    },
  },
}
2

WhatsApp verknüpfen (QR)

openclaw channels login --channel whatsapp
Für ein bestimmtes Konto:
openclaw channels login --channel whatsapp --account work
3

Gateway starten

openclaw gateway
4

Erste Kopplungsanfrage genehmigen (bei Verwendung des Kopplungsmodus)

openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
Kopplungsanfragen laufen nach 1 Stunde ab. Ausstehende Anfragen sind auf 3 pro Kanal begrenzt.
OpenClaw empfiehlt nach Möglichkeit, WhatsApp mit einer separaten Nummer zu betreiben. (Die Kanalmetadaten und der Einrichtungsablauf sind für dieses Setup optimiert, aber Setups mit persönlicher Nummer werden ebenfalls unterstützt.)

Bereitstellungsmuster

Dies ist der sauberste Betriebsmodus:
  • separate WhatsApp-Identität für OpenClaw
  • klarere DM-Allowlists und Routing-Grenzen
  • geringere Wahrscheinlichkeit von Verwechslungen im Selbst-Chat
Minimales Richtlinienmuster:
{
  channels: {
    whatsapp: {
      dmPolicy: "allowlist",
      allowFrom: ["+15551234567"],
    },
  },
}
Das Onboarding unterstützt den Modus mit persönlicher Nummer und schreibt eine selbstchatfreundliche Basiskonfiguration:
  • dmPolicy: "allowlist"
  • allowFrom enthält deine persönliche Nummer
  • selfChatMode: true
Zur Laufzeit basieren Selbst-Chat-Schutzmechanismen auf der verknüpften eigenen Nummer und allowFrom.
Der Kanal der Messaging-Plattform basiert in der aktuellen OpenClaw-Kanalarchitektur auf WhatsApp Web (Baileys).Es gibt keinen separaten Twilio-WhatsApp-Messaging-Kanal in der integrierten Chat-Kanal-Registry.

Laufzeitmodell

  • Das Gateway verwaltet den WhatsApp-Socket und die Wiederverbindungsschleife.
  • Ausgehende Sendungen erfordern einen aktiven WhatsApp-Listener für das Zielkonto.
  • Status- und Broadcast-Chats werden ignoriert (@status, @broadcast).
  • Direkte Chats verwenden DM-Sitzungsregeln (session.dmScope; standardmäßig reduziert main DMs auf die Hauptsitzung des Agenten).
  • Gruppensitzungen sind isoliert (agent:<agentId>:whatsapp:group:<jid>).
  • Der WhatsApp-Web-Transport berücksichtigt Standard-Proxy-Umgebungsvariablen auf dem Gateway-Host (HTTPS_PROXY, HTTP_PROXY, NO_PROXY / kleingeschriebene Varianten). Bevorzuge eine Proxy-Konfiguration auf Host-Ebene gegenüber kanalspezifischen WhatsApp-Proxy-Einstellungen.

Zugriffskontrolle und Aktivierung

channels.whatsapp.dmPolicy steuert den Zugriff auf direkte Chats:
  • pairing (Standard)
  • allowlist
  • open (erfordert, dass allowFrom "*" enthält)
  • disabled
allowFrom akzeptiert Nummern im Stil von E.164 (intern normalisiert).Multi-Account-Override: channels.whatsapp.accounts.<id>.dmPolicy (und allowFrom) haben für dieses Konto Vorrang vor den Standardwerten auf Kanalebene.Details zum Laufzeitverhalten:
  • Kopplungen werden im kanalbezogenen Allow-Store gespeichert und mit dem konfigurierten allowFrom zusammengeführt
  • wenn keine Allowlist konfiguriert ist, ist die verknüpfte eigene Nummer standardmäßig erlaubt
  • ausgehende fromMe-DMs werden nie automatisch gekoppelt

Persönliche Nummer und Selbst-Chat-Verhalten

Wenn die verknüpfte eigene Nummer auch in allowFrom vorhanden ist, werden WhatsApp-Schutzmechanismen für Selbst-Chats aktiviert:
  • Lesebestätigungen für Selbst-Chat-Züge überspringen
  • Auto-Trigger-Verhalten für Erwähnungs-JIDs ignorieren, das dich sonst selbst anpingen würde
  • wenn messages.responsePrefix nicht gesetzt ist, verwenden Selbst-Chat-Antworten standardmäßig [{identity.name}] oder [openclaw]

Nachrichten-Normalisierung und Kontext

Eingehende WhatsApp-Nachrichten werden in den gemeinsamen eingehenden Umschlag verpackt.Wenn eine zitierte Antwort vorhanden ist, wird Kontext in dieser Form angehängt:
[Antwort auf <sender> id:<stanzaId>]
<zitierter Text oder Medienplatzhalter>
[/Antwort]
Metadatenfelder für Antworten werden ebenfalls befüllt, wenn verfügbar (ReplyToId, ReplyToBody, ReplyToSender, Absender-JID/E.164).
Eingehende Nachrichten, die nur Medien enthalten, werden mit Platzhaltern wie den folgenden normalisiert:
  • <media:image>
  • <media:video>
  • <media:audio>
  • <media:document>
  • <media:sticker>
Standort- und Kontakt-Payloads werden vor dem Routing in textuellen Kontext normalisiert.
Für Gruppen können unverarbeitete Nachrichten gepuffert und als Kontext eingefügt werden, wenn der Bot schließlich ausgelöst wird.
  • Standardlimit: 50
  • Konfiguration: channels.whatsapp.historyLimit
  • Fallback: messages.groupChat.historyLimit
  • 0 deaktiviert
Einspeisemarkierungen:
  • [Chat-Nachrichten seit deiner letzten Antwort - als Kontext]
  • [Aktuelle Nachricht - antworte auf diese]
Lesebestätigungen sind standardmäßig für akzeptierte eingehende WhatsApp-Nachrichten aktiviert.Global deaktivieren:
{
  channels: {
    whatsapp: {
      sendReadReceipts: false,
    },
  },
}
Override pro Konto:
{
  channels: {
    whatsapp: {
      accounts: {
        work: {
          sendReadReceipts: false,
        },
      },
    },
  },
}
Selbst-Chat-Züge überspringen Lesebestätigungen auch dann, wenn sie global aktiviert sind.

Zustellung, Aufteilung und Medien

  • Standardlimit pro Abschnitt: channels.whatsapp.textChunkLimit = 4000
  • channels.whatsapp.chunkMode = "length" | "newline"
  • der Modus newline bevorzugt Absatzgrenzen (Leerzeilen) und greift dann auf längensichere Aufteilung zurück
  • unterstützt Nutzlasten für Bilder, Videos, Audio (PTT-Sprachnotiz) und Dokumente
  • audio/ogg wird für Kompatibilität mit Sprachnotizen in audio/ogg; codecs=opus umgeschrieben
  • animierte GIF-Wiedergabe wird über gifPlayback: true bei Videosendungen unterstützt
  • Bildunterschriften werden auf das erste Medienelement angewendet, wenn Antwortnutzlasten mit mehreren Medien gesendet werden
  • Medienquelle kann HTTP(S), file:// oder lokale Pfade sein
  • Limit zum Speichern eingehender Medien: channels.whatsapp.mediaMaxMb (Standard 50)
  • Limit zum Senden ausgehender Medien: channels.whatsapp.mediaMaxMb (Standard 50)
  • Overrides pro Konto verwenden channels.whatsapp.accounts.<accountId>.mediaMaxMb
  • Bilder werden automatisch optimiert (Größenanpassung/Qualitätsdurchlauf), um in die Limits zu passen
  • bei Fehlern beim Mediensenden sendet der Fallback für das erste Element stattdessen eine Textwarnung, anstatt die Antwort stillschweigend zu verwerfen

Reaktionsstufe

channels.whatsapp.reactionLevel steuert, wie breit der Agent Emoji-Reaktionen auf WhatsApp verwendet:
StufeBestätigungsreaktionenVom Agenten initiierte ReaktionenBeschreibung
"off"NeinNeinÜberhaupt keine Reaktionen
"ack"JaNeinNur Bestätigungsreaktionen (vor Antwortempfang)
"minimal"JaJa (zurückhaltend)Bestätigung + Agent-Reaktionen mit zurückhaltender Steuerung
"extensive"JaJa (empfohlen)Bestätigung + Agent-Reaktionen mit empfohlener Steuerung
Standard: "minimal". Overrides pro Konto verwenden channels.whatsapp.accounts.<id>.reactionLevel.
{
  channels: {
    whatsapp: {
      reactionLevel: "ack",
    },
  },
}

Bestätigungsreaktionen

WhatsApp unterstützt sofortige Bestätigungsreaktionen beim Empfang eingehender Nachrichten über channels.whatsapp.ackReaction. Bestätigungsreaktionen werden durch reactionLevel gesteuert — sie werden unterdrückt, wenn reactionLevel auf "off" gesetzt ist.
{
  channels: {
    whatsapp: {
      ackReaction: {
        emoji: "👀",
        direct: true,
        group: "mentions", // always | mentions | never
      },
    },
  },
}
Hinweise zum Verhalten:
  • werden sofort gesendet, nachdem eine eingehende Nachricht akzeptiert wurde (vor der Antwort)
  • Fehler werden protokolliert, blockieren aber nicht die normale Antwortzustellung
  • der Gruppenmodus mentions reagiert bei durch Erwähnung ausgelösten Zügen; die Gruppenaktivierung always wirkt als Umgehung dieser Prüfung
  • WhatsApp verwendet channels.whatsapp.ackReaction (das veraltete messages.ackReaction wird hier nicht verwendet)

Multi-Account und Anmeldedaten

  • Konto-IDs stammen aus channels.whatsapp.accounts
  • Standard-Kontoauswahl: default, falls vorhanden, andernfalls die erste konfigurierte Konto-ID (sortiert)
  • Konto-IDs werden intern für die Suche normalisiert
  • aktueller Auth-Pfad: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Sicherungsdatei: creds.json.bak
  • veraltete Standardauthentifizierung in ~/.openclaw/credentials/ wird für Standardkonto-Abläufe weiterhin erkannt/migriert
openclaw channels logout --channel whatsapp [--account <id>] löscht den WhatsApp-Authentifizierungsstatus für dieses Konto.In veralteten Auth-Verzeichnissen bleibt oauth.json erhalten, während Baileys-Auth-Dateien entfernt werden.

Tools, Aktionen und Konfigurationsschreibvorgänge

  • Die Tool-Unterstützung des Agenten umfasst die WhatsApp-Reaktionsaktion (react).
  • Aktionssperren:
    • channels.whatsapp.actions.reactions
    • channels.whatsapp.actions.polls
  • Vom Kanal initiierte Konfigurationsschreibvorgänge sind standardmäßig aktiviert (deaktivierbar über channels.whatsapp.configWrites=false).

Fehlerbehebung

Symptom: Der Kanalstatus meldet nicht verknüpft.Lösung:
openclaw channels login --channel whatsapp
openclaw channels status
Symptom: Verknüpftes Konto mit wiederholten Trennungen oder Wiederverbindungsversuchen.Lösung:
openclaw doctor
openclaw logs --follow
Falls nötig, mit channels login erneut verknüpfen.
Ausgehende Sendungen schlagen sofort fehl, wenn kein aktiver Gateway-Listener für das Zielkonto vorhanden ist.Stelle sicher, dass das Gateway läuft und das Konto verknüpft ist.
In dieser Reihenfolge prüfen:
  • groupPolicy
  • groupAllowFrom / allowFrom
  • Allowlist-Einträge in groups
  • Erwähnungssteuerung (requireMention + Erwähnungsmuster)
  • doppelte Schlüssel in openclaw.json (JSON5): spätere Einträge überschreiben frühere, daher pro Geltungsbereich nur ein einziges groupPolicy beibehalten
Die WhatsApp-Gateway-Laufzeit sollte Node verwenden. Bun ist als inkompatibel für einen stabilen Betrieb des WhatsApp/Telegram-Gateways gekennzeichnet.

Verweise zur Konfigurationsreferenz

Primäre Referenz: Wichtige WhatsApp-Felder:
  • Zugriff: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups
  • Zustellung: textChunkLimit, chunkMode, mediaMaxMb, sendReadReceipts, ackReaction, reactionLevel
  • Multi-Account: accounts.<id>.enabled, accounts.<id>.authDir, Overrides auf Kontoebene
  • Betrieb: configWrites, debounceMs, web.enabled, web.heartbeatSeconds, web.reconnect.*
  • Sitzungsverhalten: session.dmScope, historyLimit, dmHistoryLimit, dms.<id>.historyLimit

Verwandt