WhatsApp (kanał webowy)
Status: gotowy do produkcji przez WhatsApp Web (Baileys). Gateway jest właścicielem połączonych sesji.Instalacja (na żądanie)
- Onboarding (
openclaw onboard) iopenclaw channels add --channel whatsappprzy pierwszym wyborze tego kanału proponują instalację pluginu WhatsApp. openclaw channels login --channel whatsapprównież oferuje przepływ instalacji, gdy plugin nie jest jeszcze obecny.- Kanał developerski + checkout z gita: domyślnie używa lokalnej ścieżki pluginu.
- Stable/Beta: domyślnie używa pakietu npm
@openclaw/whatsapp.
Parowanie
Domyślna polityka DM dla nieznanych nadawców to parowanie.
Rozwiązywanie problemów z kanałem
Diagnostyka międzykanałowa i scenariusze naprawy.
Konfiguracja Gateway
Pełne wzorce konfiguracji kanałów i przykłady.
Szybka konfiguracja
OpenClaw zaleca, aby jeśli to możliwe, uruchamiać WhatsApp na osobnym numerze. (Metadane kanału i przepływ konfiguracji są zoptymalizowane pod taki układ, ale konfiguracje z numerem prywatnym również są obsługiwane.)
Wzorce wdrożenia
Dedykowany numer (zalecane)
Dedykowany numer (zalecane)
To najczystszy tryb operacyjny:
- osobna tożsamość WhatsApp dla OpenClaw
- wyraźniejsze allowlisty DM i granice routingu
- mniejsze ryzyko pomyłek związanych z czatem z samym sobą
Tryb awaryjny z numerem prywatnym
Tryb awaryjny z numerem prywatnym
Onboarding obsługuje tryb numeru prywatnego i zapisuje bazową konfigurację przyjazną dla czatu z samym sobą:
dmPolicy: "allowlist"allowFromzawiera Twój prywatny numerselfChatMode: true
allowFrom.Zakres kanału tylko WhatsApp Web
Zakres kanału tylko WhatsApp Web
Kanał platformy komunikacyjnej w bieżącej architekturze kanałów OpenClaw jest oparty na WhatsApp Web (
Baileys).W wbudowanym rejestrze kanałów czatu nie ma osobnego kanału wiadomości Twilio WhatsApp.Model środowiska uruchomieniowego
- Gateway jest właścicielem gniazda WhatsApp i pętli ponownego połączenia.
- Wysyłanie wychodzące wymaga aktywnego listenera WhatsApp dla konta docelowego.
- Czaty statusów i broadcastów są ignorowane (
@status,@broadcast). - Czaty bezpośrednie używają reguł sesji DM (
session.dmScope; domyślniemainzwija DM do głównej sesji agenta). - Sesje grupowe są izolowane (
agent:<agentId>:whatsapp:group:<jid>). - Transport WhatsApp Web respektuje standardowe zmienne środowiskowe proxy na hoście Gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ warianty małymi literami). Preferuj konfigurację proxy na poziomie hosta zamiast ustawień proxy WhatsApp specyficznych dla kanału.
Kontrola dostępu i aktywacja
- Polityka DM
- Polityka grup + allowlisty
- Wzmianki + /activation
channels.whatsapp.dmPolicy kontroluje dostęp do czatów bezpośrednich:pairing(domyślnie)allowlistopen(wymaga, abyallowFromzawierało"*")disabled
allowFrom akceptuje numery w stylu E.164 (wewnętrznie normalizowane).Nadpisanie dla wielu kont: channels.whatsapp.accounts.<id>.dmPolicy (oraz allowFrom) ma pierwszeństwo przed domyślnymi wartościami na poziomie kanału dla tego konta.Szczegóły zachowania środowiska uruchomieniowego:- parowania są zapisywane w channel allow-store i łączone ze skonfigurowanym
allowFrom - jeśli nie skonfigurowano allowlisty, połączony własny numer jest domyślnie dozwolony
- wychodzące DM
fromMenigdy nie są automatycznie parowane
Zachowanie numeru prywatnego i czatu z samym sobą
Gdy połączony własny numer jest też obecny wallowFrom, aktywują się zabezpieczenia czatu z samym sobą w WhatsApp:
- pomijanie potwierdzeń odczytu dla tur czatu z samym sobą
- ignorowanie zachowania automatycznego wyzwalania mention-JID, które w przeciwnym razie wywołałoby ping do samego siebie
- jeśli
messages.responsePrefixnie jest ustawione, odpowiedzi w czacie z samym sobą domyślnie używają[{identity.name}]lub[openclaw]
Normalizacja wiadomości i kontekst
Koperta przychodząca + kontekst odpowiedzi
Koperta przychodząca + kontekst odpowiedzi
Przychodzące wiadomości WhatsApp są opakowywane we wspólną kopertę przychodzącą.Jeśli istnieje cytowana odpowiedź, kontekst jest dołączany w tej postaci:Pola metadanych odpowiedzi są również wypełniane, gdy są dostępne (
ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 nadawcy).Placeholders multimediów oraz ekstrakcja lokalizacji/kontaktów
Placeholders multimediów oraz ekstrakcja lokalizacji/kontaktów
Przychodzące wiadomości zawierające wyłącznie multimedia są normalizowane za pomocą placeholderów takich jak:
<media:image><media:video><media:audio><media:document><media:sticker>
Wstrzykiwanie oczekującej historii grupy
Wstrzykiwanie oczekującej historii grupy
W przypadku grup nieprzetworzone wiadomości mogą być buforowane i wstrzykiwane jako kontekst, gdy bot zostanie wreszcie wyzwolony.
- domyślny limit:
50 - konfiguracja:
channels.whatsapp.historyLimit - fallback:
messages.groupChat.historyLimit 0wyłącza
[Chat messages since your last reply - for context][Current message - respond to this]
Potwierdzenia odczytu
Potwierdzenia odczytu
Potwierdzenia odczytu są domyślnie włączone dla zaakceptowanych przychodzących wiadomości WhatsApp.Wyłącz globalnie:Nadpisanie per konto:Tury czatu z samym sobą pomijają potwierdzenia odczytu nawet wtedy, gdy są globalnie włączone.
Dostarczanie, dzielenie na fragmenty i multimedia
Dzielenie tekstu na fragmenty
Dzielenie tekstu na fragmenty
- domyślny limit fragmentu:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- tryb
newlinepreferuje granice akapitów (puste linie), a następnie przechodzi do bezpiecznego dzielenia według długości
Zachowanie wychodzących multimediów
Zachowanie wychodzących multimediów
- obsługuje ładunki obrazów, wideo, audio (notatka głosowa PTT) i dokumentów
audio/oggjest przepisywane naaudio/ogg; codecs=opusdla zgodności z notatkami głosowymi- odtwarzanie animowanych GIF-ów jest obsługiwane przez
gifPlayback: trueprzy wysyłaniu wideo - podpisy są stosowane do pierwszego elementu multimedialnego przy wysyłaniu ładunków odpowiedzi z wieloma multimediami
- źródłem multimediów może być HTTP(S),
file://lub ścieżki lokalne
Limity rozmiaru multimediów i zachowanie awaryjne
Limity rozmiaru multimediów i zachowanie awaryjne
- limit zapisu przychodzących multimediów:
channels.whatsapp.mediaMaxMb(domyślnie50) - limit wysyłania wychodzących multimediów:
channels.whatsapp.mediaMaxMb(domyślnie50) - nadpisania per konto używają
channels.whatsapp.accounts.<accountId>.mediaMaxMb - obrazy są automatycznie optymalizowane (zmiana rozmiaru/przebieg jakości), aby zmieścić się w limitach
- przy błędzie wysyłania multimediów fallback pierwszego elementu wysyła tekstowe ostrzeżenie zamiast po cichu porzucać odpowiedź
Poziom reakcji
channels.whatsapp.reactionLevel kontroluje, jak szeroko agent używa reakcji emoji w WhatsApp:
| Poziom | Reakcje potwierdzające | Reakcje inicjowane przez agenta | Opis |
|---|---|---|---|
"off" | Nie | Nie | Brak reakcji |
"ack" | Tak | Nie | Tylko reakcje potwierdzające (potwierdzenie przed odpowiedzią) |
"minimal" | Tak | Tak (zachowawczo) | Potwierdzenia + reakcje agenta z zachowawczymi wskazówkami |
"extensive" | Tak | Tak (zalecane) | Potwierdzenia + reakcje agenta z zalecanymi wskazówkami |
"minimal".
Nadpisania per konto używają channels.whatsapp.accounts.<id>.reactionLevel.
Reakcje potwierdzające
WhatsApp obsługuje natychmiastowe reakcje potwierdzające po odebraniu wiadomości przychodzącej przezchannels.whatsapp.ackReaction.
Reakcje potwierdzające są ograniczane przez reactionLevel — są wyciszane, gdy reactionLevel ma wartość "off".
- wysyłane natychmiast po zaakceptowaniu wiadomości przychodzącej (przed odpowiedzią)
- błędy są logowane, ale nie blokują normalnego dostarczenia odpowiedzi
- tryb grupowy
mentionsreaguje przy turach wyzwolonych wzmianką; aktywacja grupyalwaysdziała jako obejście tego sprawdzenia - WhatsApp używa
channels.whatsapp.ackReaction(starszemessages.ackReactionnie jest tu używane)
Wiele kont i poświadczenia
Wybór konta i wartości domyślne
Wybór konta i wartości domyślne
- identyfikatory kont pochodzą z
channels.whatsapp.accounts - domyślny wybór konta:
default, jeśli jest obecne, w przeciwnym razie pierwszy skonfigurowany identyfikator konta (posortowany) - identyfikatory kont są wewnętrznie normalizowane na potrzeby wyszukiwania
Ścieżki poświadczeń i zgodność ze starszymi wersjami
Ścieżki poświadczeń i zgodność ze starszymi wersjami
- bieżąca ścieżka uwierzytelniania:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - plik kopii zapasowej:
creds.json.bak - starsze domyślne uwierzytelnianie w
~/.openclaw/credentials/jest nadal rozpoznawane/migrowane dla przepływów konta domyślnego
Zachowanie wylogowania
Zachowanie wylogowania
openclaw channels logout --channel whatsapp [--account <id>] czyści stan uwierzytelniania WhatsApp dla tego konta.W starszych katalogach uwierzytelniania oauth.json jest zachowywany, a pliki uwierzytelniania Baileys są usuwane.Narzędzia, akcje i zapisy konfiguracji
- Obsługa narzędzi agenta obejmuje akcję reakcji WhatsApp (
react). - Bramki akcji:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Zapisy konfiguracji inicjowane z kanału są domyślnie włączone (wyłącz przez
channels.whatsapp.configWrites=false).
Rozwiązywanie problemów
Niepołączone (wymagany QR)
Niepołączone (wymagany QR)
Objaw: status kanału zgłasza brak połączenia.Naprawa:
Połączone, ale rozłączone / pętla ponownych połączeń
Połączone, ale rozłączone / pętla ponownych połączeń
Objaw: połączone konto z powtarzającymi się rozłączeniami lub próbami ponownego połączenia.Naprawa:W razie potrzeby połącz ponownie przez
channels login.Brak aktywnego listenera podczas wysyłania
Brak aktywnego listenera podczas wysyłania
Wysyłanie wychodzące kończy się szybkim błędem, gdy dla konta docelowego nie istnieje aktywny listener Gateway.Upewnij się, że Gateway działa i konto jest połączone.
Wiadomości grupowe są nieoczekiwanie ignorowane
Wiadomości grupowe są nieoczekiwanie ignorowane
Sprawdź w tej kolejności:
groupPolicygroupAllowFrom/allowFrom- wpisy allowlisty
groups - bramkę wzmianki (
requireMention+ wzorce wzmianki) - zduplikowane klucze w
openclaw.json(JSON5): późniejsze wpisy nadpisują wcześniejsze, więc zachowaj pojedynczegroupPolicyna zakres
Ostrzeżenie środowiska uruchomieniowego Bun
Ostrzeżenie środowiska uruchomieniowego Bun
Środowisko uruchomieniowe Gateway dla WhatsApp powinno używać Node. Bun jest oznaczony jako niezgodny ze stabilną pracą Gateway dla WhatsApp/Telegram.
Prompty systemowe
WhatsApp obsługuje prompty systemowe w stylu Telegram dla grup i czatów bezpośrednich przez mapygroups i direct.
Hierarchia rozwiązywania dla wiadomości grupowych:
Najpierw określana jest efektywna mapa groups: jeśli konto definiuje własne groups, całkowicie zastępuje ono główną mapę groups (bez głębokiego scalania). Wyszukiwanie promptu odbywa się następnie na tej jednej wynikowej mapie:
- Prompt systemowy specyficzny dla grupy (
groups["<groupId>"].systemPrompt): używany, jeśli wpis dla konkretnej grupy definiujesystemPrompt. - Prompt systemowy z wildcardem grupy (
groups["*"].systemPrompt): używany, gdy wpis dla konkretnej grupy nie istnieje lub nie definiujesystemPrompt.
direct: jeśli konto definiuje własne direct, całkowicie zastępuje ono główną mapę direct (bez głębokiego scalania). Wyszukiwanie promptu odbywa się następnie na tej jednej wynikowej mapie:
- Prompt systemowy specyficzny dla czatu bezpośredniego (
direct["<peerId>"].systemPrompt): używany, jeśli wpis dla konkretnego peer definiujesystemPrompt. - Prompt systemowy z wildcardem czatu bezpośredniego (
direct["*"].systemPrompt): używany, gdy wpis dla konkretnego peer nie istnieje lub nie definiujesystemPrompt.
dms pozostaje lekkim zasobnikiem nadpisywania historii per DM (dms.<id>.historyLimit); nadpisania promptów znajdują się w direct.
Różnica względem zachowania Telegram przy wielu kontach: W Telegram główne groups jest celowo tłumione dla wszystkich kont w konfiguracji wielokontowej — nawet dla kont, które nie definiują własnego groups — aby zapobiec odbieraniu przez bota wiadomości grupowych z grup, do których nie należy. WhatsApp nie stosuje tego zabezpieczenia: główne groups i główne direct są zawsze dziedziczone przez konta, które nie definiują nadpisania na poziomie konta, niezależnie od liczby skonfigurowanych kont. W konfiguracji wielokontowej WhatsApp, jeśli chcesz mieć prompty grupowe lub bezpośrednie per konto, zdefiniuj pełną mapę jawnie pod każdym kontem zamiast polegać na wartościach domyślnych na poziomie głównym.
Ważne zachowanie:
channels.whatsapp.groupsjest zarówno mapą konfiguracji per grupa, jak i allowlistą grup na poziomie czatu. W zakresie głównym i zakresach kontgroups["*"]oznacza „wszystkie grupy są dopuszczone” dla tego zakresu.- Dodawaj wildcard group
systemPrompttylko wtedy, gdy i tak chcesz, aby ten zakres dopuszczał wszystkie grupy. Jeśli nadal chcesz, aby kwalifikował się tylko ustalony zestaw ID grup, nie używajgroups["*"]jako domyślnego promptu. Zamiast tego powtórz prompt przy każdym jawnie wpisanym na allowlistę wpisie grupy. - Dopuszczenie grupy i autoryzacja nadawcy to osobne sprawdzenia.
groups["*"]poszerza zestaw grup, które mogą trafić do obsługi grupowej, ale samo w sobie nie autoryzuje każdego nadawcy w tych grupach. Dostęp nadawcy jest nadal kontrolowany oddzielnie przezchannels.whatsapp.groupPolicyichannels.whatsapp.groupAllowFrom. channels.whatsapp.directnie ma tego samego efektu ubocznego dla DM.direct["*"]zapewnia tylko domyślną konfigurację czatu bezpośredniego po tym, jak DM zostanie już dopuszczone przezdmPolicyplusallowFromlub reguły pairing-store.
Wskaźniki do referencji konfiguracji
Główna referencja: Najważniejsze pola WhatsApp:- dostęp:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - dostarczanie:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - wiele kont:
accounts.<id>.enabled,accounts.<id>.authDir, nadpisania na poziomie konta - operacje:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.* - zachowanie sesji:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - prompty:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt