الانتقال إلى المحتوى الرئيسي

WhatsApp (قناة الويب)

الحالة: جاهزة للإنتاج عبر WhatsApp Web ‏(Baileys). تتولى البوابة جلسة/جلسات الربط.

التثبيت (عند الطلب)

  • الإعداد (openclaw onboard) و openclaw channels add --channel whatsapp يطالبان بتثبيت إضافة WhatsApp أول مرة تحددها فيها.
  • يوفّر openclaw channels login --channel whatsapp أيضًا تدفق التثبيت عندما لا تكون الإضافة موجودة بعد.
  • قناة التطوير + سحب git: يُستخدم مسار الإضافة المحلي افتراضيًا.
  • Stable/Beta: تُستخدم حزمة npm ‏@openclaw/whatsapp افتراضيًا.
يبقى التثبيت اليدوي متاحًا:
openclaw plugins install @openclaw/whatsapp

الاقتران

سياسة الرسائل الخاصة الافتراضية هي الاقتران للمرسلين غير المعروفين.

استكشاف أخطاء القناة وإصلاحها

تشخيصات متعددة القنوات وكتيبات الإصلاح.

إعدادات البوابة

أنماط وأمثلة كاملة لإعداد القنوات.

إعداد سريع

1

تكوين سياسة الوصول في WhatsApp

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

ربط WhatsApp ‏(QR)

openclaw channels login --channel whatsapp
لحساب معيّن:
openclaw channels login --channel whatsapp --account work
3

بدء تشغيل البوابة

openclaw gateway
4

الموافقة على أول طلب اقتران (إذا كنت تستخدم وضع الاقتران)

openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
تنتهي صلاحية طلبات الاقتران بعد ساعة واحدة. ويكون الحد الأقصى للطلبات المعلّقة 3 لكل قناة.
يوصي OpenClaw بتشغيل WhatsApp على رقم منفصل كلما أمكن. (البيانات الوصفية للقناة وتدفق الإعداد محسّنان لهذا الإعداد، لكن إعدادات الأرقام الشخصية مدعومة أيضًا.)

أنماط النشر

هذا هو وضع التشغيل الأنظف:
  • هوية WhatsApp منفصلة لـ OpenClaw
  • حدود أوضح لقوائم السماح في الرسائل الخاصة والتوجيه
  • احتمال أقل لحدوث ارتباك في الدردشة الذاتية
نمط السياسة الأدنى:
{
  channels: {
    whatsapp: {
      dmPolicy: "allowlist",
      allowFrom: ["+15551234567"],
    },
  },
}
يدعم الإعداد وضع الرقم الشخصي ويكتب خط أساس مناسبًا للدردشة الذاتية:
  • dmPolicy: "allowlist"
  • يتضمن allowFrom رقمك الشخصي
  • selfChatMode: true
أثناء التشغيل، تعتمد وسائل الحماية الخاصة بالدردشة الذاتية على الرقم الذاتي المرتبط و allowFrom.
قناة منصة المراسلة تعتمد على WhatsApp Web ‏(Baileys) في بنية قنوات OpenClaw الحالية.لا توجد قناة مراسلة WhatsApp منفصلة عبر Twilio في سجل قنوات الدردشة المضمّن.

نموذج التشغيل

  • تتولى البوابة مقبس WhatsApp وحلقة إعادة الاتصال.
  • تتطلب عمليات الإرسال الصادرة مستمع WhatsApp نشطًا للحساب المستهدف.
  • يتم تجاهل محادثات الحالة والبث (@status, @broadcast).
  • تستخدم المحادثات المباشرة قواعد جلسة الرسائل الخاصة (session.dmScope؛ والقيمة الافتراضية main تدمج الرسائل الخاصة في الجلسة الرئيسية للوكيل).
  • جلسات المجموعات معزولة (agent:<agentId>:whatsapp:group:<jid>).
  • يراعي نقل WhatsApp Web متغيرات بيئة الوكيل القياسية على مضيف البوابة (HTTPS_PROXY, HTTP_PROXY, NO_PROXY / والمتغيرات المكافئة بالأحرف الصغيرة). يُفضَّل إعداد الوكيل على مستوى المضيف بدلًا من إعدادات وكيل WhatsApp الخاصة بالقناة.

التحكم في الوصول والتفعيل

يتحكم channels.whatsapp.dmPolicy في الوصول إلى المحادثات المباشرة:
  • pairing (الافتراضي)
  • allowlist
  • open (يتطلب أن يتضمن allowFrom القيمة "*")
  • disabled
يقبل allowFrom أرقامًا بنمط E.164 (مع تسويتها داخليًا).تجاوز متعدد الحسابات: يحظى channels.whatsapp.accounts.<id>.dmPolicyallowFrom) بالأولوية على الإعدادات الافتراضية على مستوى القناة لذلك الحساب.تفاصيل سلوك التشغيل:
  • يتم الاحتفاظ بعمليات الاقتران في مخزن السماح الخاص بالقناة ودمجها مع allowFrom المكوَّنة
  • إذا لم تُكوَّن قائمة سماح، فسيُسمح بالرقم الذاتي المرتبط افتراضيًا
  • لا تُقرن الرسائل الخاصة الصادرة fromMe تلقائيًا أبدًا

سلوك الرقم الشخصي والدردشة الذاتية

عندما يكون الرقم الذاتي المرتبط موجودًا أيضًا في allowFrom، يتم تفعيل وسائل الحماية الخاصة بالدردشة الذاتية في WhatsApp:
  • تخطي إيصالات القراءة في دورات الدردشة الذاتية
  • تجاهل سلوك التشغيل التلقائي لإشارة JID الذي قد يؤدي بخلاف ذلك إلى تنبيهك أنت نفسك
  • إذا لم يتم تعيين messages.responsePrefix، فستكون بادئة ردود الدردشة الذاتية افتراضيًا [{identity.name}] أو [openclaw]

تسوية الرسائل والسياق

تُغلّف رسائل WhatsApp الواردة داخل الغلاف المشترك للوارد.إذا وُجد رد مقتبس، يُضاف السياق بهذا الشكل:
[Replying to <sender> id:<stanzaId>]
<quoted body or media placeholder>
[/Replying]
تُعبّأ أيضًا حقول بيانات تعريف الرد عند توفرها (ReplyToId, ReplyToBody, ReplyToSender, ومرسل JID/E.164).
تتم تسوية الرسائل الواردة التي تحتوي على وسائط فقط بعناصر نائبة مثل:
  • <media:image>
  • <media:video>
  • <media:audio>
  • <media:document>
  • <media:sticker>
تتم تسوية حمولات الموقع وجهة الاتصال إلى سياق نصي قبل التوجيه.
بالنسبة للمجموعات، يمكن تخزين الرسائل غير المعالجة مؤقتًا وحقنها كسياق عندما يتم تشغيل الروبوت أخيرًا.
  • الحد الافتراضي: 50
  • الإعداد: channels.whatsapp.historyLimit
  • البديل: messages.groupChat.historyLimit
  • 0 يعطّل الميزة
علامات الحقن:
  • [Chat messages since your last reply - for context]
  • [Current message - respond to this]
تكون إيصالات القراءة مفعّلة افتراضيًا لرسائل WhatsApp الواردة المقبولة.للتعطيل على مستوى عام:
{
  channels: {
    whatsapp: {
      sendReadReceipts: false,
    },
  },
}
تجاوز لكل حساب:
{
  channels: {
    whatsapp: {
      accounts: {
        work: {
          sendReadReceipts: false,
        },
      },
    },
  },
}
تتخطى دورات الدردشة الذاتية إيصالات القراءة حتى عند تفعيلها على مستوى عام.

التسليم، والتقسيم، والوسائط

  • الحد الافتراضي للتقسيم: channels.whatsapp.textChunkLimit = 4000
  • channels.whatsapp.chunkMode = "length" | "newline"
  • يفضّل وضع newline حدود الفقرات (الأسطر الفارغة)، ثم يعود إلى تقسيم آمن بحسب الطول
  • يدعم حمولات الصور والفيديو والصوت (مذكرة صوتية PTT) والمستندات
  • يُعاد كتابة audio/ogg إلى audio/ogg; codecs=opus لتوافق الملاحظات الصوتية
  • يتم دعم تشغيل GIF المتحرك عبر gifPlayback: true عند إرسال الفيديو
  • تُطبّق التسميات التوضيحية على أول عنصر وسائط عند إرسال حمولات رد متعددة الوسائط
  • يمكن أن يكون مصدر الوسائط HTTP(S) أو file:// أو مسارات محلية
  • الحد الأقصى لحفظ الوسائط الواردة: channels.whatsapp.mediaMaxMb (الافتراضي 50)
  • الحد الأقصى لإرسال الوسائط الصادرة: channels.whatsapp.mediaMaxMb (الافتراضي 50)
  • تستخدم التجاوزات لكل حساب channels.whatsapp.accounts.<accountId>.mediaMaxMb
  • تُحسَّن الصور تلقائيًا (تغيير الحجم/اختبار الجودة) لتلائم الحدود
  • عند فشل إرسال الوسائط، يرسل الرجوع الخاص بالعنصر الأول تحذيرًا نصيًا بدلًا من إسقاط الرد بصمت

مستوى التفاعلات

