الحالة: جاهز للإنتاج عبر WhatsApp Web (Baileys). يتولى Gateway ملكية الجلسات المرتبطة.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.
التثبيت (عند الطلب)
- يطلب مسار التهيئة (
openclaw onboard) وopenclaw channels add --channel whatsappتثبيت WhatsApp plugin في أول مرة تختاره. - يوفر
openclaw channels login --channel whatsappأيضًا مسار التثبيت عندما لا يكون plugin موجودًا بعد. - قناة التطوير + نسخة git: تكون افتراضيًا على مسار plugin المحلي.
- Stable/Beta: يستخدم حزمة npm
@openclaw/whatsappعلى وسم الإصدار الرسمي الحالي.
PATH أثناء تثبيت npm لأن
إحدى تبعيات Baileys/libsignal الخاصة به تُجلب من عنوان URL خاص بـ git. ثبّت
Git for Windows، ثم أعد تشغيل الصدفة وأعد تشغيل التثبيت:
bin الخاص به موجودًا في PATH.
Pairing
Channel troubleshooting
Gateway configuration
الإعداد السريع
أنماط النشر
Dedicated number (recommended)
Dedicated number (recommended)
- هوية WhatsApp منفصلة لـ OpenClaw
- قوائم سماح للرسائل المباشرة وحدود توجيه أوضح
- احتمال أقل للالتباس مع المحادثة الذاتية
Personal-number fallback
Personal-number fallback
dmPolicy: "allowlist"- يتضمن
allowFromرقمك الشخصي selfChatMode: true
allowFrom.WhatsApp Web-only channel scope
WhatsApp Web-only channel scope
Baileys) في بنية قنوات OpenClaw الحالية.لا توجد قناة مراسلة Twilio WhatsApp منفصلة في سجل قنوات الدردشة المضمّن.نموذج وقت التشغيل
- يتولى Gateway ملكية مقبس WhatsApp وحلقة إعادة الاتصال.
- يستخدم مراقب إعادة الاتصال نشاط نقل WhatsApp Web، وليس حجم رسائل التطبيق الواردة فقط، لذلك لا تُعاد تهيئة جلسة جهاز مرتبط هادئة لمجرد أن أحدًا لم يرسل رسالة مؤخرًا. لا يزال حد صمت أطول على مستوى التطبيق يفرض إعادة الاتصال إذا استمرت إطارات النقل في الوصول لكن لم تُعالج أي رسائل تطبيق خلال نافذة المراقب؛ وبعد إعادة اتصال عابرة لجلسة نشطة مؤخرًا، يستخدم فحص صمت التطبيق هذا مهلة الرسائل العادية لنافذة الاسترداد الأولى.
- توقيتات مقبس Baileys صريحة ضمن
web.whatsapp.*: يتحكمkeepAliveIntervalMsفي نبضات تطبيق WhatsApp Web، ويتحكمconnectTimeoutMsفي مهلة مصافحة الفتح، ويتحكمdefaultQueryTimeoutMsفي مهل استعلامات Baileys. - تتطلب عمليات الإرسال الصادرة مستمع WhatsApp نشطًا للحساب الهدف.
- تُرفق عمليات الإرسال إلى المجموعات بيانات تعريف الإشارات الأصلية لرموز
@+<digits>و@<digits>في النص وتعليقات الوسائط عندما يطابق الرمز بيانات تعريف مشارك WhatsApp الحالية، بما في ذلك المجموعات المدعومة بـ LID. - يتم تجاهل محادثات الحالة والبث (
@status,@broadcast). - يتبع مراقب إعادة الاتصال نشاط نقل WhatsApp Web، وليس حجم رسائل التطبيق الواردة فقط: تبقى جلسات الأجهزة المرتبطة الهادئة قائمة ما دامت إطارات النقل مستمرة، لكن توقف النقل يفرض إعادة الاتصال قبل مسار قطع الاتصال البعيد اللاحق بكثير.
- تستخدم المحادثات المباشرة قواعد جلسات الرسائل المباشرة (
session.dmScope؛ يدمج الافتراضيmainالرسائل المباشرة في جلسة الوكيل الرئيسية). - جلسات المجموعات معزولة (
agent:<agentId>:whatsapp:group:<jid>). - يمكن أن تكون WhatsApp Channels/Newsletters أهدافًا صادرة صريحة باستخدام JID الأصلي
@newsletter. تستخدم الإرسالات الصادرة إلى النشرات الإخبارية بيانات تعريف جلسة القناة (agent:<agentId>:whatsapp:channel:<jid>) بدل دلالات جلسات الرسائل المباشرة. - يراعي نقل WhatsApp Web متغيرات بيئة الوكيل القياسية على مضيف Gateway (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ المتغيرات بالأحرف الصغيرة). فضّل إعداد الوكيل على مستوى المضيف على إعدادات وكيل WhatsApp الخاصة بالقناة. - عند تفعيل
messages.removeAckAfterReply، يمسح OpenClaw تفاعل إقرار WhatsApp بعد تسليم رد مرئي.
خطافات Plugin والخصوصية
يمكن أن تحتوي رسائل WhatsApp الواردة على محتوى رسائل شخصية، وأرقام هاتف، ومعرفات مجموعات، وأسماء مرسلين، وحقول ربط جلسات. لهذا السبب، لا يبث WhatsApp حمولات خطافmessage_received الواردة إلى plugins
إلا إذا اخترت ذلك صراحةً:
التحكم في الوصول والتفعيل
- DM policy
- Group policy + allowlists
- Mentions + /activation
channels.whatsapp.dmPolicy في الوصول إلى المحادثات المباشرة:pairing(افتراضي)allowlistopen(يتطلب أن يتضمنallowFromالقيمة"*")disabled
allowFrom أرقامًا بنمط E.164 (تُطبّع داخليًا).allowFrom هو قائمة تحكم بالوصول لمرسلي الرسائل المباشرة. لا يتحكم في عمليات الإرسال الصادرة الصريحة إلى JIDs مجموعات WhatsApp أو JIDs قنوات @newsletter.تجاوز الحسابات المتعددة: تكون لـ channels.whatsapp.accounts.<id>.dmPolicy (وallowFrom) الأسبقية على افتراضيات مستوى القناة لذلك الحساب.تفاصيل سلوك وقت التشغيل:- تُحفظ عمليات الإقران في مخزن سماح القناة وتُدمج مع
allowFromالمكوّن - تستخدم الأتمتة المجدولة والرجوع الاحتياطي لمستلمي Heartbeat أهداف تسليم صريحة أو
allowFromالمكوّن؛ لا تُعد موافقات إقران الرسائل المباشرة مستلمي Cron أو Heartbeat ضمنيين - إذا لم تُكوَّن قائمة سماح، يُسمح برقم الذات المرتبط افتراضيًا
- لا يُقرن OpenClaw تلقائيًا رسائل
fromMeالمباشرة الصادرة (الرسائل التي ترسلها إلى نفسك من الجهاز المرتبط)
سلوك الرقم الشخصي والمحادثة الذاتية
عندما يكون رقم الذات المرتبط موجودًا أيضًا فيallowFrom، تُفعّل وسائل حماية المحادثة الذاتية في WhatsApp:
- تخطي إيصالات القراءة لأدوار المحادثة الذاتية
- تجاهل سلوك التشغيل التلقائي عبر mention-JID الذي كان سيشير إلى نفسك لولا ذلك
- إذا لم يُعيَّن
messages.responsePrefix، تكون ردود المحادثة الذاتية افتراضيًا[{identity.name}]أو[openclaw]
تطبيع الرسائل والسياق
Inbound envelope + reply context
Inbound envelope + reply context
ReplyToId, ReplyToBody, ReplyToSender, sender JID/E.164).
عندما يكون هدف الرد المقتبس وسائط قابلة للتنزيل، يحفظه OpenClaw عبر
مخزن الوسائط الواردة العادي ويعرضه كـ MediaPath/MediaType حتى
يتمكن الوكيل من فحص الصورة المشار إليها بدلًا من رؤية
<media:image> فقط.Media placeholders and location/contact extraction
Media placeholders and location/contact extraction
<media:image><media:video><media:audio><media:document><media:sticker>
<media:audio> فقط، لذا يمكن أن يؤدي قول إشارة الروبوت في الملاحظة الصوتية إلى
تشغيل الرد. إذا كان النص المنسوخ لا يزال لا يشير إلى الروبوت، يُحفظ
النص المنسوخ في سجل المجموعة المعلق بدلًا من العنصر النائب الخام.تستخدم أجسام المواقع نص إحداثيات مقتضبًا. تُعرض تسميات/تعليقات الموقع وتفاصيل جهة الاتصال/vCard كبيانات تعريف غير موثوقة داخل كتل مسيّجة، وليس كنص مطالبة مضمّن.Pending group history injection
Pending group history injection
- الحد الافتراضي:
50 - التهيئة:
channels.whatsapp.historyLimit - الاحتياطي:
messages.groupChat.historyLimit 0يعطّل
[رسائل الدردشة منذ آخر رد لك - للسياق][الرسالة الحالية - رد على هذه]
Read receipts
Read receipts
التسليم، والتقسيم إلى أجزاء، والوسائط
Text chunking
Text chunking
- حد الجزء الافتراضي:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- يفضّل وضع
newlineحدود الفقرات (الأسطر الفارغة)، ثم يعود إلى تقسيم آمن من حيث الطول
Outbound media behavior
Outbound media behavior
- يدعم حمولات الصور والفيديو والصوت (ملاحظة صوتية بنمط اضغط للتحدث) والمستندات
- تُرسل الوسائط الصوتية عبر حمولة
audioفي Baileys معptt: true، لذلك تعرضها عملاء WhatsApp كملاحظة صوتية بنمط اضغط للتحدث - تحتفظ حمولات الرد بـ
audioAsVoice؛ يبقى إخراج الملاحظات الصوتية من تحويل النص إلى كلام في WhatsApp على هذا المسار بنمط اضغط للتحدث حتى عندما يعيد المزوّد MP3 أو WebM - يُرسل صوت Ogg/Opus الأصلي كـ
audio/ogg; codecs=opusلتوافق الملاحظات الصوتية - يُحوّل الصوت غير Ogg، بما في ذلك إخراج تحويل النص إلى كلام من Microsoft Edge بصيغ MP3/WebM، باستخدام
ffmpegإلى Ogg/Opus أحادي القناة بتردد 48 كيلوهرتز قبل التسليم بنمط اضغط للتحدث - يرسل
/tts latestأحدث رد من المساعد كملاحظة صوتية واحدة ويمنع الإرسال المتكرر للرد نفسه؛ يتحكم/tts chat on|off|defaultفي التحويل التلقائي من النص إلى كلام لدردشة WhatsApp الحالية - يُدعم تشغيل GIF المتحرك عبر
gifPlayback: trueفي عمليات إرسال الفيديو - تُطبّق التسميات التوضيحية على أول عنصر وسائط عند إرسال حمولات رد متعددة الوسائط، باستثناء الملاحظات الصوتية بنمط اضغط للتحدث التي ترسل الصوت أولا والنص المرئي بشكل منفصل لأن عملاء WhatsApp لا يعرضون تسميات الملاحظات الصوتية باستمرار
- يمكن أن يكون مصدر الوسائط HTTP(S)، أو
file://، أو مسارات محلية
Media size limits and fallback behavior
Media size limits and fallback behavior
- حد حفظ الوسائط الواردة:
channels.whatsapp.mediaMaxMb(الافتراضي50) - حد إرسال الوسائط الصادرة:
channels.whatsapp.mediaMaxMb(الافتراضي50) - تستخدم التجاوزات لكل حساب
channels.whatsapp.accounts.<accountId>.mediaMaxMb - تُحسّن الصور تلقائيا (تغيير الحجم/مسح الجودة) لتلائم الحدود
- عند فشل إرسال الوسائط، يرسل الاحتياطي للعنصر الأول تحذيرا نصيا بدلا من إسقاط الاستجابة بصمت
اقتباس الردود
يدعم WhatsApp اقتباس الردود الأصلي، حيث تقتبس الردود الصادرة الرسالة الواردة بشكل مرئي. تحكّم به باستخدامchannels.whatsapp.replyToMode.
| القيمة | السلوك |
|---|---|
"off" | عدم الاقتباس مطلقا؛ الإرسال كرسالة عادية |
"first" | اقتباس أول جزء فقط من الرد الصادر |
"all" | اقتباس كل جزء من الرد الصادر |
"batched" | اقتباس الردود المجمّعة في الطابور مع ترك الردود الفورية دون اقتباس |
"off". تستخدم التجاوزات لكل حساب channels.whatsapp.accounts.<id>.replyToMode.
مستوى التفاعل
يتحكمchannels.whatsapp.reactionLevel في مدى استخدام الوكيل لتفاعلات الرموز التعبيرية على WhatsApp:
| المستوى | تفاعلات الإقرار | التفاعلات التي يبدأها الوكيل | الوصف |
|---|---|---|---|
"off" | لا | لا | لا توجد تفاعلات إطلاقا |
"ack" | نعم | لا | تفاعلات الإقرار فقط (إيصال قبل الرد) |
"minimal" | نعم | نعم (متحفظ) | الإقرار + تفاعلات الوكيل بتوجيه متحفظ |
"extensive" | نعم | نعم (مشجّع) | الإقرار + تفاعلات الوكيل بتوجيه مشجّع |
"minimal".
تستخدم التجاوزات لكل حساب channels.whatsapp.accounts.<id>.reactionLevel.
تفاعلات الإقرار
يدعم WhatsApp تفاعلات إقرار فورية عند استلام الوارد عبرchannels.whatsapp.ackReaction.
تخضع تفاعلات الإقرار لـ reactionLevel — يتم كبتها عندما تكون reactionLevel هي "off".
- تُرسل فورا بعد قبول الوارد (قبل الرد)
- تُسجّل الإخفاقات لكنها لا تمنع تسليم الرد العادي
- يتفاعل وضع المجموعة
mentionsفي الدورات التي تُشغّل بالذكر؛ يعمل تفعيل المجموعةalwaysكتجاوز لهذا الفحص - يستخدم WhatsApp
channels.whatsapp.ackReaction(لا يُستخدمmessages.ackReactionالقديم هنا)
الحسابات المتعددة وبيانات الاعتماد
Account selection and defaults
Account selection and defaults
- تأتي معرفات الحسابات من
channels.whatsapp.accounts - اختيار الحساب الافتراضي:
defaultإذا كان موجودا، وإلا فأول معرف حساب مهيأ (بعد الفرز) - تُطبّع معرفات الحسابات داخليا للبحث
Credential paths and legacy compatibility
Credential paths and legacy compatibility
- مسار المصادقة الحالي:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - ملف النسخ الاحتياطي:
creds.json.bak - لا تزال المصادقة الافتراضية القديمة في
~/.openclaw/credentials/معروفة/تُرحّل لتدفقات الحساب الافتراضي
Logout behavior
Logout behavior
openclaw channels logout --channel whatsapp [--account <id>] حالة مصادقة WhatsApp لذلك الحساب.عندما يكون Gateway قابلًا للوصول، يوقف تسجيل الخروج أولًا مستمع WhatsApp النشط للحساب المحدد حتى لا تستمر الجلسة المرتبطة في تلقي الرسائل إلى حين إعادة التشغيل التالية. يوقف openclaw channels remove --channel whatsapp أيضًا المستمع النشط قبل تعطيل تهيئة الحساب أو حذفها.في أدلة المصادقة القديمة، يتم الاحتفاظ بـ oauth.json بينما تُزال ملفات مصادقة Baileys.الأدوات والإجراءات وكتابات التهيئة
- يتضمن دعم أدوات الوكيل إجراء تفاعل WhatsApp (
react). - بوابات الإجراءات:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- تُفعّل كتابات التهيئة التي تبدأها القناة افتراضيًا (عطّلها عبر
channels.whatsapp.configWrites=false).
استكشاف الأخطاء وإصلاحها
غير مرتبط (يلزم رمز QR)
غير مرتبط (يلزم رمز QR)
مرتبط لكنه غير متصل / حلقة إعادة اتصال
مرتبط لكنه غير متصل / حلقة إعادة اتصال
status=408 Request Time-out Connection was lost، فاضبط
توقيتات مقبس Baileys ضمن web.whatsapp. ابدأ بتقصير
keepAliveIntervalMs ليكون أقل من مهلة الخمول في شبكتك وزيادة
connectTimeoutMs على الروابط البطيئة أو كثيرة الفقد:~/.openclaw/logs/whatsapp-health.log يقول Gateway inactive لكن
openclaw gateway status و openclaw channels status --probe يبيّنان أن
Gateway وWhatsApp بحالة سليمة، فشغّل openclaw doctor. على Linux، يحذّر doctor
من إدخالات crontab القديمة التي لا تزال تستدعي
~/.openclaw/bin/ensure-whatsapp.sh؛ أزل تلك الإدخالات القديمة باستخدام
crontab -e لأن cron قد يفتقر إلى بيئة ناقل مستخدم systemd ويمكن أن
يجعل ذلك السكربت القديم يبلّغ عن صحة Gateway بشكل خاطئ.عند الحاجة، أعد الربط باستخدام channels login.تنتهي مهلة تسجيل الدخول برمز QR خلف وكيل
تنتهي مهلة تسجيل الدخول برمز QR خلف وكيل
openclaw channels login --channel whatsapp قبل عرض رمز QR قابل للاستخدام مع status=408 Request Time-out أو انقطاع مقبس TLS.يستخدم تسجيل دخول WhatsApp Web بيئة الوكيل القياسية لمضيف Gateway (HTTPS_PROXY وHTTP_PROXY والمتغيرات المناظرة بالأحرف الصغيرة وNO_PROXY). تحقق من أن عملية Gateway ترث بيئة الوكيل وأن NO_PROXY لا يطابق mmg.whatsapp.net.لا يوجد مستمع نشط عند الإرسال
لا يوجد مستمع نشط عند الإرسال
يظهر الرد في النص المكتوب لكن لا يظهر في WhatsApp
يظهر الرد في النص المكتوب لكن لا يظهر في WhatsApp
auto-reply delivery failed أو auto-reply was not accepted by WhatsApp provider.تُتجاهل رسائل المجموعة على نحو غير متوقع
تُتجاهل رسائل المجموعة على نحو غير متوقع
groupPolicygroupAllowFrom/allowFrom- إدخالات قائمة السماح
groups - بوابة الإشارات (
requireMention+ أنماط الإشارة) - المفاتيح المكررة في
openclaw.json(JSON5): تتجاوز الإدخالات اللاحقة الإدخالات السابقة، لذا احتفظ بـgroupPolicyواحد لكل نطاق
تحذير وقت تشغيل Bun
تحذير وقت تشغيل Bun
مطالبات النظام
يدعم WhatsApp مطالبات النظام بأسلوب Telegram للمجموعات والمحادثات المباشرة عبر خرائطgroups وdirect.
هرمية الحل لرسائل المجموعات:
تُحدَّد خريطة groups الفعالة أولًا: إذا كان الحساب يعرّف groups الخاصة به، فإنها تستبدل خريطة groups الجذرية بالكامل (لا يوجد دمج عميق). ثم يُشغّل البحث عن المطالبة على الخريطة المفردة الناتجة:
- مطالبة نظام خاصة بالمجموعة (
groups["<groupId>"].systemPrompt): تُستخدم عندما يكون إدخال المجموعة المحددة موجودًا في الخريطة و يكون مفتاحsystemPromptالخاص به معرّفًا. إذا كانsystemPromptسلسلة فارغة ("")، فيُحجب حرف البدل ولا تُطبّق أي مطالبة نظام. - مطالبة نظام حرف البدل للمجموعات (
groups["*"].systemPrompt): تُستخدم عندما يكون إدخال المجموعة المحددة غائبًا تمامًا من الخريطة، أو عندما يكون موجودًا لكنه لا يعرّف مفتاحsystemPrompt.
direct الفعالة أولًا: إذا كان الحساب يعرّف direct الخاصة به، فإنها تستبدل خريطة direct الجذرية بالكامل (لا يوجد دمج عميق). ثم يُشغّل البحث عن المطالبة على الخريطة المفردة الناتجة:
- موجه النظام الخاص بمحادثة مباشرة محددة (
direct["<peerId>"].systemPrompt): يُستخدم عندما يكون إدخال النظير المحدد موجودًا في الخريطة و يكون مفتاحsystemPromptالخاص به معرّفًا. إذا كانsystemPromptسلسلة فارغة ("")، فسيتم كبت حرف البدل ولا يُطبَّق أي موجه نظام. - موجه نظام حرف البدل للمحادثات المباشرة (
direct["*"].systemPrompt): يُستخدم عندما يكون إدخال النظير المحدد غائبًا تمامًا عن الخريطة، أو عندما يكون موجودًا لكنه لا يعرّف مفتاحsystemPrompt.
dms حاوية خفيفة لتجاوز السجل لكل رسالة مباشرة (dms.<id>.historyLimit). توجد تجاوزات الموجهات ضمن direct.groups الجذر عمدًا لكل الحسابات في إعداد متعدد الحسابات، حتى الحسابات التي لا تعرّف groups خاصة بها، وذلك لمنع البوت من تلقي رسائل مجموعات لا ينتمي إليها. لا يطبّق WhatsApp هذا الحارس: تُورَّث groups الجذر وdirect الجذر دائمًا من الحسابات التي لا تعرّف تجاوزًا على مستوى الحساب، بغض النظر عن عدد الحسابات المهيأة. في إعداد WhatsApp متعدد الحسابات، إذا أردت موجهات مجموعات أو محادثات مباشرة لكل حساب، فعرّف الخريطة الكاملة ضمن كل حساب صراحةً بدل الاعتماد على الافتراضيات على مستوى الجذر.
سلوك مهم:
channels.whatsapp.groupsهي خريطة تهيئة لكل مجموعة وقائمة سماح للمجموعات على مستوى الدردشة في الوقت نفسه. في نطاق الجذر أو الحساب، يعنيgroups["*"]أن “كل المجموعات مسموح لها بالدخول” في ذلك النطاق.- لا تضف
systemPromptلمجموعة بحرف بدل إلا عندما تريد بالفعل أن يسمح ذلك النطاق بدخول كل المجموعات. إذا كنت لا تزال تريد أن تكون مجموعة ثابتة فقط من معرّفات المجموعات مؤهلة، فلا تستخدمgroups["*"]كافتراضي للموجه. بدلًا من ذلك، كرر الموجه في كل إدخال مجموعة مسموح به صراحةً. - قبول المجموعة وتفويض المرسل فحصان منفصلان. يوسّع
groups["*"]مجموعة المجموعات التي يمكنها الوصول إلى معالجة المجموعات، لكنه لا يفوّض بحد ذاته كل مرسل في تلك المجموعات. لا يزال وصول المرسلين مضبوطًا بشكل منفصل بواسطةchannels.whatsapp.groupPolicyوchannels.whatsapp.groupAllowFrom. - لا يملك
channels.whatsapp.directالتأثير الجانبي نفسه للرسائل المباشرة. يوفّرdirect["*"]فقط تهيئة افتراضية لدردشة مباشرة بعد قبول الرسالة المباشرة بالفعل بواسطةdmPolicyمعallowFromأو قواعد مخزن الاقتران.
مؤشرات مرجع التهيئة
المرجع الأساسي: حقول WhatsApp عالية الأهمية:- الوصول:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - التسليم:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - الحسابات المتعددة:
accounts.<id>.enabled,accounts.<id>.authDir, التجاوزات على مستوى الحساب - العمليات:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.*,web.whatsapp.* - سلوك الجلسة:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - الموجهات:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt