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

بوت Feishu

Feishu ‏(Lark) هو نظام دردشة جماعي تستخدمه الشركات للمراسلة والتعاون. يربط هذا الـ plugin بين OpenClaw وبوت Feishu/Lark باستخدام اشتراك أحداث WebSocket الخاص بالمنصة، بحيث يمكن استقبال الرسائل من دون تعريض عنوان URL عام لـ webhook.

الـ plugin المضمّن

يأتي Feishu مضمّنًا مع إصدارات OpenClaw الحالية، لذلك لا يلزم تثبيت plugin منفصل. إذا كنت تستخدم إصدارًا أقدم أو تثبيتًا مخصصًا لا يتضمن Feishu المضمّن، فقم بتثبيته يدويًا:
openclaw plugins install @openclaw/feishu

البدء السريع

هناك طريقتان لإضافة قناة Feishu:

الطريقة 1: الإعداد الأولي (مستحسن)

إذا كنت قد ثبّت OpenClaw للتو، فشغّل الإعداد الأولي:
openclaw onboard
سيرشدك المعالج خلال ما يلي:
  1. إنشاء تطبيق Feishu وجمع بيانات الاعتماد
  2. إعداد بيانات اعتماد التطبيق في OpenClaw
  3. بدء تشغيل البوابة
بعد الإعداد، تحقّق من حالة البوابة:
  • openclaw gateway status
  • openclaw logs --follow

الطريقة 2: الإعداد عبر CLI

إذا كنت قد أكملت التثبيت الأولي بالفعل، فأضف القناة عبر CLI:
openclaw channels add
اختر Feishu، ثم أدخل App ID وApp Secret. بعد الإعداد، أدر البوابة:
  • openclaw gateway status
  • openclaw gateway restart
  • openclaw logs --follow

الخطوة 1: إنشاء تطبيق Feishu

1. افتح Feishu Open Platform

زر Feishu Open Platform وسجّل الدخول. يجب على مستأجري Lark (العالمي) استخدام https://open.larksuite.com/app وضبط domain: "lark" في إعدادات Feishu.

2. أنشئ تطبيقًا

  1. انقر Create enterprise app
  2. املأ اسم التطبيق والوصف
  3. اختر أيقونة للتطبيق
Create enterprise app

3. انسخ بيانات الاعتماد

من Credentials & Basic Info، انسخ:
  • App ID (بالتنسيق: cli_xxx)
  • App Secret
مهم: احتفظ بـ App Secret بشكل خاص. Get credentials

4. إعداد الأذونات

في Permissions، انقر Batch import والصق:
{
  "scopes": {
    "tenant": [
      "aily:file:read",
      "aily:file:write",
      "application:application.app_message_stats.overview:readonly",
      "application:application:self_manage",
      "application:bot.menu:write",
      "cardkit:card:read",
      "cardkit:card:write",
      "contact:user.employee_id:readonly",
      "corehr:file:download",
      "event:ip_list",
      "im:chat.access_event.bot_p2p_chat:read",
      "im:chat.members:bot_access",
      "im:message",
      "im:message.group_at_msg:readonly",
      "im:message.p2p_msg:readonly",
      "im:message:readonly",
      "im:message:send_as_bot",
      "im:resource"
    ],
    "user": ["aily:file:read", "aily:file:write", "im:chat.access_event.bot_p2p_chat:read"]
  }
}
Configure permissions

5. فعّل إمكانية البوت

في App Capability > Bot:
  1. فعّل إمكانية البوت
  2. عيّن اسم البوت
Enable bot capability

6. إعداد اشتراك الأحداث

⚠️ مهم: قبل إعداد اشتراك الأحداث، تأكد من:
  1. أنك شغّلت بالفعل openclaw channels add لـ Feishu
  2. أن البوابة قيد التشغيل (openclaw gateway status)
في Event Subscription:
  1. اختر Use long connection to receive events ‏(WebSocket)
  2. أضف الحدث: im.message.receive_v1
  3. (اختياري) لمهام تعليقات Drive، أضف أيضًا: drive.notice.comment_add_v1
⚠️ إذا لم تكن البوابة قيد التشغيل، فقد يفشل حفظ إعداد الاتصال الطويل. Configure event subscription

7. انشر التطبيق

  1. أنشئ إصدارًا في Version Management & Release
  2. أرسله للمراجعة وانشره
  3. انتظر موافقة المسؤول (تطبيقات المؤسسات تُوافق عادةً تلقائيًا)

الخطوة 2: إعداد OpenClaw

الإعداد باستخدام المعالج (مستحسن)

openclaw channels add
اختر Feishu والصق App ID وApp Secret.

الإعداد عبر ملف التهيئة

حرّر ~/.openclaw/openclaw.json:
{
  channels: {
    feishu: {
      enabled: true,
      dmPolicy: "pairing",
      accounts: {
        main: {
          appId: "cli_xxx",
          appSecret: "xxx",
          name: "My AI assistant",
        },
      },
    },
  },
}
إذا كنت تستخدم connectionMode: "webhook"، فاضبط كلًا من verificationToken وencryptKey. يرتبط خادم webhook الخاص بـ Feishu على 127.0.0.1 افتراضيًا؛ لا تضبط webhookHost إلا إذا كنت تحتاج عمدًا إلى عنوان ربط مختلف.

Verification Token وEncrypt Key ‏(وضع webhook)

عند استخدام وضع webhook، اضبط كلًا من channels.feishu.verificationToken وchannels.feishu.encryptKey في إعداداتك. للحصول على القيم:
  1. في Feishu Open Platform، افتح تطبيقك
  2. انتقل إلى DevelopmentEvents & Callbacks ‏(开发配置 → 事件与回调)
  3. افتح تبويب Encryption ‏(加密策略)
  4. انسخ Verification Token وEncrypt Key
توضح الصورة التالية مكان العثور على Verification Token. أما Encrypt Key فهو مدرج في القسم نفسه Encryption. Verification Token location

الإعداد عبر متغيرات البيئة

export FEISHU_APP_ID="cli_xxx"
export FEISHU_APP_SECRET="xxx"

نطاق Lark (العالمي)

إذا كان المستأجر الخاص بك على Lark (الدولي)، فاضبط النطاق إلى lark (أو سلسلة نطاق كاملة). يمكنك ضبطه في channels.feishu.domain أو لكل حساب على حدة (channels.feishu.accounts.<id>.domain).
{
  channels: {
    feishu: {
      domain: "lark",
      accounts: {
        main: {
          appId: "cli_xxx",
          appSecret: "xxx",
        },
      },
    },
  },
}

علامات تحسين الحصة

يمكنك تقليل استخدام Feishu API باستخدام علامتين اختياريتين:
  • typingIndicator (الافتراضي true): عند ضبطه على false، يتم تخطي استدعاءات تفاعل الكتابة.
  • resolveSenderNames (الافتراضي true): عند ضبطه على false، يتم تخطي استدعاءات البحث عن ملف المُرسِل الشخصي.
اضبطهما على المستوى الأعلى أو لكل حساب:
{
  channels: {
    feishu: {
      typingIndicator: false,
      resolveSenderNames: false,
      accounts: {
        main: {
          appId: "cli_xxx",
          appSecret: "xxx",
          typingIndicator: true,
          resolveSenderNames: false,
        },
      },
    },
  },
}

الخطوة 3: البدء + الاختبار

1. شغّل البوابة

openclaw gateway

2. أرسل رسالة اختبار

في Feishu، ابحث عن البوت وأرسل رسالة.

3. وافق على الاقتران

بشكل افتراضي، يرد البوت برمز اقتران. وافق عليه:
openclaw pairing approve feishu <CODE>
بعد الموافقة، يمكنك الدردشة بشكل طبيعي.

نظرة عامة

  • قناة بوت Feishu: بوت Feishu تديره البوابة
  • توجيه حتمي: تعود الردود دائمًا إلى Feishu
  • عزل الجلسات: تشترك الرسائل الخاصة في جلسة رئيسية؛ أما المجموعات فمعزولة
  • اتصال WebSocket: اتصال طويل عبر Feishu SDK، ولا حاجة إلى عنوان URL عام

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

الرسائل المباشرة

  • الافتراضي: dmPolicy: "pairing" ‏(يحصل المستخدمون غير المعروفين على رمز اقتران)
  • الموافقة على الاقتران:
    openclaw pairing list feishu
    openclaw pairing approve feishu <CODE>
    
  • وضع قائمة السماح: اضبط channels.feishu.allowFrom باستخدام Open IDs المسموح بها

دردشات المجموعات

1. سياسة المجموعات (channels.feishu.groupPolicy):
  • "open" = السماح للجميع في المجموعات
  • "allowlist" = السماح فقط لما هو موجود في groupAllowFrom
  • "disabled" = تعطيل رسائل المجموعات
الافتراضي: allowlist 2. شرط الإشارة (channels.feishu.requireMention، ويمكن تجاوزه عبر channels.feishu.groups.<chat_id>.requireMention):
  • true صراحةً = يتطلب @mention
  • false صراحةً = يرد من دون إشارات
  • عند عدم ضبطه ووجود groupPolicy: "open" = الافتراضي false
  • عند عدم ضبطه وكون groupPolicy ليس "open" = الافتراضي true

أمثلة على إعداد المجموعات

السماح لجميع المجموعات، من دون الحاجة إلى @mention ‏(الافتراضي للمجموعات المفتوحة)

{
  channels: {
    feishu: {
      groupPolicy: "open",
    },
  },
}

السماح لجميع المجموعات، مع الاستمرار في طلب @mention

{
  channels: {
    feishu: {
      groupPolicy: "open",
      requireMention: true,
    },
  },
}

السماح بمجموعات محددة فقط

{
  channels: {
    feishu: {
      groupPolicy: "allowlist",
      // Feishu group IDs (chat_id) look like: oc_xxx
      groupAllowFrom: ["oc_xxx", "oc_yyy"],
    },
  },
}

تقييد المرسلين المسموح لهم بالمراسلة داخل مجموعة (قائمة سماح للمرسلين)

بالإضافة إلى السماح للمجموعة نفسها، فإن كل الرسائل داخل تلك المجموعة يتم ضبطها حسب open_id الخاص بالمرسل: فقط المستخدمون المدرجون في groups.<chat_id>.allowFrom تتم معالجة رسائلهم؛ أما الرسائل من الأعضاء الآخرين فيتم تجاهلها (هذا ضبط كامل على مستوى المرسل، وليس فقط لأوامر التحكم مثل /reset أو /new).
{
  channels: {
    feishu: {
      groupPolicy: "allowlist",
      groupAllowFrom: ["oc_xxx"],
      groups: {
        oc_xxx: {
          // Feishu user IDs (open_id) look like: ou_xxx
          allowFrom: ["ou_user1", "ou_user2"],
        },
      },
    },
  },
}

الحصول على معرّفات المجموعة/المستخدم

معرّفات المجموعات (chat_id)

تبدو معرّفات المجموعات بهذا الشكل oc_xxx. الطريقة 1 (مستحسنة)
  1. شغّل البوابة واذكر البوت باستخدام @mention داخل المجموعة
  2. شغّل openclaw logs --follow وابحث عن chat_id
الطريقة 2 استخدم مصحح Feishu API لسرد دردشات المجموعات.

معرّفات المستخدمين (open_id)

تبدو معرّفات المستخدمين بهذا الشكل ou_xxx. الطريقة 1 (مستحسنة)
  1. شغّل البوابة وأرسل رسالة مباشرة إلى البوت
  2. شغّل openclaw logs --follow وابحث عن open_id
الطريقة 2 تحقق من طلبات الاقتران للحصول على Open IDs الخاصة بالمستخدمين:
openclaw pairing list feishu

الأوامر الشائعة

الأمرالوصف
/statusعرض حالة البوت
/resetإعادة تعيين الجلسة
/modelعرض/تبديل النموذج
ملاحظة: لا يدعم Feishu قوائم الأوامر الأصلية حتى الآن، لذلك يجب إرسال الأوامر كنص.

أوامر إدارة البوابة

الأمرالوصف
openclaw gateway statusعرض حالة البوابة
openclaw gateway installتثبيت/بدء خدمة البوابة
openclaw gateway stopإيقاف خدمة البوابة
openclaw gateway restartإعادة تشغيل خدمة البوابة
openclaw logs --followتتبع سجلات البوابة

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

البوت لا يستجيب في دردشات المجموعات

  1. تأكد من إضافة البوت إلى المجموعة
  2. تأكد من أنك تشير إلى البوت باستخدام @mention ‏(السلوك الافتراضي)
  3. تحقق من أن groupPolicy ليس مضبوطًا على "disabled"
  4. تحقق من السجلات: openclaw logs --follow

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

  1. تأكد من أن التطبيق منشور ومعتمد
  2. تأكد من أن اشتراك الأحداث يتضمن im.message.receive_v1
  3. تأكد من تفعيل long connection
  4. تأكد من اكتمال أذونات التطبيق
  5. تأكد من أن البوابة قيد التشغيل: openclaw gateway status
  6. تحقق من السجلات: openclaw logs --follow

تسرّب App Secret

  1. أعد تعيين App Secret في Feishu Open Platform
  2. حدّث App Secret في إعداداتك
  3. أعد تشغيل البوابة

فشل إرسال الرسائل

  1. تأكد من أن التطبيق يملك إذن im:message:send_as_bot
  2. تأكد من أن التطبيق منشور
  3. تحقق من السجلات للحصول على أخطاء مفصلة

الإعداد المتقدم

حسابات متعددة

{
  channels: {
    feishu: {
      defaultAccount: "main",
      accounts: {
        main: {
          appId: "cli_xxx",
          appSecret: "xxx",
          name: "Primary bot",
        },
        backup: {
          appId: "cli_yyy",
          appSecret: "yyy",
          name: "Backup bot",
          enabled: false,
        },
      },
    },
  },
}
يتحكم defaultAccount في حساب Feishu المستخدم عندما لا تحدد واجهات API الصادرة accountId بشكل صريح.

حدود الرسائل

  • textChunkLimit: حجم مقطع النص الصادر (الافتراضي: 2000 حرف)
  • mediaMaxMb: حد رفع/تنزيل الوسائط (الافتراضي: 30MB)

البث

يدعم Feishu الردود المتدفقة عبر البطاقات التفاعلية. عند التفعيل، يحدّث البوت بطاقة أثناء توليد النص.
{
  channels: {
    feishu: {
      streaming: true, // enable streaming card output (default true)
      blockStreaming: true, // enable block-level streaming (default true)
    },
  },
}
اضبط streaming: false للانتظار حتى يكتمل الرد بالكامل قبل الإرسال.

جلسات ACP

يدعم Feishu ‏ACP في:
  • الرسائل المباشرة
  • محادثات موضوعات المجموعات
يعتمد ACP في Feishu على أوامر نصية. لا توجد قوائم أوامر slash أصلية، لذا استخدم رسائل /acp ... مباشرة في المحادثة.

ارتباطات ACP الدائمة

استخدم ارتباطات ACP المكتوبة على المستوى الأعلى لتثبيت رسالة مباشرة أو محادثة موضوع في Feishu إلى جلسة ACP دائمة.
{
  agents: {
    list: [
      {
        id: "codex",
        runtime: {
          type: "acp",
          acp: {
            agent: "codex",
            backend: "acpx",
            mode: "persistent",
            cwd: "/workspace/openclaw",
          },
        },
      },
    ],
  },
  bindings: [
    {
      type: "acp",
      agentId: "codex",
      match: {
        channel: "feishu",
        accountId: "default",
        peer: { kind: "direct", id: "ou_1234567890" },
      },
    },
    {
      type: "acp",
      agentId: "codex",
      match: {
        channel: "feishu",
        accountId: "default",
        peer: { kind: "group", id: "oc_group_chat:topic:om_topic_root" },
      },
      acp: { label: "codex-feishu-topic" },
    },
  ],
}

إنشاء ACP مرتبط بسلسلة محادثة من الدردشة

في رسالة مباشرة أو محادثة موضوع في Feishu، يمكنك إنشاء جلسة ACP وربطها في مكانها:
/acp spawn codex --thread here
ملاحظات:
  • يعمل --thread here مع الرسائل المباشرة وموضوعات Feishu.
  • يتم توجيه الرسائل اللاحقة في الرسالة المباشرة/الموضوع المرتبط مباشرة إلى جلسة ACP تلك.
  • لا يستهدف الإصدار v1 دردشات المجموعات العامة غير المرتبطة بموضوع.

توجيه متعدد الوكلاء

استخدم bindings لتوجيه الرسائل المباشرة أو المجموعات في Feishu إلى وكلاء مختلفين.
{
  agents: {
    list: [
      { id: "main" },
      {
        id: "clawd-fan",
        workspace: "/home/user/clawd-fan",
        agentDir: "/home/user/.openclaw/agents/clawd-fan/agent",
      },
      {
        id: "clawd-xi",
        workspace: "/home/user/clawd-xi",
        agentDir: "/home/user/.openclaw/agents/clawd-xi/agent",
      },
    ],
  },
  bindings: [
    {
      agentId: "main",
      match: {
        channel: "feishu",
        peer: { kind: "direct", id: "ou_xxx" },
      },
    },
    {
      agentId: "clawd-fan",
      match: {
        channel: "feishu",
        peer: { kind: "direct", id: "ou_yyy" },
      },
    },
    {
      agentId: "clawd-xi",
      match: {
        channel: "feishu",
        peer: { kind: "group", id: "oc_zzz" },
      },
    },
  ],
}
حقول التوجيه:
  • match.channel: ‏"feishu"
  • match.peer.kind: ‏"direct" أو "group"
  • match.peer.id: معرّف Open للمستخدم (ou_xxx) أو معرّف المجموعة (oc_xxx)
راجع الحصول على معرّفات المجموعة/المستخدم للحصول على نصائح البحث.

مرجع الإعداد

الإعداد الكامل: إعدادات البوابة الخيارات الأساسية:
الإعدادالوصفالافتراضي
channels.feishu.enabledتفعيل/تعطيل القناةtrue
channels.feishu.domainنطاق API ‏(feishu أو lark)feishu
channels.feishu.connectionModeوضع نقل الأحداثwebsocket
channels.feishu.defaultAccountمعرّف الحساب الافتراضي للتوجيه الصادرdefault
channels.feishu.verificationTokenمطلوب لوضع webhook-
channels.feishu.encryptKeyمطلوب لوضع webhook-
channels.feishu.webhookPathمسار route لـ webhook/feishu/events
channels.feishu.webhookHostمضيف الربط لـ webhook127.0.0.1
channels.feishu.webhookPortمنفذ الربط لـ webhook3000
channels.feishu.accounts.<id>.appIdApp ID-
channels.feishu.accounts.<id>.appSecretApp Secret-
channels.feishu.accounts.<id>.domainتجاوز نطاق API لكل حسابfeishu
channels.feishu.dmPolicyسياسة الرسائل المباشرةpairing
channels.feishu.allowFromقائمة السماح للرسائل المباشرة (قائمة open_id)-
channels.feishu.groupPolicyسياسة المجموعاتallowlist
channels.feishu.groupAllowFromقائمة السماح للمجموعات-
channels.feishu.requireMentionطلب @mention افتراضيًامشروط
channels.feishu.groups.<chat_id>.requireMentionتجاوز طلب @mention لكل مجموعةموروث
channels.feishu.groups.<chat_id>.enabledتفعيل المجموعةtrue
channels.feishu.textChunkLimitحجم مقطع الرسالة2000
channels.feishu.mediaMaxMbحد حجم الوسائط30
channels.feishu.streamingتفعيل خرج البطاقات المتدفقةtrue
channels.feishu.blockStreamingتفعيل البث على مستوى الكتلtrue

