Durum: WhatsApp Web (Baileys) üzerinden üretime hazır. Gateway bağlı oturum(lar)ın sahibidir.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Kurulum (isteğe bağlı)
- Onboarding (
openclaw onboard) veopenclaw channels add --channel whatsapp, WhatsApp Plugin’ini ilk kez seçtiğinizde kurmanızı ister. openclaw channels login --channel whatsapp, Plugin henüz mevcut değilse kurulum akışını da sunar.- Geliştirme kanalı + git checkout: varsayılan olarak yerel Plugin yolunu kullanır.
- Stable/Beta: geçerli resmi sürüm etiketindeki npm paketi
@openclaw/whatsappkullanılır.
PATH üzerinde Git’e ihtiyaç duyar çünkü
Baileys/libsignal bağımlılıklarından biri bir git URL’sinden alınır. Git for Windows’ı kurun,
ardından kabuğu yeniden başlatıp kurulumu tekrar çalıştırın:
bin dizini PATH üzerindeyse çalışır.
Pairing
Channel troubleshooting
Gateway configuration
Hızlı kurulum
Link WhatsApp (QR)
Dağıtım desenleri
Dedicated number (recommended)
Dedicated number (recommended)
- OpenClaw için ayrı WhatsApp kimliği
- daha net DM izin listeleri ve yönlendirme sınırları
- kendi kendine sohbet karışıklığı olasılığının daha düşük olması
Personal-number fallback
Personal-number fallback
dmPolicy: "allowlist"allowFromkişisel numaranızı içerirselfChatMode: true
allowFrom değerini temel alır.WhatsApp Web-only channel scope
WhatsApp Web-only channel scope
Baileys).Yerleşik sohbet kanalı kayıt defterinde ayrı bir Twilio WhatsApp mesajlaşma kanalı yoktur.Çalışma zamanı modeli
- Gateway, WhatsApp soketinin ve yeniden bağlanma döngüsünün sahibidir.
- Yeniden bağlanma izleyicisi, yalnızca gelen uygulama iletisi hacmini değil, WhatsApp Web aktarım etkinliğini kullanır; bu nedenle sessiz bir bağlı cihaz oturumu yalnızca yakın zamanda kimse ileti göndermediği için yeniden başlatılmaz. Daha uzun bir uygulama sessizliği üst sınırı, aktarım çerçeveleri gelmeye devam etse ancak izleyici penceresi boyunca hiçbir uygulama iletisi işlenmese yine de yeniden bağlanmayı zorlar; yakın zamanda etkin olan bir oturum için geçici bir yeniden bağlanmadan sonra, bu uygulama sessizliği denetimi ilk kurtarma penceresinde normal ileti zaman aşımını kullanır.
- Baileys soket zamanlamaları
web.whatsapp.*altında açıktır:keepAliveIntervalMsWhatsApp Web uygulama ping’lerini,connectTimeoutMsaçılış el sıkışması zaman aşımını vedefaultQueryTimeoutMsBaileys sorgu zaman aşımlarını kontrol eder. - Giden gönderimler, hedef hesap için etkin bir WhatsApp dinleyicisi gerektirir.
- Grup gönderimleri, metin ve medya açıklamalarındaki
@+<digits>ve@<digits>belirteçleri geçerli WhatsApp katılımcı meta verileriyle eşleştiğinde, LID destekli gruplar dahil olmak üzere yerel bahsetme meta verilerini ekler. - Durum ve yayın sohbetleri yok sayılır (
@status,@broadcast). - Yeniden bağlanma izleyicisi, yalnızca gelen uygulama iletisi hacmini değil, WhatsApp Web aktarım etkinliğini izler: sessiz bağlı cihaz oturumları aktarım çerçeveleri devam ederken açık kalır, ancak aktarım durması daha sonraki uzak bağlantı kesme yolundan çok önce yeniden bağlanmayı zorlar.
- Doğrudan sohbetler DM oturum kurallarını kullanır (
session.dmScope; varsayılanmain, DM’leri temsilcinin ana oturumuna toplar). - Grup oturumları yalıtılmıştır (
agent:<agentId>:whatsapp:group:<jid>). - WhatsApp Channels/Newsletters, yerel
@newsletterJID’leriyle açık giden hedefler olabilir. Giden newsletter gönderimleri, DM oturum semantiği yerine kanal oturumu meta verilerini (agent:<agentId>:whatsapp:channel:<jid>) kullanır. - WhatsApp Web aktarımı, Gateway ana makinesindeki standart proxy ortam değişkenlerini dikkate alır (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ küçük harfli varyantlar). Kanal özelindeki WhatsApp proxy ayarları yerine ana makine düzeyi proxy yapılandırmasını tercih edin. messages.removeAckAfterReplyetkinleştirildiğinde OpenClaw, görünür bir yanıt teslim edildikten sonra WhatsApp ack tepkisini temizler.
Plugin kancaları ve gizlilik
WhatsApp gelen iletileri kişisel ileti içeriği, telefon numaraları, grup tanımlayıcıları, gönderen adları ve oturum korelasyon alanları içerebilir. Bu nedenle, WhatsApp, açıkça dahil olmadığınız sürece gelenmessage_received kanca yüklerini Plugin’lere
yayınlamaz:
Erişim denetimi ve etkinleştirme
- DM policy
- Group policy + allowlists
- Mentions + /activation
channels.whatsapp.dmPolicy doğrudan sohbet erişimini kontrol eder:pairing(varsayılan)allowlistopen(allowFromdeğerinin"*"içermesini gerektirir)disabled
allowFrom, E.164 tarzı numaraları kabul eder (dahili olarak normalleştirilir).allowFrom, bir DM gönderen erişim denetimi listesidir. WhatsApp grup JID’lerine veya @newsletter kanal JID’lerine açık giden gönderimleri kısıtlamaz.Çok hesaplı geçersiz kılma: channels.whatsapp.accounts.<id>.dmPolicy (ve allowFrom), o hesap için kanal düzeyi varsayılanlara göre önceliklidir.Çalışma zamanı davranış ayrıntıları:- eşleştirmeler kanal izin deposunda kalıcılaştırılır ve yapılandırılmış
allowFromile birleştirilir - zamanlanmış otomasyon ve Heartbeat alıcı yedeği, açık teslim hedeflerini veya yapılandırılmış
allowFromdeğerini kullanır; DM eşleştirme onayları örtük cron veya Heartbeat alıcıları değildir - hiçbir izin listesi yapılandırılmamışsa bağlı kendi numarası varsayılan olarak izinlidir
- OpenClaw, giden
fromMeDM’lerini (bağlı cihazdan kendinize gönderdiğiniz iletiler) hiçbir zaman otomatik eşleştirmez
Kişisel numara ve kendi kendine sohbet davranışı
Bağlı kendi numarasıallowFrom içinde de mevcut olduğunda, WhatsApp kendi kendine sohbet korumaları etkinleşir:
- kendi kendine sohbet turları için okundu bilgilerini atla
- aksi halde kendinize ping atacak bahsetme-JID otomatik tetikleme davranışını yok say
messages.responsePrefixayarlanmamışsa kendi kendine sohbet yanıtları varsayılan olarak[{identity.name}]veya[openclaw]olur
İleti normalleştirme ve bağlam
Inbound envelope + reply context
Inbound envelope + reply context
ReplyToId, ReplyToBody, ReplyToSender, gönderen JID/E.164).
Alıntılanan yanıt hedefi indirilebilir medya olduğunda OpenClaw bunu
normal gelen medya deposu üzerinden kaydeder ve MediaPath/MediaType olarak sunar; böylece
temsilci yalnızca <media:image> görmek yerine başvurulan görseli inceleyebilir.Media placeholders and location/contact extraction
Media placeholders and location/contact extraction
<media:image><media:video><media:audio><media:document><media:sticker>
<media:audio> olduğunda bahsetme geçidinden önce
yazıya dökülür; bu nedenle sesli notta bot bahsetmesini söylemek
yanıtı tetikleyebilir. Döküm yine de bottan bahsetmiyorsa,
ham yer tutucu yerine bekleyen grup geçmişinde tutulur.Konum gövdeleri kısa koordinat metni kullanır. Konum etiketleri/yorumları ve kişi/vCard ayrıntıları, satır içi istem metni olarak değil, çitle çevrilmiş güvenilmeyen meta veri olarak işlenir.Pending group history injection
Pending group history injection
- varsayılan sınır:
50 - config:
channels.whatsapp.historyLimit - yedek:
messages.groupChat.historyLimit 0devre dışı bırakır
[Chat messages since your last reply - for context][Current message - respond to this]
Okundu bilgileri
Okundu bilgileri
Teslim, parçalama ve medya
Metin parçalama
Metin parçalama
- varsayılan parça sınırı:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"newlinemodu paragraf sınırlarını (boş satırlar) tercih eder, ardından uzunluk açısından güvenli parçalamaya geri döner
Giden medya davranışı
Giden medya davranışı
- görsel, video, ses (PTT sesli not) ve belge yüklerini destekler
- ses medyası Baileys
audioyükü üzerindenptt: trueile gönderilir, bu yüzden WhatsApp istemcileri bunu bas-konuş sesli notu olarak işler - yanıt yükleri
audioAsVoicedeğerini korur; WhatsApp için TTS sesli not çıktısı, sağlayıcı MP3 veya WebM döndürse bile bu PTT yolunda kalır - yerel Ogg/Opus ses, sesli not uyumluluğu için
audio/ogg; codecs=opusolarak gönderilir - Microsoft Edge TTS MP3/WebM çıktısı dahil Ogg olmayan sesler, PTT tesliminden önce
ffmpegile 48 kHz mono Ogg/Opus biçimine dönüştürülür /tts latesten son asistan yanıtını tek bir sesli not olarak gönderir ve aynı yanıt için tekrarlı gönderimleri bastırır;/tts chat on|off|defaultgeçerli WhatsApp sohbeti için otomatik TTS’yi kontrol eder- animasyonlu GIF oynatma, video gönderimlerinde
gifPlayback: trueile desteklenir - çoklu medya yanıt yükleri gönderilirken altyazılar ilk medya öğesine uygulanır; ancak PTT sesli notları sesi önce, görünür metni ayrı gönderir çünkü WhatsApp istemcileri sesli not altyazılarını tutarlı biçimde göstermez
- medya kaynağı HTTP(S),
file://veya yerel yollar olabilir
Medya boyutu sınırları ve yedek davranış
Medya boyutu sınırları ve yedek davranış
- gelen medya kaydetme üst sınırı:
channels.whatsapp.mediaMaxMb(varsayılan50) - giden medya gönderme üst sınırı:
channels.whatsapp.mediaMaxMb(varsayılan50) - hesap başına geçersiz kılmalar
channels.whatsapp.accounts.<accountId>.mediaMaxMbkullanır - görseller, sınırlara sığacak şekilde otomatik optimize edilir (yeniden boyutlandırma/kalite taraması)
- medya gönderme hatasında, ilk öğe yedeği yanıtı sessizce düşürmek yerine metin uyarısı gönderir
Yanıt alıntılama
WhatsApp, giden yanıtların gelen mesajı görünür biçimde alıntıladığı yerel yanıt alıntılamayı destekler. Bunuchannels.whatsapp.replyToMode ile kontrol edin.
| Değer | Davranış |
|---|---|
"off" | Asla 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" | Anlık yanıtları alıntılamadan bırakırken kuyruğa alınmış toplu yanıtları alıntıla |
"off" olur. Hesap başına geçersiz kılmalar channels.whatsapp.accounts.<id>.replyToMode kullanır.
Reaksiyon düzeyi
channels.whatsapp.reactionLevel, ajanın WhatsApp üzerinde emoji reaksiyonlarını ne kadar geniş kullandığını kontrol eder:
| Düzey | Onay reaksiyonları | Ajan tarafından başlatılan reaksiyonlar | Açıklama |
|---|---|---|---|
"off" | Hayır | Hayır | Hiç reaksiyon yok |
"ack" | Evet | Hayır | Yalnızca onay reaksiyonları (yanıt öncesi alındı bilgisi) |
"minimal" | Evet | Evet (temkinli) | Temkinli yönlendirmeyle onay + ajan reaksiyonları |
"extensive" | Evet | Evet (teşvik edilir) | Teşvik edilen yönlendirmeyle onay + ajan reaksiyonları |
"minimal".
Hesap başına geçersiz kılmalar channels.whatsapp.accounts.<id>.reactionLevel kullanır.
Onay reaksiyonları
WhatsApp,channels.whatsapp.ackReaction aracılığıyla gelen alındı bilgisinde anında onay reaksiyonlarını destekler.
Onay reaksiyonları reactionLevel tarafından kapılanır — reactionLevel "off" olduğunda bastırılır.
- gelen mesaj kabul edildikten hemen sonra gönderilir (yanıt öncesi)
- hatalar günlüğe kaydedilir ancak normal yanıt teslimini engellemez
- grup modu
mentions, bahsetmeyle tetiklenen turlarda reaksiyon verir; grup etkinleştirmealwaysbu denetim için baypas görevi görür - WhatsApp
channels.whatsapp.ackReactionkullanır (eskimessages.ackReactionburada kullanılmaz)
Çoklu hesap ve kimlik bilgileri
Hesap seçimi ve varsayılanlar
Hesap seçimi ve varsayılanlar
- hesap kimlikleri
channels.whatsapp.accountsiçinden gelir - varsayılan hesap seçimi: varsa
default, aksi halde ilk yapılandırılmış hesap kimliği (sıralı) - hesap kimlikleri arama için dahili olarak normalleştirilir
Kimlik bilgisi yolları ve eski uyumluluk
Kimlik bilgisi yolları ve eski uyumluluk
- geçerli kimlik doğrulama yolu:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - yedek dosya:
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
Çıkış davranışı
Çıkış davranışı
openclaw channels logout --channel whatsapp [--account <id>], bu hesap için WhatsApp kimlik doğrulama durumunu temizler.Bir Gateway erişilebilir olduğunda, çıkış önce seçilen hesap için canlı WhatsApp dinleyicisini durdurur; böylece bağlı oturum bir sonraki yeniden başlatmaya kadar mesaj almaya devam etmez. openclaw channels remove --channel whatsapp, hesap yapılandırmasını devre dışı bırakmadan veya silmeden önce canlı dinleyiciyi de durdurur.Eski kimlik doğrulama dizinlerinde, Baileys kimlik doğrulama dosyaları kaldırılırken oauth.json korunur.Araçlar, eylemler ve config yazmaları
- Ajan araç desteği WhatsApp reaksiyon eylemini (
react) içerir. - Eylem kapıları:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Kanal tarafından başlatılan config yazmaları varsayılan olarak etkindir (
channels.whatsapp.configWrites=falseile devre dışı bırakılır).
Sorun giderme
Bağlı değil (QR gerekli)
Bağlı değil (QR gerekli)
Bağlı ama bağlantı kesiliyor / yeniden bağlanma döngüsü
Bağlı ama bağlantı kesiliyor / yeniden bağlanma döngüsü
status=408 Request Time-out Connection was lost gösteriyorsa,
Baileys soket zamanlamalarını web.whatsapp altında ayarlayın. Önce
keepAliveIntervalMs değerini ağınızın boşta kalma zaman aşımının altına kısaltın ve
yavaş veya kayıplı bağlantılarda connectTimeoutMs değerini artırın:~/.openclaw/logs/whatsapp-health.log dosyası Gateway inactive diyorsa ancak
openclaw gateway status ve openclaw channels status --probe Gateway’in
ve WhatsApp’ın sağlıklı olduğunu gösteriyorsa, openclaw doctor çalıştırın. Linux’ta doctor,
hâlâ ~/.openclaw/bin/ensure-whatsapp.sh çağıran eski crontab girdileri hakkında uyarır;
bu eski girdileri crontab -e ile kaldırın çünkü cron systemd kullanıcı veri yolu ortamından yoksun olabilir ve
bu eski betiğin Gateway sağlığını yanlış raporlamasına neden olabilir.Gerekirse channels login ile yeniden bağlayın.QR girişi proxy arkasında zaman aşımına uğruyor
QR girişi proxy arkasında zaman aşımına uğruyor
openclaw channels login --channel whatsapp, status=408 Request Time-out veya TLS soket bağlantı kesilmesiyle kullanılabilir bir QR kodu göstermeden önce başarısız olur.WhatsApp Web girişi, Gateway ana makinesinin standart proxy ortamını (HTTPS_PROXY, HTTP_PROXY, küçük harfli varyantlar ve NO_PROXY) kullanır. Gateway sürecinin proxy env değerlerini devraldığını ve NO_PROXY değerinin mmg.whatsapp.net ile eşleşmediğini doğrulayın.Gönderirken etkin dinleyici yok
Gönderirken etkin dinleyici yok
Yanıt transkriptte görünüyor ama WhatsApp'ta görünmüyor
Yanıt transkriptte görünüyor ama WhatsApp'ta görünmüyor
auto-reply delivery failed veya auto-reply was not accepted by WhatsApp provider olup olmadığını denetleyin.Grup mesajları beklenmedik biçimde yok sayılıyor
Grup mesajları beklenmedik biçimde yok sayılıyor
groupPolicygroupAllowFrom/allowFromgroupsizin listesi girdileri- bahsetme kapılaması (
requireMention+ bahsetme kalıpları) openclaw.jsoniçinde yinelenen anahtarlar (JSON5): sonraki girdiler öncekileri geçersiz kılar, bu yüzden kapsam başına tek birgroupPolicytutun
Bun çalışma zamanı uyarısı
Bun çalışma zamanı uyarısı
Sistem istemleri
WhatsApp,groups ve direct haritaları aracılığıyla gruplar ve doğrudan sohbetler için Telegram tarzı sistem istemlerini destekler.
Grup mesajları için çözümleme hiyerarşisi:
Etkili groups haritası önce belirlenir: hesap kendi groups değerini tanımlıyorsa, kök groups haritasını tamamen değiştirir (derin birleştirme yok). Ardından istem araması ortaya çıkan tek haritada çalışır:
- Gruba özgü sistem istemi (
groups["<groupId>"].systemPrompt): belirli grup girdisi haritada bulunduğunda vesystemPromptanahtarı tanımlı olduğunda kullanılır.systemPromptboş bir dize ("") ise joker bastırılır ve sistem istemi uygulanmaz. - Grup joker sistem istemi (
groups["*"].systemPrompt): belirli grup girdisi haritada tamamen yoksa veya var olupsystemPromptanahtarı tanımlamıyorsa kullanılır.
direct haritası önce belirlenir: hesap kendi direct değerini tanımlıyorsa, kök direct haritasını tamamen değiştirir (derin birleştirme yok). Ardından istem araması ortaya çıkan tek haritada çalışır:
- Doğrudan eşe özgü sistem istemi (
direct["<peerId>"].systemPrompt): haritada ilgili eş girdisi bulunduğunda ve bu girdininsystemPromptanahtarı tanımlı olduğunda kullanılır.systemPromptboş dize ("") ise joker bastırılır ve hiçbir sistem istemi uygulanmaz. - Doğrudan joker sistem istemi (
direct["*"].systemPrompt): ilgili eş girdisi haritada hiç yoksa veya varsa ancaksystemPromptanahtarı tanımlamıyorsa kullanılır.
dms, DM başına hafif geçmiş geçersiz kılma kovası olarak kalır (dms.<id>.historyLimit). İstem geçersiz kılmaları direct altında bulunur.groups, kendi groups ayarını tanımlamayan hesaplar dahil tüm hesaplar için kasıtlı olarak bastırılır; bunun amacı, bir botun ait olmadığı gruplardan grup mesajları almasını önlemektir. WhatsApp bu korumayı uygulamaz: kök groups ve kök direct, kaç hesap yapılandırılmış olursa olsun, hesap düzeyinde geçersiz kılma tanımlamayan hesaplar tarafından her zaman devralınır. Çok hesaplı bir WhatsApp kurulumunda hesap başına grup veya doğrudan istemler istiyorsanız, kök düzey varsayılanlara güvenmek yerine her hesabın altında haritanın tamamını açıkça tanımlayın.
Önemli davranış:
channels.whatsapp.groups, hem grup başına yapılandırma haritası hem de sohbet düzeyi grup izin listesidir. Kök veya hesap kapsamındagroups["*"], o kapsam için “tüm gruplar kabul edilir” anlamına gelir.- Bir joker grup
systemPromptdeğerini yalnızca o kapsamın tüm grupları zaten kabul etmesini istiyorsanız ekleyin. Hâlâ yalnızca sabit bir grup ID kümesinin uygun olmasını istiyorsanız, istem varsayılanı içingroups["*"]kullanmayın. Bunun yerine istemi açıkça izin verilen her grup girdisinde tekrarlayın. - Grup kabulü ve gönderen yetkilendirmesi ayrı denetimlerdir.
groups["*"], grup işlemeye ulaşabilen grup kümesini genişletir, ancak tek başına bu gruplardaki her göndereni yetkilendirmez. Gönderen erişimi hâlâ ayrı olarakchannels.whatsapp.groupPolicyvechannels.whatsapp.groupAllowFromile kontrol edilir. channels.whatsapp.direct, DM’ler için aynı yan etkiye sahip değildir.direct["*"], yalnızca bir DMdmPolicyartıallowFromveya eşleme deposu kurallarıyla zaten kabul edildikten sonra varsayılan bir doğrudan sohbet yapılandırması sağlar.
Yapılandırma başvurusu işaretçileri
Birincil başvuru: Yüksek değerli WhatsApp alanları:- erişim:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - teslim:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - çok hesaplı:
accounts.<id>.enabled,accounts.<id>.authDir, hesap düzeyi geçersiz kılmalar - operasyonlar:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - oturum davranışı:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - istemler:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt