Mainstream messaging
Durum: WhatsApp Web (Baileys) üzerinden üretime hazır. Gateway, bağlı oturumların sahibidir; ayrı bir Twilio WhatsApp kanalı yoktur.
Kurulum
openclaw onboard ve openclaw channels add --channel whatsapp, ilk kez seçtiğinizde plugini kurmanızı ister; plugin eksikse openclaw channels login --channel whatsapp aynı kurulum akışını sunar. Geliştirme çalışma kopyaları yerel plugin yolunu kullanır; kararlı/beta kurulumları önce ClawHub'dan @openclaw/whatsapp kurar, başarısız olursa npm'e geri döner. WhatsApp çalışma zamanı, temel OpenClaw npm paketinin dışında sunulduğundan çalışma zamanı bağımlılıkları harici pluginle birlikte kalır. Manuel kurulum:
openclaw plugins install clawhub:@openclaw/whatsappÇıplak npm paketini (@openclaw/whatsapp) yalnızca kayıt defteri geri dönüşü için kullanın; tam bir sürümü yalnızca tekrarlanabilir bir kurulum için sabitleyin.
Bilinmeyen gönderenler için varsayılan DM politikası eşleştirmedir.
Kanallar arası tanılama ve onarım çalışma kitapları.
Eksiksiz kanal yapılandırma kalıpları ve örnekleri.
Hızlı kurulum
Erişim politikasını yapılandırın
{channels: {whatsapp: { dmPolicy: "pairing", allowFrom: ["+15551234567"], groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"],},},}WhatsApp'ı bağlayın (QR)
openclaw channels login --channel whatsappOturum açma yalnızca QR ile yapılır. Uzak veya başsız ana makinelerde oturum açmayı başlatmadan önce canlı QR'ı telefona iletecek güvenilir bir yol bulunduğundan emin olun; terminalde oluşturulan QR'ların, ekran görüntülerinin veya sohbet eklerinin süresi aktarım sırasında dolabilir.
Belirli bir hesap için:
openclaw channels login --channel whatsapp --account workOturum açmadan önce mevcut/özel bir kimlik doğrulama dizini eklemek için:
openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-authopenclaw channels login --channel whatsapp --account workGateway'i başlatın
openclaw gatewayİlk DM erişim isteğini onaylayın (eşleştirme modu)
Settings → Channels → DM access requests öğesini açın, WhatsApp hesabını bulun ve göndereni onaylayın. CLI'yi tercih ederseniz:
openclaw pairing list whatsappopenclaw pairing approve whatsapp <CODE>DM erişim isteklerinin süresi 1 saat sonra dolar; bekleyen istekler hesap başına 3 ile sınırlıdır. Bu onay, hesabın kendisini bağlamak için kullanılan WhatsApp oturum açma QR'ından ayrıdır.
Dağıtım kalıpları
Özel numara (önerilen)
- OpenClaw için ayrı WhatsApp kimliği
- daha anlaşılır DM izin listeleri ve yönlendirme sınırları
- kendi kendine sohbet karışıklığı olasılığının daha düşük olması
{ channels: { whatsapp: { dmPolicy: "allowlist", allowFrom: ["+15551234567"], }, },}Kişisel numaraya geri dönüş
İlk katılım, kişisel numara modunu destekler ve kendi kendine sohbete uygun bir temel yapılandırma yazar: dmPolicy: "allowlist", kendi numaranızı içeren allowFrom, selfChatMode: true. Çalışma zamanındaki kendi kendine sohbet korumaları, bağlı kişisel numarayı ve allowFrom değerini anahtar olarak kullanır.
Çalışma zamanı modeli
- Gateway, WhatsApp soketinin ve yeniden bağlanma döngüsünün sahibidir.
- Bir gözetleyici iki sinyali bağımsız olarak izler: ham WhatsApp Web aktarım etkinliği ve uygulama mesajı etkinliği. Sessiz ancak bağlı bir oturum, yalnızca yakın zamanda mesaj gelmediği için yeniden başlatılmaz; yalnızca aktarım çerçeveleri sabit bir dahili süre boyunca (kullanıcı tarafından yapılandırılamaz) gelmeyi durdurduğunda veya uygulama mesajları normal mesaj zaman aşımının 4 katını aşacak kadar sessiz kaldığında yeniden bağlanmayı zorlar. Yakın zamanda etkin olan bir oturum yeniden bağlandıktan hemen sonra bu ilk süre, 4 katlık süre yerine daha kısa olan normal mesaj zaman aşımını kullanır. OpenClaw, Baileys'in bu yeniden bağlanmanın erken aşamasında ilettiği çevrimdışı mesajlara, gelen mesaj kimliği yinelenenleri ayıklama ömrüyle sınırlı olarak otomatik yanıt verebilir; ilk başlatma kısa eski geçmiş korumasını sürdürür.
- Giden gönderimler, hedef hesap için etkin bir WhatsApp dinleyicisi gerektirir; aksi takdirde gönderimler hızla başarısız olur.
- Grup gönderimleri, belirteç mevcut katılımcı meta verileriyle eşleştiğinde
@+<digits>ve@<digits>belirteçleri için (metin ve medya açıklamalarında) LID destekli gruplar dahil olmak üzere yerel bahsetme meta verilerini ekler. - Durum ve yayın sohbetleri (
@status,@broadcast) yok sayılır. - Doğrudan sohbetler DM oturum kurallarını kullanır (
session.dmScope; varsayılanmain, DM'leri aracının ana oturumunda birleştirir). Grup oturumları her JID için yalıtılır (agent:<agentId>:whatsapp:group:<jid>). - WhatsApp Kanalları/Bültenleri, DM semantiği yerine kanal oturumu meta verilerini (
agent:<agentId>:whatsapp:channel:<jid>) kullanarak yerel@newsletterJID'leri aracılığıyla açık giden hedefler olabilir. - WhatsApp Web aktarımı, Gateway ana makinesindeki standart proxy ortam değişkenlerine (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY, küçük harfli çeşitleri) uyar. Kanal başına ayarlar yerine ana makine düzeyinde proxy yapılandırmasını tercih edin.
Mevcut istekte bulunanı MeowCaller ile arayın (deneysel)
Plugin, WhatsApp kaynaklı aracı dönüşlerinde whatsapp_call sunabilir. Mevcut yetkili istekte bulunana WhatsApp sesli araması yapmak ve yanıt verdikten sonra bir OpenClaw TTS mesajı oynatmak için MeowCaller kullanır. Aracın hedef numara parametresi yoktur, bu nedenle bir istem çağrıyı yeniden yönlendiremez. Varsayılan olarak devre dışıdır.
Deneysel aramaları etkinleştirin
WhatsApp kanal yapılandırmasına actions.calls: true ekleyin ve Gateway'i yeniden başlatın:
{"channels": {"whatsapp": { "actions": { "calls": true }}}}Olmadığında veya false olduğunda OpenClaw, whatsapp_call aracını sunmaz.
İncelenen MeowCaller CLI'yi kurun
Bağdaştırıcı, Gateway ana makinesinin PATH konumunda bir meowcaller yürütülebilir dosyası bekler. MeowCaller PR #7 birleştirilene kadar incelenen dalı derleyin:
git clone --branch feat/send-only-notify https://github.com/steipete/meowcaller.gitcd meowcallergit checkout 752050471fc2bf7a8cdfbf7dbd3cd4e865d85d3fmkdir -p "$HOME/.local/bin"go build -o "$HOME/.local/bin/meowcaller" ./cmd/meowcaller$HOME/.local/bin öğesinin Gateway hizmetinin PATH konumunda olduğundan emin olun. Bu revizyonda açık pair ve yalnızca gönderime yönelik notify komutları bulunur; notify hiçbir mikrofonu, hoparlörü, video cihazını veya tanılama yakalamasını açmaz. Bunun yerine yukarı akış örnek CLI'sinin play komutunu kullanmayın.
MeowCaller bağlı cihazını eşleştirin
WhatsApp aracısından arama kurulumunu denetlemesini isteyin (whatsapp_call durum eylemi, hesaba özgü durum dizinini ve eşleştirme komutunu bildirir). Varsayılan hesap için:
state_dir="$HOME/.openclaw/credentials/whatsapp-calls/default"mkdir -p "$state_dir"chmod 700 "$state_dir"meowcaller pair --store "$state_dir/wa-voip.db"Bunu etkileşimli olarak çalıştırın, WhatsApp > Linked devices bölümünden QR'ı tarayın ve MeowCaller linked device ready için bekleyin. wa-voip.db öğesini gizli tutun; bu, MeowCaller oturumudur. Varsayılan olmayan hesaplar durum eyleminden kendi depo yollarını alır; Windows'ta bunun PowerShell komutunu çalıştırın.
TTS'yi yapılandırın ve WhatsApp'tan arama yapın
Telefon kullanımına uygun bir TTS sağlayıcısı yapılandırın, Gateway'i yeniden başlatın ve ardından Call me and say the build finished. gibi bir istek gönderin. Araç, göndereni güvenilir gelen bağlamdan çözümler, geçici bir özel WAV dosyası sentezler, MeowCaller'ı sınırlı bir çağrı süresi boyunca çalıştırır ve ardından ses dosyasını siler. OpenClaw, hesabın deposunu açıkça iletir; yanıtlama/oynatma/kapatma sonrasında sıfır çıkış durumu bekler ve zaman aşımını veya sıfır dışı çıkışı başarısız bir araç çağrısı olarak değerlendirir.
Sınırlar: yalnızca bire bir giden sesli aramalar; rastgele hedef numara yok; sohbet bağlantısıyla paylaşılan kimlik doğrulama yok; kişisel numara/kendi kendine sohbet modundan kendi kendini arama yok; sentezlenen ses 60 saniyeyle sınırlıdır; MeowCaller'ın yanıtlama/oynatma/kapatma tamamlanması dışında telefon tarafında duyulabilirlik alındısı yoktur ve OpenClaw, yardımcı işlemi sınırlı bir 115-175 saniyelik süreden sonra durdurur (MeowCaller'ın bağlantı, yanıtlama, oynatma ve kapanma aşamalarını kapsar).
Onay istemleri
WhatsApp, yürütme ve plugin onay istemlerini üst düzey onay iletme yapılandırmasıyla denetlenen 👍/👎 tepkileri olarak işleyebilir:
{ approvals: { exec: { enabled: true, mode: "session", }, plugin: { enabled: true, mode: "targets", targets: [{ channel: "whatsapp", to: "+15551234567" }], }, },}approvals.exec ve approvals.plugin birbirinden bağımsızdır; WhatsApp'ı kanal olarak etkinleştirmek yalnızca aktarımı bağlar ve eşleşen onay ailesi etkinleştirilip oraya yönlendirilmedikçe hiçbir şey göndermez. Oturum modu, yalnızca WhatsApp'tan kaynaklanan onaylar için yerel emoji onayları iletir. Hedef modu, açık hedefler için paylaşılan iletme işlem hattını kullanır ve ayrı onaylayıcı DM dağıtımı oluşturmaz.
WhatsApp onay tepkileri, allowFrom (veya "*") içinde açık onaylayıcılar gerektirir. defaultTo, onaylayıcı listesi değil, sıradan varsayılan mesaj hedeflerini ayarlar. Manuel /approve komutları, onay çözümlenmeden önce yine normal WhatsApp gönderen yetkilendirme yolundan geçer.
Soru tepkileri
Gizli olmayan, tek seçimli bir soru ve bir ile dört seçenek içeren ask_user istemi için WhatsApp, seçenek etiketlerinin yanında 1️⃣ ile 4️⃣ arasındaki değerleri gösterir. Yanıtlamak için iletilen isteme eşleşen numarayla tepki verin. OpenClaw, numarayı Gateway aracılığıyla kurallı seçeneğe eşler; eski veya yinelenen dokunuşlar yok sayılır. Çok sorulu, çok seçimli ve serbest metin istemleri yalnızca metin yanıtlı olarak kalır. Normal WhatsApp DM/grup kabul kuralları, tepki veren göndereni yetkilendirir.
Plugin kancaları ve gizlilik
Gelen WhatsApp mesajları kişisel içerik, telefon numaraları, grup tanımlayıcıları, gönderen adları ve oturum ilişkilendirme alanları taşıyabilir. WhatsApp, siz etkinleştirmedikçe gelen message_received kanca yüklerini pluginlere yayınlamaz:
{ channels: { whatsapp: { pluginHooks: { messageReceived: true, }, }, },}Etkinleştirme kapsamını channels.whatsapp.accounts.<id>.pluginHooks.messageReceived altında tek bir hesapla sınırlayın. Bunu yalnızca gelen WhatsApp içeriği ve tanımlayıcıları konusunda güvendiğiniz pluginler için etkinleştirin.
Erişim denetimi ve etkinleştirme
DM politikası
channels.whatsapp.dmPolicy:
| Değer | Davranış |
|---|---|
pairing (varsayılan) |
Bilinmeyen gönderenler eşleştirme ister; sahip onaylar |
allowlist |
Yalnızca allowFrom gönderenleri kabul edilir |
open |
allowFrom öğesinin "*" içermesini gerektirir |
disabled |
Tüm DM'leri engeller |
allowFrom, E.164 biçimli numaraları kabul eder (dahili olarak normalleştirilir). Bu yalnızca DM göndereni için bir erişim denetimi listesidir — grup JID'lerine veya @newsletter kanal JID'lerine açıkça yapılan giden gönderimleri kısıtlamaz.
Çoklu hesap geçersiz kılması: channels.whatsapp.accounts.<id>.dmPolicy (ve .allowFrom), ilgili hesap için kanal düzeyindeki varsayılanlardan önceliklidir.
Çalışma zamanı notları:
- eşleştirmeler kanal izin deposunda kalıcıdır ve yapılandırılmış
allowFromile birleştirilir - zamanlanmış otomasyon ve heartbeat alıcısı yedeği, açık teslimat hedeflerini veya yapılandırılmış
allowFromdeğerini kullanır; DM eşleştirme onayları örtük cron/heartbeat alıcıları değildir - hiçbir izin listesi yapılandırılmamışsa bağlı öz numaraya varsayılan olarak izin verilir
- OpenClaw, giden
fromMeDM'lerini (bağlı cihazdan kendinize gönderdiğiniz mesajları) hiçbir zaman otomatik olarak eşleştirmez
Grup politikası ve izin listeleri
Grup erişiminin iki katmanı vardır:
- Grup üyeliği izin listesi (
channels.whatsapp.groups):groupsbelirtilmezse tüm gruplar uygundur; mevcutsa grup izin listesi görevi görür ("*"tümünü kabul eder). - Grup göndereni politikası (
channels.whatsapp.groupPolicy+groupAllowFrom):opengönderen izin listesini atlar,allowlistbirgroupAllowFrom(veya*) eşleşmesi gerektirir,disabledgelen tüm grup iletilerini engeller.
groupAllowFrom ayarlanmamışsa ve allowFrom girdiler içeriyorsa gönderen denetimleri ona geri döner. Gönderen izin listeleri, bahsetme/yanıt etkinleştirmesinden önce değerlendirilir.
Hiç channels.whatsapp bloğu yoksa çalışma zamanı, channels.defaults.groupPolicy başka bir değere ayarlanmış olsa bile groupPolicy: "allowlist" değerine geri döner (bir uyarı günlüğüyle).
Bahsetmeler ve /activation
Grup yanıtları varsayılan olarak bahsetme gerektirir. Bahsetme algılaması şunları içerir:
- bot kimliğinden açıkça bahseden WhatsApp bahsetmeleri
- yapılandırılmış bahsetme regex kalıpları (
agents.entries.*.groupChat.mentionPatterns, geri dönüşmessages.groupChat.mentionPatterns) - yetkili grup mesajlarının gelen sesli not dökümleri
- örtük bota-yanıt algılaması (yanıtı gönderen bot kimliğiyle eşleşir)
Güvenlik: alıntı/yanıt yalnızca bahsetme kısıtlamasını karşılar — gönderen yetkisi vermez. groupPolicy: "allowlist" ile izin listesinde bulunmayan gönderenler, izin listesindeki bir kullanıcının mesajına yanıt verseler bile engellenmeye devam eder.
Oturum düzeyinde etkinleştirme komutu: /activation mention veya /activation always. Bu, oturum durumunu günceller (genel yapılandırmayı değil) ve sahip denetimine tabidir.
Yapılandırılmış ACP bağlamaları
WhatsApp, üst düzey bindings[] aracılığıyla kalıcı ACP bağlamalarını destekler:
{ bindings: [ { type: "acp", agentId: "codex", match: { channel: "whatsapp", accountId: "work", peer: { kind: "direct", id: "+15555550123" }, }, }, { type: "acp", agentId: "codex", match: { channel: "whatsapp", accountId: "work", peer: { kind: "group", id: "120363424282127706@g.us" }, }, }, ],}Doğrudan sohbetler E.164 numaralarıyla, gruplar ise WhatsApp grup JID'leriyle eşleşir. Grup izin listeleri, gönderen politikası ve bahsetme/etkinleştirme kısıtlaması, OpenClaw bağlı ACP oturumunun varlığını sağlamadan önce çalışır. Eşleşen bir bağlama rotanın sahibidir — yayın grupları bu etkileşimi sıradan WhatsApp oturumlarına dağıtmaz.
Kişisel numara ve kendi kendine sohbet davranışı
Bağlı öz numara allowFrom içinde de yer aldığında kendi kendine sohbet güvenlik önlemleri etkinleşir: kendi kendine sohbet etkileşimleri için okundu bilgilerini atlar, kendinize bildirim gönderecek bahsetme JID'si otomatik tetikleme davranışını yok sayar ve kanal/hesap responsePrefix değeri ayarlanmamışsa yanıtları varsayılan olarak [{identity.name}] (veya [openclaw]) değerine yönlendirir.
Mesaj normalleştirme ve bağlam
Gelen zarf ve yanıt bağlamı
Gelen mesajlar paylaşılan gelen zarfla sarmalanır. Alıntılanmış bir yanıt, bağlamı şu biçimde ekler:
[Replying to <sender> id:<stanzaId>]<quoted body or media placeholder>[/Replying]Yanıt meta verileri (ReplyToId, ReplyToBody, ReplyToSender, gönderen JID'si/E.164) mevcut olduğunda doldurulur. Alıntılanan hedef indirilebilir bir medyaysa OpenClaw bunu normal gelen medya deposu aracılığıyla kaydeder ve MediaPath/MediaType değerlerini sunar; böylece ajan yalnızca <media:image> görmek yerine medyayı doğrudan inceleyebilir.
Medya yer tutucuları ve konum/kişi çıkarımı
Yalnızca medya içeren mesajlar şu yer tutuculara normalleştirilir: <media:image>, <media:video>, <media:audio>, <media:document>, <media:sticker>.
Gövde yalnızca <media:audio> olduğunda yetkili grup sesli notları bahsetme kısıtlamasından önce yazıya dökülür; böylece sesli notta bottan bahsedilmesi yanıtı tetikleyebilir. Dökümde hâlâ bottan bahsedilmiyorsa ham yer tutucu yerine bekleyen grup geçmişinde kalır.
Konum gövdeleri kısa koordinat metni olarak işlenir. Konum etiketleri/yorumları ve kişi/vCard ayrıntıları, satır içi istem metni olarak değil, çitle çevrili güvenilmeyen meta veriler olarak işlenir.
Bekleyen grup geçmişinin eklenmesi
İşlenmemiş grup mesajları arabelleğe alınır ve bot nihayet tetiklendiğinde bağlam olarak eklenir.
- varsayılan sınır:
50 - yapılandırma:
channels.whatsapp.historyLimit, geri dönüşmessages.groupChat.historyLimit 0devre dışı bırakır
Ekleme işaretçileri: [Chat messages since your last reply - for context] ve [Current message - respond to this].
Okundu bilgileri
Kabul edilen gelen mesajlar için varsayılan olarak etkindir. Genel olarak devre dışı bırakmak için:
{ channels: { whatsapp: { sendReadReceipts: false } } }Hesap başına geçersiz kılma: channels.whatsapp.accounts.<id>.sendReadReceipts. Kendi kendine sohbet etkileşimleri, genel olarak etkin olsa bile okundu bilgilerini atlar.
Teslimat, parçalara ayırma ve medya
Metni parçalara ayırma
- varsayılan parça sınırı:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.streaming.chunkMode = "length" | "newline";newlineparagraf sınırlarını (boş satırları) tercih eder, ardından uzunluk açısından güvenli parçalara ayırmaya geri döner
Giden medya davranışı
- görsel, video, ses (PTT sesli notu) ve belge yüklerini destekler
- ses,
ptt: trueile Baileysaudioyükü olarak gönderilir ve bas-konuş sesli notu şeklinde işlenir; TTS sesli not çıktısının sağlayıcının kaynak biçiminden bağımsız olarak bu yolda kalması içinaudioAsVoiceyanıt yüklerinde korunur - yerel Ogg/Opus sesi
audio/ogg; codecs=opusolarak gönderilir; diğer her şey (Microsoft Edge TTS MP3/WebM çıktısı dâhil), PTT teslimatından önceffmpegile 48 kHz mono Ogg/Opus biçimine dönüştürülür /tts latest, en son asistan yanıtını tek bir sesli not olarak gönderir ve aynı yanıtın yinelenen gönderimlerini engeller;/tts chat on|off|defaultmevcut sohbet için otomatik TTS'yi denetler- videolarda
gifPlayback: truegönderilmesi animasyonlu GIF oynatmayı etkinleştirir forceDocument/asDocument, WhatsApp'ın medya sıkıştırmasını önlemek için giden görselleri, GIF'leri ve videoları Baileys belge yükü üzerinden yönlendirerek çözümlenen dosya adını ve MIME türünü korur- altyazılar, çok medyalı bir yanıttaki ilk medya öğesine uygulanır; PTT sesli notları istisnadır: ses önce altyazısız gönderilir, ardından altyazı ayrı bir metin mesajı olarak gönderilir (WhatsApp istemcileri sesli not altyazılarını tutarlı biçimde işlemez)
- medya kaynağı HTTP(S),
file://veya yerel bir yol olabilir
Medya boyutu sınırları ve geri dönüş davranışı
- gelen kaydetme üst sınırı ve giden gönderme üst sınırı:
channels.whatsapp.mediaMaxMb(varsayılan50) - hesap başına geçersiz kılma:
channels.whatsapp.accounts.<id>.mediaMaxMb forceDocument/asDocumentbelge teslimatı istemediği sürece görseller sınırlara sığmak için otomatik olarak optimize edilir (yeniden boyutlandırma/kalite taraması)- medya gönderimi başarısız olduğunda ilk öğe geri dönüşü, yanıtı sessizce bırakmak yerine bir metin uyarısı gönderir
Yanıt alıntılama
channels.whatsapp.replyToMode, yerel yanıt alıntılamayı denetler (giden yanıtlar gelen mesajı görünür şekilde alıntılar):
| Değer | Davranış |
|---|---|
"off" (varsayılan) |
Hiçbir zaman alıntılama; düz mesaj olarak gönder |
"first" |
Yalnızca ilk giden yanıt parçasını alıntıla |
"all" |
Her giden yanıt parçasını alıntıla |
"batched" |
Kuyruğa alınmış toplu yanıtları alıntıla; anlık yanıtları alıntısız bırak |
Hesap başına geçersiz kılma: channels.whatsapp.accounts.<id>.replyToMode.
{ channels: { whatsapp: { replyToMode: "first" } } }Tepki düzeyi
channels.whatsapp.reactionLevel, ajanın emoji tepkilerini ne ölçüde kullandığını denetler:
| Düzey | Onay tepkileri | Ajan tarafından başlatılan tepkiler |
|---|---|---|
"off" |
Hayır | Hayır |
"ack" |
Evet | Hayır |
"minimal" (varsayılan) |
Evet | Evet, ölçülü yönlendirme |
"extensive" |
Evet | Evet, teşvik edilen yönlendirme |
Hesap başına geçersiz kılma: channels.whatsapp.accounts.<id>.reactionLevel.
{ channels: { whatsapp: { reactionLevel: "ack" } } }Alındı onayı tepkileri
channels.whatsapp.ackReaction, gelen ileti alındığında reactionLevel tarafından kısıtlanan anlık bir tepki gönderir ("off" olduğunda engellenir):
{ channels: { whatsapp: { ackReaction: { emoji: "👀", direct: true, group: "mentions", // her zaman | bahsetmeler | hiçbir zaman }, }, },}Notlar: gelen ileti kabul edildikten hemen sonra (yanıttan önce) gönderilir; ackReaction, emoji olmadan mevcutsa WhatsApp, yönlendirilen ajanın kimlik emojisini kullanır ve mevcut değilse "👀" değerine geri döner (onay tepkisi olmaması için ackReaction değerini atlayın veya emoji: "" olarak ayarlayın); hatalar günlüğe kaydedilir ancak yanıt teslimatını engellemez; grup modu mentions yalnızca bahsetmeyle tetiklenen etkileşimlerde tepki verirken grup etkinleştirmesi always bu denetimi atlar; WhatsApp yalnızca channels.whatsapp.ackReaction kullanır (eski messages.ackReaction burada geçerli değildir).
Yaşam döngüsü durumu tepkileri
WhatsApp'ın bir etkileşim sırasında statik bir alındı emojisi bırakmak yerine onay tepkisini değiştirmesini ve kuyrukta, düşünüyor, araç etkinliği, Compaction, tamamlandı ve hata gibi durumlar arasında geçiş yapmasını sağlamak için messages.statusReactions.enabled: true değerini ayarlayın:
{ messages: { statusReactions: { enabled: true, }, },}Notlar: channels.whatsapp.ackReaction, doğrudan mesajlar ve gruplar için uygunluğu denetlemeye devam eder; kuyrukta durumu, düz onay tepkileriyle aynı etkin emojiyi kullanır; WhatsApp'ta mesaj başına bir bot tepki yuvası bulunur, bu nedenle yaşam döngüsü güncellemeleri mevcut tepkiyi yerinde değiştirir ve son tamamlandı/hata durumundan sonra onay tepkisini geri yükler.
Çoklu hesap ve kimlik bilgileri
Hesap seçimi ve varsayılanlar
Hesap kimlikleri channels.whatsapp.accounts kaynağından gelir. Varsa varsayılan hesap seçimi default, aksi takdirde yapılandırılmış ilk hesap kimliğidir (alfabetik olarak sıralanır). Hesap kimlikleri, arama için dahili olarak normalleştirilir.
Kimlik bilgisi yolları ve eski sürüm uyumluluğu
- geçerli kimlik doğrulama yolu:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json(yedek:creds.json.bak) ~/.openclaw/credentials/içindeki eski varsayılan kimlik doğrulama, varsayılan hesap akışları için hâlâ tanınır/taşınır
Oturumu kapatma davranışı
openclaw channels logout --channel whatsapp [--account <id>], söz konusu hesabın WhatsApp kimlik doğrulama durumunu temizler. Bir gateway erişilebilir olduğunda oturum kapatma işlemi önce o hesabın canlı dinleyicisini durdurur; böylece bağlı oturum, bir sonraki yeniden başlatmadan önce mesaj almayı bırakır. openclaw channels remove --channel whatsapp ayrıca hesap yapılandırmasını devre dışı bırakmadan veya silmeden önce canlı dinleyiciyi durdurur.
Eski kimlik doğrulama dizinlerinde Baileys kimlik doğrulama dosyaları kaldırılırken oauth.json korunur.
Araçlar, eylemler ve yapılandırma yazma işlemleri
- Agent araç desteği, WhatsApp tepki eylemini (
react) içerir. - Eylem geçitleri:
channels.whatsapp.actions.reactions,channels.whatsapp.actions.polls(mevcut eylemlerin varsayılanıtrue),channels.whatsapp.actions.calls(varsayılanfalse, yukarıdaki MeowCaller bölümüne bakın). - Kanal tarafından başlatılan yapılandırma yazma işlemleri varsayılan olarak etkindir;
channels.whatsapp.configWrites: falsearacılığıyla devre dışı bırakın.
Sorun giderme
Bağlı değil (QR gerekli)
Belirti: kanal durumu, bağlı olmadığını bildirir.
openclaw channels login --channel whatsappopenclaw channels statusBağlı ancak bağlantı kesilmiş / yeniden bağlanma döngüsü
Belirti: bağlı hesapta tekrarlanan bağlantı kesilmeleri veya yeniden bağlanma girişimleri.
Etkin olmayan hesaplar normal mesaj zaman aşımını aşarak bağlı kalabilir; watchdog yalnızca WhatsApp Web aktarım etkinliği durduğunda, soket kapandığında veya uygulama düzeyindeki etkinlik daha uzun güvenlik aralığının ötesinde sessiz kaldığında yeniden başlatır (yukarıdaki Çalışma zamanı modeli bölümüne bakın).
Düzeltme:
openclaw channels status --probeopenclaw doctoropenclaw logs --followopenclaw gateway statusAna makine bağlantısı ve zamanlama düzeltildikten sonra döngü devam ederse hesap kimlik doğrulama dizinini yedekleyip yeniden bağlayın:
cp -a ~/.openclaw/credentials/whatsapp/<accountId> \ ~/.openclaw/credentials/whatsapp/<accountId>.bakopenclaw channels logout --channel whatsapp --account <accountId>openclaw channels login --channel whatsapp --account <accountId>~/.openclaw/logs/whatsapp-health.log, Gateway inactive diyorsa ancak openclaw gateway status ve openclaw channels status --probe sağlıklı görünüyorsa openclaw doctor komutunu çalıştırın. Linux'ta doctor, kullanımdan kaldırılan ~/.openclaw/bin/ensure-whatsapp.sh betiğini çağıran eski crontab girdileri hakkında uyarır; bu girdileri crontab -e ile kaldırın — cron, systemd kullanıcı veri yolu ortamından yoksun olabilir ve bu eski betiğin gateway durumunu yanlış bildirmesine neden olabilir.
Proxy arkasında QR ile oturum açma zaman aşımına uğruyor
Belirti: openclaw channels login --channel whatsapp, kullanılabilir bir QR göstermeden önce status=408 Request Time-out veya bir TLS soket bağlantı kesintisiyle başarısız olur.
WhatsApp Web ile oturum açma, gateway ana makinesinin standart proxy ortamını (HTTPS_PROXY, HTTP_PROXY, küçük harfli türevleri, NO_PROXY) kullanır. Gateway işleminin proxy ortam değişkenlerini devraldığını ve NO_PROXY değerinin mmg.whatsapp.net ile eşleşmediğini doğrulayın.
Gönderim sırasında etkin dinleyici yok
Hedef hesap için etkin bir gateway dinleyicisi olmadığında giden gönderimler hızla başarısız olur. Gateway'in çalıştığını ve hesabın bağlı olduğunu doğrulayın.
Yanıt dökümde görünüyor ancak WhatsApp'ta görünmüyor
Döküm satırları, agent tarafından oluşturulan içeriği kaydeder; WhatsApp teslimatı ayrı olarak denetlenir. OpenClaw, yalnızca Baileys en az bir görünür metin veya medya gönderimi için bir giden mesaj kimliği döndürdükten sonra otomatik yanıtı gönderilmiş sayar.
Onay tepkileri, yanıttan bağımsız ön alındı bildirimleridir — başarılı bir tepki, daha sonraki metin/medya yanıtının kabul edildiğini kanıtlamaz. Gateway günlüklerinde auto-reply delivery failed veya auto-reply was not accepted by WhatsApp provider ifadelerini denetleyin.
Grup mesajları beklenmedik şekilde yok sayılıyor
Şu sırayla denetleyin: groupPolicy, groupAllowFrom/allowFrom, groups izin listesi girdileri, bahsetme geçidi (requireMention + bahsetme kalıpları) ve openclaw.json içindeki yinelenen anahtarlar (JSON5'te sonraki girdiler öncekileri geçersiz kılar — kapsam başına yalnızca bir groupPolicy tutun).
channels.whatsapp.groups mevcutsa WhatsApp diğer gruplardan gelen mesajları yine de gözlemleyebilir, ancak OpenClaw bunları oturum yönlendirmesinden önce bırakır. Grup JID'sini channels.whatsapp.groups öğesine ekleyin veya gönderen yetkilendirmesini groupPolicy/groupAllowFrom denetimi altında tutarken tüm grupları kabul etmek için groups["*"] ekleyin.
Bun çalışma zamanı uyarısı
OpenClaw gateway'leri Node gerektirir. Bun, standart durum deposunun kullandığı node:sqlite API'sini sağlamaz ve doctor eski Bun hizmetlerini Node'a taşır.
Sistem istemleri
WhatsApp, groups ve direct eşlemeleri aracılığıyla gruplar ve doğrudan sohbetler için Telegram tarzı sistem istemlerini destekler.
Grup mesajlarının çözümlenmesi: Önce etkin groups eşlemesi belirlenir — hesap kendi groups anahtarını herhangi bir şekilde tanımlıyorsa kök groups eşlemesini tamamen değiştirir (derin birleştirme yapılmaz). Ardından istem araması, ortaya çıkan bu tek eşleme üzerinde çalışır:
- Gruba özgü istem (
groups["<groupId>"].systemPrompt): grup girdisi mevcut vesystemPromptanahtarı tanımlı olduğunda kullanılır. Boş bir dize ("") joker karakteri bastırır ve hiçbir istem uygulamaz. - Grup joker karakteri istemi (
groups["*"].systemPrompt): belirli grup girdisi mevcut olmadığında veyasystemPromptanahtarı olmadan mevcut olduğunda kullanılır.
Doğrudan mesajların çözümlenmesi, direct eşlemesi ve direct["*"] üzerinde aynı kalıbı izler.
Telegram'dan farkı: Telegram, bir botun üyesi olmadığı gruplardan grup mesajları almasını önlemek için çok hesaplı bir kurulumdaki her hesapta kök groups değerini bastırır (kendi groups değeri olmayan hesaplarda bile). WhatsApp bu korumayı uygulamaz — kök groups/direct, hesap sayısından bağımsız olarak kendi geçersiz kılması bulunmayan her hesap tarafından devralınır. Çok hesaplı bir WhatsApp kurulumunda hesap başına istemler istiyorsanız tam eşlemeyi her hesabın altında açıkça tanımlayın.
Önemli davranış:
channels.whatsapp.groupshem grup başına yapılandırma eşlemesi hem de sohbet düzeyindeki grup izin listesidir. Kök veya hesap kapsamındagroups["*"], söz konusu kapsam için "tüm gruplar kabul edilir" anlamına gelir.- Yalnızca söz konusu kapsamın tüm grupları kabul etmesini zaten istiyorsanız bir
systemPromptjoker karakteri ekleyin. Yalnızca sabit bir grup kimliği kümesini uygun tutmak içingroups["*"]kullanmak yerine istemi açıkça izin verilen her girdide tekrarlayın. - Grup kabulü ve gönderen yetkilendirmesi ayrı denetimlerdir.
groups["*"], hangi grupların grup işlemeye ulaşacağını genişletir; bu gruplardaki her gönderene yetki vermez — bu işlemgroupPolicy/groupAllowFromtarafından denetlenmeye devam eder. channels.whatsapp.direct, DM'ler için eşdeğer bir yan etkiye sahip değildir:direct["*"], yalnızca bir DMdmPolicyile birlikteallowFromveya eşleştirme deposu kuralları tarafından zaten kabul edildikten sonra varsayılan bir yapılandırma sağlar.
Örnek:
{ channels: { whatsapp: { groups: { // Yalnızca tüm grupların kök kapsamında kabul edilmesi gerekiyorsa kullanın. // Kendi groups eşlemesini tanımlamayan tüm hesaplara uygulanır. "*": { systemPrompt: "Tüm gruplar için varsayılan istem." }, }, direct: { // Kendi direct eşlemesini tanımlamayan tüm hesaplara uygulanır. "*": { systemPrompt: "Tüm doğrudan sohbetler için varsayılan istem." }, }, accounts: { work: { groups: { // Bu hesap kendi groups eşlemesini tanımlar, dolayısıyla kök groups eşlemesi tamamen // değiştirilir. Joker karakteri korumak için "*" değerini burada da açıkça tanımlayın. "120363406415684625@g.us": { requireMention: false, systemPrompt: "Proje yönetimine odaklan.", }, // Yalnızca bu hesapta tüm grupların kabul edilmesi gerekiyorsa kullanın. "*": { systemPrompt: "İş grupları için varsayılan istem." }, }, direct: { // Bu hesap kendi direct eşlemesini tanımlar, dolayısıyla kök direct girdileri // tamamen değiştirilir. Joker karakteri korumak için "*" değerini burada da açıkça tanımlayın. "+15551234567": { systemPrompt: "Belirli bir doğrudan iş sohbeti için istem." }, "*": { systemPrompt: "Doğrudan iş sohbetleri için varsayılan istem." }, }, }, }, }, },}Yapılandırma başvurusu bağlantıları
Birincil başvuru: Yapılandırma başvurusu - WhatsApp
| Alan | Alanlar |
|---|---|
| Erişim | dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups |
| Teslimat | textChunkLimit, streaming.chunkMode, mediaMaxMb, sendReadReceipts, ackReaction, reactionLevel |
| Çoklu hesap | accounts.<id>.enabled, accounts.<id>.authDir ve diğer hesap başına geçersiz kılmalar |
| İşlemler | configWrites, enabled |
| Gelen toplu işleme | messages.inbound.debounceMs, messages.inbound.byChannel.whatsapp |
| Oturum davranışı | session.dmScope, historyLimit, dmHistoryLimit, dms.<id>.historyLimit |
| İstemler | groups.<id>.systemPrompt, groups["*"].systemPrompt, direct.<id>.systemPrompt, direct["*"].systemPrompt |