يتحكم channels.whatsapp.reactionLevel في مدى استخدام الوكيل لتفاعلات الإيموجي على WhatsApp:
المستوىتفاعلات الإقرارتفاعلات يبدأها الوكيلالوصف
"off"لالابدون أي تفاعلات على الإطلاق
"ack"نعملاتفاعلات الإقرار فقط (إقرار ما قبل الرد)
"minimal"نعمنعم (بحذر)الإقرار + تفاعلات الوكيل مع إرشادات متحفظة
"extensive"نعمنعم (مستحسنة)الإقرار + تفاعلات الوكيل مع إرشادات مشجعة
الافتراضي: "minimal". تستخدم التجاوزات لكل حساب channels.whatsapp.accounts.<id>.reactionLevel.
{
  channels: {
    whatsapp: {
      reactionLevel: "ack",
    },
  },
}

تفاعلات الإقرار

يدعم WhatsApp تفاعلات الإقرار الفورية عند استلام الرسائل الواردة عبر channels.whatsapp.ackReaction. تخضع تفاعلات الإقرار لـ reactionLevel — ويتم كبتها عندما تكون قيمة reactionLevel هي "off".
{
  channels: {
    whatsapp: {
      ackReaction: {
        emoji: "👀",
        direct: true,
        group: "mentions", // always | mentions | never
      },
    },
  },
}
ملاحظات السلوك:
  • تُرسل فورًا بعد قبول الوارد (قبل الرد)
  • يتم تسجيل الإخفاقات لكنها لا تمنع تسليم الرد العادي
  • يتفاعل وضع المجموعة mentions في الدورات التي يتم تشغيلها بالإشارة؛ ويعمل تفعيل المجموعة always كتجاوز لهذا الفحص
  • يستخدم WhatsApp ‏channels.whatsapp.ackReaction (ولا يُستخدم هنا الإرثي messages.ackReaction)

الحسابات المتعددة وبيانات الاعتماد

  • تأتي معرّفات الحسابات من channels.whatsapp.accounts
  • اختيار الحساب الافتراضي: default إذا كان موجودًا، وإلا أول معرّف حساب مُكوَّن (بعد الفرز)
  • تتم تسوية معرّفات الحسابات داخليًا لأغراض البحث
  • مسار المصادقة الحالي: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • ملف النسخة الاحتياطية: creds.json.bak
  • لا يزال يتم التعرّف على المصادقة الافتراضية القديمة في ~/.openclaw/credentials/ وترحيلها لتدفقات الحساب الافتراضي
يقوم openclaw channels logout --channel whatsapp [--account <id>] بمسح حالة مصادقة WhatsApp لذلك الحساب.في أدلة المصادقة القديمة، يتم الاحتفاظ بـ oauth.json بينما تتم إزالة ملفات مصادقة Baileys.

الأدوات والإجراءات وكتابة الإعدادات

  • يتضمن دعم أدوات الوكيل إجراء تفاعل WhatsApp ‏(react).
  • بوابات الإجراءات:
    • channels.whatsapp.actions.reactions
    • channels.whatsapp.actions.polls
  • تكون عمليات كتابة الإعدادات التي تبدأها القناة مفعّلة افتراضيًا (يمكن تعطيلها عبر channels.whatsapp.configWrites=false).

استكشاف الأخطاء وإصلاحها

العَرَض: تشير حالة القناة إلى أنها غير مرتبطة.الإصلاح:
openclaw channels login --channel whatsapp
openclaw channels status
العَرَض: حساب مرتبط مع انقطاعات متكررة أو محاولات إعادة اتصال.الإصلاح:
openclaw doctor
openclaw logs --follow
عند الحاجة، أعد الربط باستخدام channels login.
تفشل عمليات الإرسال الصادرة سريعًا عندما لا يوجد مستمع بوابة نشط للحساب المستهدف.تأكد من أن البوابة قيد التشغيل وأن الحساب مرتبط.
تحقق بهذا الترتيب:
  • groupPolicy
  • groupAllowFrom / allowFrom
  • إدخالات قائمة السماح groups
  • بوابة الإشارة (requireMention + أنماط الإشارة)
  • المفاتيح المكررة في openclaw.json ‏(JSON5): الإدخالات اللاحقة تتجاوز السابقة، لذا احتفظ بقيمة groupPolicy واحدة لكل نطاق
يجب أن يستخدم وقت تشغيل بوابة WhatsApp ‏Node. ويتم تمييز Bun على أنه غير متوافق لتشغيل بوابة WhatsApp/Telegram بشكل مستقر.

مؤشرات مرجعية للإعداد

المرجع الأساسي: حقول 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.*
  • سلوك الجلسة: session.dmScope, historyLimit, dmHistoryLimit, dms.<id>.historyLimit

ذو صلة