مرجع dmPolicy

القيمةالسلوك
"pairing"الافتراضي. يحصل المستخدمون غير المعروفين على رمز اقتران؛ ويجب اعتمادهم
"allowlist"فقط المستخدمون الموجودون في allowFrom يمكنهم الدردشة
"open"السماح لجميع المستخدمين (يتطلب "*" في allowFrom)
"disabled"تعطيل الرسائل المباشرة

أنواع الرسائل المدعومة

الاستقبال

  • ✅ نص
  • ✅ نص منسق (post)
  • ✅ صور
  • ✅ ملفات
  • ✅ صوت
  • ✅ فيديو/وسائط
  • ✅ ملصقات

الإرسال

  • ✅ نص
  • ✅ صور
  • ✅ ملفات
  • ✅ صوت
  • ✅ فيديو/وسائط
  • ✅ بطاقات تفاعلية
  • ⚠️ نص منسق (تنسيق بنمط post وبطاقات، وليس ميزات التأليف العشوائية في Feishu)

سلاسل المحادثات والردود

  • ✅ ردود مضمّنة
  • ✅ ردود سلسلة الموضوع عندما يوفّر Feishu ‏reply_in_thread
  • ✅ تظل ردود الوسائط مدركة للسلسلة عند الرد على رسالة سلسلة/موضوع

تعليقات Drive

يمكن لـ Feishu تشغيل الوكيل عندما يضيف شخص ما تعليقًا على مستند Feishu Drive ‏(Docs وSheets وغيرها). يتلقى الوكيل نص التعليق وسياق المستند وسلسلة التعليق حتى يتمكن من الرد داخل السلسلة أو إجراء تعديلات على المستند. المتطلبات:
  • الاشتراك في drive.notice.comment_add_v1 ضمن إعدادات اشتراك أحداث تطبيق Feishu (إلى جانب im.message.receive_v1 الموجود)
  • أداة Drive مفعلة افتراضيًا؛ عطّلها باستخدام channels.feishu.tools.drive: false
تكشف أداة feishu_drive عن إجراءات التعليقات التالية:
الإجراءالوصف
list_commentsسرد التعليقات على مستند
list_comment_repliesسرد الردود في سلسلة تعليق
add_commentإضافة تعليق جديد على المستوى الأعلى
reply_commentالرد على سلسلة تعليق موجودة
عندما يتعامل الوكيل مع حدث تعليق Drive، فإنه يتلقى:
  • نص التعليق والمرسل
  • بيانات المستند الوصفية (العنوان والنوع وURL)
  • سياق سلسلة التعليق للردود داخل السلسلة
بعد إجراء تعديلات على المستند، يتم توجيه الوكيل لاستخدام feishu_drive.reply_comment لإخطار المعلّق ثم إخراج الرمز الصامت المطابق تمامًا NO_REPLY / no_reply لتجنب الإرسال المكرر.

سطح إجراءات وقت التشغيل

يكشف Feishu حاليًا عن إجراءات وقت التشغيل التالية:
  • send
  • read
  • edit
  • thread-reply
  • pin
  • list-pins
  • unpin
  • member-info
  • channel-info
  • channel-list
  • react وreactions عندما تكون التفاعلات مفعّلة في الإعدادات
  • إجراءات تعليقات feishu_drive: ‏list_comments وlist_comment_replies وadd_comment وreply_comment

ذو صلة