Microsoft Teams (مكوّن إضافي)
«اتركوا كل أمل، يا من تدخلون هنا».آخر تحديث: 2026-01-21 الحالة: يتم دعم النص + مرفقات الرسائل المباشرة؛ إرسال الملفات في القنوات/المجموعات يتطلب
sharePointSiteId + أذونات Graph (انظر إرسال الملفات في محادثات المجموعات). يتم إرسال الاستطلاعات عبر بطاقات Adaptive Cards.
المكوّن الإضافي المطلوب
يتم شحن Microsoft Teams كمكوّن إضافي ولا يأتي مضمّنًا مع التثبيت الأساسي. تغيير كاسر (2026.1.15): تم إخراج MS Teams من النواة. إذا كنت تستخدمه، يجب تثبيت المكوّن الإضافي. السبب: الحفاظ على خفة التثبيتات الأساسية والسماح بتحديث تبعيات MS Teams بشكل مستقل. التثبيت عبر CLI (سجل npm):إعداد سريع (للمبتدئين)
- تثبيت مكوّن Microsoft Teams الإضافي.
- إنشاء Azure Bot (معرّف التطبيق + سرّ العميل + معرّف المستأجر).
- تهيئة OpenClaw باستخدام هذه الاعتمادات.
- تعريض
/api/messages(المنفذ 3978 افتراضيًا) عبر عنوان URL عام أو نفق. - تثبيت حزمة تطبيق Teams وبدء الـ Gateway.
channels.msteams.groupPolicy: "allowlist"). للسماح بالردود في المجموعات، عيّن channels.msteams.groupAllowFrom (أو استخدم groupPolicy: "open" للسماح لأي عضو، مع اشتراط الذِكر).
الأهداف
- التحدث إلى OpenClaw عبر الرسائل المباشرة في Teams أو محادثات المجموعات أو القنوات.
- الحفاظ على توجيه حتمي: تعود الردود دائمًا إلى القناة التي وصلت منها.
- الافتراضي هو سلوك آمن للقنوات (يتطلب الذِكر ما لم يتم الضبط خلاف ذلك).
كتابة التهيئة
افتراضيًا، يُسمح لـ Microsoft Teams بكتابة تحديثات التهيئة التي تُشغَّل بواسطة/config set|unset (يتطلب commands.config: true).
للتعطيل:
التحكم في الوصول (الرسائل المباشرة + المجموعات)
الوصول للرسائل المباشرة- الافتراضي:
channels.msteams.dmPolicy = "pairing". يتم تجاهل المُرسِلين غير المعروفين حتى تتم الموافقة عليهم. channels.msteams.allowFromيقبل معرّفات كائن AAD أو UPNs أو أسماء العرض. يقوم المعالج بحل الأسماء إلى معرّفات عبر Microsoft Graph عندما تسمح الاعتمادات.
- الافتراضي:
channels.msteams.groupPolicy = "allowlist"(محجوب ما لم تُضِفgroupAllowFrom). استخدمchannels.defaults.groupPolicyلتجاوز الافتراضي عند عدم الضبط. channels.msteams.groupAllowFromيتحكم في أي المُرسِلين يمكنهم التفعيل في محادثات/قنوات المجموعات (يرجع إلىchannels.msteams.allowFrom).- عيّن
groupPolicy: "open"للسماح لأي عضو (مع اشتراط الذِكر افتراضيًا). - لمنع كل القنوات، عيّن
channels.msteams.groupPolicy: "disabled".
- حدِّد نطاق الردود في المجموعات/القنوات بإدراج الفرق والقنوات تحت
channels.msteams.teams. - يمكن أن تكون المفاتيح معرّفات الفرق أو أسمائها؛ ومفاتيح القنوات يمكن أن تكون معرّفات المحادثة أو الأسماء.
- عند تعيين
groupPolicy="allowlist"ووجود قائمة سماح للفرق، لا تُقبل إلا الفرق/القنوات المُدرجة (مع اشتراط الذِكر). - يقبل معالج التهيئة إدخالات
Team/Channelويخزّنها لك. - عند بدء التشغيل، يقوم OpenClaw بحل أسماء الفرق/القنوات وقائمة سماح المستخدمين إلى معرّفات (عندما تسمح أذونات Graph) ويسجّل المطابقة؛ وتُحفظ الإدخالات غير المحلولة كما كُتبت.
كيف يعمل
- تثبيت مكوّن Microsoft Teams الإضافي.
- إنشاء Azure Bot (معرّف التطبيق + السرّ + معرّف المستأجر).
- إنشاء حزمة تطبيق Teams تشير إلى الروبوت وتتضمن أذونات RSC أدناه.
- رفع/تثبيت تطبيق Teams داخل فريق (أو النطاق الشخصي للرسائل المباشرة).
- تهيئة
msteamsفي~/.openclaw/openclaw.json(أو متغيرات البيئة) وبدء الـ Gateway. - يستمع الـ Gateway لحركة webhook الخاصة بـ Bot Framework على
/api/messagesافتراضيًا.
إعداد Azure Bot (المتطلبات المسبقة)
قبل تهيئة OpenClaw، تحتاج إلى إنشاء مورد Azure Bot.الخطوة 1: إنشاء Azure Bot
- انتقل إلى Create Azure Bot
-
املأ تبويب Basics:
الحقل القيمة اسم المعرّف الخاص بالبوت اسم الروبوت، مثل openclaw-msteams(يجب أن يكون فريدًا)الاشتراك اختر اشتراك Azure الخاص بك مجموعة الموارد أنشئ جديدًا أو استخدم موجودًا فئة التسعير Free للتطوير/الاختبار نوع التطبيق Single Tenant (موصى به – انظر الملاحظة أدناه) نوع الإنشاء إنشاء معرف تطبيق Microsoft جديد
إشعار إيقاف: تم إيقاف إنشاء روبوتات متعددة المستأجرين الجديدة بعد 2025-07-31. استخدم Single Tenant للروبوتات الجديدة.
- انقر Review + create → Create (انتظر ~1–2 دقيقة)
الخطوة 2: الحصول على الاعتمادات
- انتقل إلى مورد Azure Bot → Configuration
- انسخ Microsoft App ID → هذا هو
appId - انقر Manage Password → انتقل إلى تسجيل التطبيق
- ضمن Certificates & secrets → New client secret → انسخ Value → هذا هو
appPassword - انتقل إلى Overview → انسخ Directory (tenant) ID → هذا هو
tenantId
الخطوة 3: تهيئة نقطة نهاية المراسلة
- في Azure Bot → Configuration
- عيّن Messaging endpoint إلى عنوان URL الخاص بالويبهوك:
- الإنتاج:
https://your-domain.com/api/messages - التطوير المحلي: استخدم نفقًا (انظر التطوير المحلي أدناه)
- الإنتاج:
الخطوة 4: تمكين قناة Teams
- في Azure Bot → Channels
- انقر Microsoft Teams → Configure → Save
- وافق على شروط الخدمة
التطوير المحلي (النفق)
لا يمكن لـ Teams الوصول إلىlocalhost. استخدم نفقًا للتطوير المحلي:
الخيار أ: ngrok
بوابة مطوري Teams (بديل)
بدل إنشاء ملف manifest ZIP يدويًا، يمكنك استخدام Teams Developer Portal:- انقر + New app
- املأ المعلومات الأساسية (الاسم، الوصف، معلومات المطوّر)
- انتقل إلى App features → Bot
- اختر Enter a bot ID manually والصق معرّف تطبيق Azure Bot
- حدّد النطاقات: Personal، Team، Group Chat
- انقر Distribute → Download app package
- في Teams: Apps → Manage your apps → Upload a custom app → اختر ملف ZIP
اختبار الروبوت
الخيار أ: Azure Web Chat (تحقق من الويبهوك أولًا)- في بوابة Azure → مورد Azure Bot الخاص بك → Test in Web Chat
- أرسل رسالة — يجب أن ترى ردًا
- يؤكد ذلك أن نقطة نهاية الويبهوك تعمل قبل إعداد Teams
- ثبّت تطبيق Teams (تحميل جانبي أو كتالوج المؤسسة)
- اعثر على الروبوت في Teams وأرسل رسالة مباشرة
- تحقق من سجلات الـ Gateway للنشاط الوارد
الإعداد (نص فقط، حد أدنى)
-
تثبيت مكوّن Microsoft Teams الإضافي
- من npm:
openclaw plugins install @openclaw/msteams - من نسخة محلية:
openclaw plugins install ./extensions/msteams
- من npm:
-
تسجيل الروبوت
- أنشئ Azure Bot (انظر أعلاه) وسجّل:
- App ID
- Client secret (كلمة مرور التطبيق)
- Tenant ID (مستأجر واحد)
- أنشئ Azure Bot (انظر أعلاه) وسجّل:
-
ملف manifest لتطبيق Teams
- تضمين إدخال
botمعbotId = <App ID>. - النطاقات:
personal،team،groupChat. supportsFiles: true(مطلوب للتعامل مع الملفات في النطاق الشخصي).- إضافة أذونات RSC (أدناه).
- إنشاء أيقونات:
outline.png(32x32) وcolor.png(192x192). - ضغط الملفات الثلاثة معًا:
manifest.json،outline.png،color.png.
- تضمين إدخال
-
تهيئة OpenClaw
يمكنك أيضًا استخدام متغيرات البيئة بدل مفاتيح التهيئة:
MSTEAMS_APP_IDMSTEAMS_APP_PASSWORDMSTEAMS_TENANT_ID
-
نقطة نهاية الروبوت
- عيّن نقطة نهاية المراسلة في Azure Bot إلى:
https://<host>:3978/api/messages(أو المسار/المنفذ الذي تختاره).
- عيّن نقطة نهاية المراسلة في Azure Bot إلى:
-
تشغيل الـ Gateway
- تبدأ قناة Teams تلقائيًا عند تثبيت المكوّن ووجود تهيئة
msteamsمع الاعتمادات.
- تبدأ قناة Teams تلقائيًا عند تثبيت المكوّن ووجود تهيئة
سياق السجل (History)
- يتحكم
channels.msteams.historyLimitفي عدد الرسائل الأخيرة من القناة/المجموعة التي تُغلّف داخل الموجّه. - يعود افتراضيًا إلى
messages.groupChat.historyLimit. عيّن0لتعطيل ذلك (الافتراضي 50). - يمكن تقييد سجل الرسائل المباشرة عبر
channels.msteams.dmHistoryLimit(عدد أدوار المستخدم). تجاوزات لكل مستخدم:channels.msteams.dms["<user_id>"].historyLimit.
أذونات Teams RSC الحالية (Manifest)
هذه هي أذونات resourceSpecific الحالية في ملف manifest لتطبيق Teams لدينا. تنطبق فقط داخل الفريق/الدردشة التي ثُبِّت فيها التطبيق. للقنوات (نطاق الفريق):ChannelMessage.Read.Group(Application) – استلام كل رسائل القناة دون @mentionChannelMessage.Send.Group(Application)Member.Read.Group(Application)Owner.Read.Group(Application)ChannelSettings.Read.Group(Application)TeamMember.Read.Group(Application)TeamSettings.Read.Group(Application)
ChatMessage.Read.Chat(Application) – استلام كل رسائل محادثة المجموعة دون @mention
مثال Manifest لتطبيق Teams (محذوف التفاصيل)
مثال أدنى صالح مع الحقول المطلوبة. استبدل المعرّفات وعناوين URL.ملاحظات Manifest (حقول إلزامية)
bots[].botIdيجب أن يطابق معرّف تطبيق Azure Bot.webApplicationInfo.idيجب أن يطابق معرّف تطبيق Azure Bot.bots[].scopesيجب أن يتضمن الأسطح التي تخطط لاستخدامها (personal،team،groupChat).bots[].supportsFiles: trueمطلوب للتعامل مع الملفات في النطاق الشخصي.authorization.permissions.resourceSpecificيجب أن يتضمن قراءة/إرسال القنوات إذا أردت حركة مرور القنوات.
تحديث تطبيق موجود
لتحديث تطبيق Teams مُثبّت مسبقًا (مثل إضافة أذونات RSC):- حدّث
manifest.jsonبالإعدادات الجديدة - زد قيمة الحقل
version(مثل1.0.0→1.1.0) - أعد ضغط ملف manifest مع الأيقونات (
manifest.json،outline.png،color.png) - ارفع ملف zip الجديد:
- الخيار أ (Teams Admin Center): Teams Admin Center → Teams apps → Manage apps → اعثر على تطبيقك → Upload new version
- الخيار ب (تحميل جانبي): في Teams → Apps → Manage your apps → Upload a custom app
- لقنوات الفرق: أعد تثبيت التطبيق في كل فريق لتفعيل الأذونات الجديدة
- أغلق Teams تمامًا وأعد تشغيله (ليس مجرد إغلاق النافذة) لمسح بيانات التعريف المخزنة مؤقتًا
الإمكانات: RSC فقط مقابل Graph
مع Teams RSC فقط (التطبيق مُثبّت، دون أذونات Graph API)
يعمل:- قراءة محتوى نص رسائل القنوات.
- إرسال محتوى نص لرسائل القنوات.
- استلام مرفقات الملفات في الرسائل الشخصية (DM).
- محتويات الصور أو الملفات في القنوات/المجموعات (يتضمن الحمولة مجرد HTML).
- تنزيل المرفقات المخزنة في SharePoint/OneDrive.
- قراءة سجل الرسائل (ما بعد حدث الويبهوك المباشر).
مع Teams RSC + أذونات Microsoft Graph (Application)
يضيف:- تنزيل المحتويات المستضافة (الصور الملصقة داخل الرسائل).
- تنزيل مرفقات الملفات المخزنة في SharePoint/OneDrive.
- قراءة سجل رسائل القنوات/الدردشات عبر Graph.
RSC مقابل Graph API
| الإمكانية | أذونات RSC | Graph API |
|---|---|---|
| رسائل فورية | نعم (عبر webhook) | لا (استطلاع فقط) |
| رسائل تاريخية | لا | نعم (يمكن الاستعلام عن السجل) |
| تعقيد الإعداد | ملف manifest فقط | يتطلب موافقة مسؤول + تدفق رموز |
| العمل دون اتصال | لا (يجب التشغيل) | نعم (الاستعلام في أي وقت) |
ChannelMessage.Read.All (يتطلب موافقة المسؤول).
وسائط + سجل عبر Graph (مطلوب للقنوات)
إذا احتجت الصور/الملفات في القنوات أو أردت جلب سجل الرسائل، يجب تمكين أذونات Microsoft Graph ومنح موافقة المسؤول.- في Entra ID (Azure AD) تسجيل التطبيق، أضف أذونات Microsoft Graph Application:
ChannelMessage.Read.All(مرفقات القنوات + السجل)Chat.Read.AllأوChatMessage.Read.All(محادثات المجموعات)
- امنح موافقة المسؤول للمستأجر.
- ارفع رقم إصدار manifest لتطبيق Teams، أعد الرفع، وأعد تثبيت التطبيق في Teams.
- أغلق Teams تمامًا وأعد تشغيله لمسح البيانات المخزنة مؤقتًا.
User.Read.All (Application) وامنح موافقة المسؤول.
القيود المعروفة
مهل Webhook
تسلّم Teams الرسائل عبر webhook HTTP. إذا استغرقت المعالجة وقتًا طويلًا (مثل استجابات LLM البطيئة)، قد ترى:- مهلات Gateway
- إعادة إرسال Teams للرسالة (مسببة تكرارات)
- إسقاط الردود
التنسيق
Markdown في Teams أكثر محدودية من Slack أو Discord:- يعمل التنسيق الأساسي: غامق، مائل،
code، الروابط - قد لا تُعرَض تنسيقات معقدة (الجداول، القوائم المتداخلة) بشكل صحيح
- بطاقات Adaptive Cards مدعومة للاستطلاعات وإرسال البطاقات عمومًا (انظر أدناه)
التهيئة
الإعدادات الأساسية (انظر/gateway/configuration لأنماط القنوات المشتركة):
channels.msteams.enabled: تمكين/تعطيل القناة.channels.msteams.appId،channels.msteams.appPassword،channels.msteams.tenantId: اعتمادات الروبوت.channels.msteams.webhook.port(الافتراضي3978)channels.msteams.webhook.path(الافتراضي/api/messages)channels.msteams.dmPolicy:pairing | allowlist | open | disabled(الافتراضي: pairing)channels.msteams.allowFrom: قائمة سماح للرسائل المباشرة (معرّفات كائن AAD أو UPNs أو أسماء العرض). يقوم المعالج بحل الأسماء إلى معرّفات أثناء الإعداد عند توفر وصول Graph.channels.msteams.textChunkLimit: حجم تقسيم النص الصادر.channels.msteams.chunkMode:length(افتراضي) أوnewlineللتقسيم عند الأسطر الفارغة (حدود الفقرات) قبل التقسيم حسب الطول.channels.msteams.mediaAllowHosts: قائمة سماح لمضيفي المرفقات الواردة (الافتراضي نطاقات Microsoft/Teams).channels.msteams.mediaAuthAllowHosts: قائمة سماح لإرفاق رؤوس Authorization عند إعادة محاولة الوسائط (الافتراضي مضيفو Graph + Bot Framework).channels.msteams.requireMention: اشتراط @mention في القنوات/المجموعات (افتراضي true).channels.msteams.replyStyle:thread | top-level(انظر نمط الرد).channels.msteams.teams.<teamId>.replyStyle: تجاوز لكل فريق.channels.msteams.teams.<teamId>.requireMention: تجاوز لكل فريق.channels.msteams.teams.<teamId>.tools: تجاوزات افتراضية لسياسات الأدوات لكل فريق (allow/deny/alsoAllow) تُستخدم عند غياب تجاوز القناة.channels.msteams.teams.<teamId>.toolsBySender: تجاوزات افتراضية لسياسات الأدوات لكل فريق ولكل مُرسِل ("*"مدعوم).channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle: تجاوز لكل قناة.channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention: تجاوز لكل قناة.channels.msteams.teams.<teamId>.channels.<conversationId>.tools: تجاوزات سياسات الأدوات لكل قناة (allow/deny/alsoAllow).channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender: تجاوزات سياسات الأدوات لكل قناة ولكل مُرسِل ("*"مدعوم).channels.msteams.sharePointSiteId: معرّف موقع SharePoint لرفع الملفات في محادثات/قنوات المجموعات (انظر إرسال الملفات في محادثات المجموعات).
التوجيه والجلسات
- تتبع مفاتيح الجلسة تنسيق الوكيل القياسي (انظر /concepts/session):
- الرسائل المباشرة تشترك في الجلسة الرئيسية (
agent:<agentId>:<mainKey>). - رسائل القنوات/المجموعات تستخدم معرّف المحادثة:
agent:<agentId>:msteams:channel:<conversationId>agent:<agentId>:msteams:group:<conversationId>
- الرسائل المباشرة تشترك في الجلسة الرئيسية (
نمط الرد: السلاسل مقابل المنشورات
قدّمت Teams مؤخرًا نمطي واجهة للقنوات فوق نفس نموذج البيانات الأساسي:| النمط | الوصف | replyStyle الموصى به |
|---|---|---|
| المنشورات (كلاسيكي) | تظهر الرسائل كبطاقات مع ردود متفرعة أسفلها | thread (افتراضي) |
| السلاسل (مشابه لـ Slack) | تتدفق الرسائل خطيًا، مثل Slack | top-level |
replyStyle الخاطئ:
threadفي قناة بنمط السلاسل → تظهر الردود متداخلة بشكل غير ملائمtop-levelفي قناة بنمط المنشورات → تظهر الردود كمنشورات عليا منفصلة بدل الرد داخل السلسلة
replyStyle لكل قناة وفق إعداد القناة:
المرفقات والصور
القيود الحالية:- الرسائل المباشرة: تعمل الصور ومرفقات الملفات عبر واجهات ملفات روبوت Teams.
- القنوات/المجموعات: تعيش المرفقات في تخزين M365 (SharePoint/OneDrive). تتضمن حمولة الويبهوك مجرد HTML، وليس بايتات الملف الفعلية. أذونات Graph API مطلوبة لتنزيل مرفقات القنوات.
channels.msteams.mediaAllowHosts (استخدم ["*"] للسماح بأي مضيف).
تُرفق رؤوس Authorization فقط للمضيفين في channels.msteams.mediaAuthAllowHosts (الافتراضي مضيفو Graph + Bot Framework). حافظ على صرامة هذه القائمة (وتجنب لاحقات متعددة المستأجرين).
إرسال الملفات في محادثات المجموعات
يمكن للروبوتات إرسال الملفات في الرسائل المباشرة باستخدام تدفق FileConsentCard (مدمج). لكن إرسال الملفات في محادثات/قنوات المجموعات يتطلب إعدادًا إضافيًا:| السياق | كيفية إرسال الملفات | الإعداد المطلوب |
|---|---|---|
| الرسائل المباشرة | FileConsentCard → قبول المستخدم → رفع الروبوت | يعمل خارج الصندوق |
| محادثات/قنوات المجموعات | رفع إلى SharePoint → مشاركة رابط | يتطلب sharePointSiteId + أذونات Graph |
| الصور (أي سياق) | مضمنة Base64 | يعمل خارج الصندوق |
لماذا تحتاج محادثات المجموعات إلى SharePoint
لا تمتلك الروبوتات محرك OneDrive شخصيًا (نقطة نهاية Graph API/me/drive لا تعمل لهويات التطبيقات). لإرسال الملفات في محادثات/قنوات المجموعات، يرفع الروبوت إلى موقع SharePoint وينشئ رابط مشاركة.
الإعداد
-
إضافة أذونات Graph API في Entra ID (Azure AD) → تسجيل التطبيق:
Sites.ReadWrite.All(Application) – رفع الملفات إلى SharePointChat.Read.All(Application) – اختياري، يفعّل روابط مشاركة لكل مستخدم
- منح موافقة المسؤول للمستأجر.
-
الحصول على معرّف موقع SharePoint:
-
تهيئة OpenClaw:
سلوك المشاركة
| الإذن | سلوك المشاركة |
|---|---|
Sites.ReadWrite.All فقط | رابط مشاركة على مستوى المؤسسة (يمكن لأي شخص في المؤسسة الوصول) |
Sites.ReadWrite.All + Chat.Read.All | رابط مشاركة لكل مستخدم (فقط أعضاء الدردشة يمكنهم الوصول) |
Chat.Read.All مفقودًا، يعود الروبوت إلى المشاركة على مستوى المؤسسة.
سلوك الرجوع (Fallback)
| السيناريو | النتيجة |
|---|---|
محادثة مجموعة + ملف + ضبط sharePointSiteId | الرفع إلى SharePoint وإرسال رابط مشاركة |
محادثة مجموعة + ملف + بدون sharePointSiteId | محاولة رفع OneDrive (قد تفشل) وإرسال نص فقط |
| محادثة شخصية + ملف | تدفق FileConsentCard (يعمل دون SharePoint) |
| أي سياق + صورة | مضمنة Base64 (تعمل دون SharePoint) |
موقع تخزين الملفات
تُخزَّن الملفات المرفوعة في مجلد/OpenClawShared/ داخل مكتبة المستندات الافتراضية لموقع SharePoint المُهيّأ.
الاستطلاعات (Adaptive Cards)
يرسل OpenClaw استطلاعات Teams كبطاقات Adaptive Cards (لا توجد واجهة برمجة استطلاعات أصلية في Teams).- CLI:
openclaw message poll --channel msteams --target conversation:<id> ... - تُسجَّل الأصوات بواسطة الـ Gateway في
~/.openclaw/msteams-polls.json. - يجب أن يبقى الـ Gateway متصلًا لتسجيل الأصوات.
- لا يتم نشر ملخصات النتائج تلقائيًا بعد (افحص ملف التخزين عند الحاجة).
بطاقات Adaptive (عامّة)
أرسل أي JSON لبطاقة Adaptive إلى مستخدمي Teams أو المحادثات باستخدام أداة أو CLImessage.
يقبل المعامل card كائن JSON لبطاقة Adaptive. عند توفير card، يصبح نص الرسالة اختياريًا.
أداة الوكيل:
تنسيقات الهدف
تستخدم أهداف MSTeams بادئات للتمييز بين المستخدمين والمحادثات:| نوع الهدف | التنسيق | مثال |
|---|---|---|
| مستخدم (بالمعرّف) | user:<aad-object-id> | user:40a1a0ed-4ff2-4164-a219-55518990c197 |
| مستخدم (بالاسم) | user:<display-name> | user:John Smith (يتطلب Graph API) |
| مجموعة/قناة | conversation:<conversation-id> | conversation:19:[email protected] |
| مجموعة/قناة (خام) | <conversation-id> | 19:[email protected] (إذا احتوى على @thread) |
user:، تُحل الأسماء افتراضيًا إلى مجموعات/فرق. استخدم دائمًا user: عند استهداف الأشخاص باسم العرض.
رسالة استباقية
- لا تكون الرسائل الاستباقية ممكنة إلا بعد تفاعل المستخدم، لأننا نخزّن مراجع المحادثة عند تلك النقطة.
- انظر
/gateway/configurationبخصوصdmPolicyوبوابات قوائم السماح.
معرّفات الفرق والقنوات (خطأ شائع)
معامل الاستعلامgroupId في عناوين URL الخاصة بـ Teams ليس معرّف الفريق المستخدم في التهيئة. استخرج المعرّفات من مسار URL بدلًا من ذلك:
عنوان URL للفريق:
- معرّف الفريق = مقطع المسار بعد
/team/(بعد فك الترميز، مثل19:[email protected]) - معرّف القناة = مقطع المسار بعد
/channel/(بعد فك الترميز) - تجاهل معامل الاستعلام
groupId
القنوات الخاصة
الدعم محدود للروبوتات في القنوات الخاصة:| الميزة | القنوات القياسية | القنوات الخاصة |
|---|---|---|
| تثبيت بوت | نعم | محدود |
| الرسائل الفورية (webhook) | نعم | قد لا يعمل |
| أذونات RSC | نعم | قد تتصرف بشكل مختلف |
| @mentions | نعم | إذا كان الروبوت متاحًا |
| سجل Graph API | نعم | نعم (مع الأذونات) |
- استخدام القنوات القياسية لتفاعلات الروبوت
- استخدام الرسائل المباشرة — يمكن للمستخدمين دائمًا مراسلة الروبوت مباشرة
- استخدام Graph API للوصول التاريخي (يتطلب
ChannelMessage.Read.All)
مشكلات شائعة
مشكلات شائعة
- الصور لا تظهر في القنوات: أذونات Graph أو موافقة المسؤول مفقودة. أعد تثبيت تطبيق Teams وأغلق/أعد فتح Teams بالكامل.
- لا توجد ردود في القناة: الذِكر مطلوب افتراضيًا؛ عيّن
channels.msteams.requireMention=falseأو اضبط لكل فريق/قناة. - عدم تطابق الإصدار (Teams ما زال يعرض manifest قديمًا): أزل التطبيق وأعد إضافته وأغلق Teams بالكامل للتحديث.
- 401 Unauthorized من الويبهوك: متوقع عند الاختبار اليدوي دون JWT من Azure — يعني أن نقطة النهاية قابلة للوصول لكن فشل التوثيق. استخدم Azure Web Chat للاختبار الصحيح.
أخطاء رفع Manifest
- «Icon file cannot be empty»: يشير manifest إلى أيقونات حجمها 0 بايت. أنشئ أيقونات PNG صالحة (32x32 لـ
outline.png، و192x192 لـcolor.png). - «webApplicationInfo.Id already in use»: التطبيق ما زال مُثبّتًا في فريق/دردشة أخرى. اعثر عليه وألغِ تثبيته أولًا، أو انتظر 5–10 دقائق للانتشار.
- «Something went wrong» عند الرفع: ارفع عبر https://admin.teams.microsoft.com بدلًا من ذلك، وافتح أدوات المطوّر في المتصفح (F12) → تبويب Network، وتحقق من جسم الاستجابة للخطأ الفعلي.
- فشل التحميل الجانبي: جرّب «Upload an app to your org’s app catalog» بدل «Upload a custom app» — غالبًا ما يتجاوز قيود التحميل الجانبي.
أذونات RSC لا تعمل
- تحقق من أن
webApplicationInfo.idيطابق معرّف تطبيق الروبوت بدقة - أعد رفع التطبيق وأعد تثبيته في الفريق/الدردشة
- تحقق مما إذا كان مسؤول المؤسسة قد حظر أذونات RSC
- تأكد من استخدام النطاق الصحيح:
ChannelMessage.Read.Groupللفرق، وChatMessage.Read.Chatلمحادثات المجموعات
المراجع
- Create Azure Bot – دليل إعداد Azure Bot
- Teams Developer Portal – إنشاء/إدارة تطبيقات Teams
- Teams app manifest schema
- Receive channel messages with RSC
- RSC permissions reference
- Teams bot file handling (القنوات/المجموعات تتطلب Graph)
- Proactive messaging