ربط Microsoft Teams
EduBook بيسجّل الحضور من ميتنجات Teams عبر Microsoft Graph subscriptions. لما تربط حسابك، كل event دخول/خروج من ميتنج Teams مرتبط بمجموعة من مجموعاتك بيتسجّل، والطلاب اللي بيقعدوا أكتر من الـ threshold بيتعلّموا حاضرين تلقائي.
ده بيشتغل جنب Zoom — تقدر تربط الاتنين وتختار المنصة لكل مجموعة.
قبل ما تبدأ
محتاج:
- حساب Microsoft 365 بصلاحية admin على الـ tenant بتاعك (الربط محتاج “grant admin consent”).
- 15-20 دقيقة لإعداد Azure app.
الـ flow أعقد من Zoom لأن Microsoft بيقسّم “اعمل app” و “ادّي الـ app إذن إنه يعمل أي حاجة” على شاشتين، الاتنين محتاجين تأكيد.
1. اعمل Azure AD app registration
- سجّل دخول entra.microsoft.com كـ global admin.
- الـ side nav ← Identity ← Applications ← App registrations ← New registration.
- Name:
EduBook Attendance - Supported account types: اختار Accounts in this organizational directory only (single tenant).
- Redirect URI: سيبه فاضي — إحنا بنستخدم client_credentials flow اللي مفيهوش redirect.
- اضغط Register.
دلوقتي إنت في صفحة overview الـ app. انسخ القيمتين دول هتلصقهم في EduBook بعدين:
- Directory (tenant) ID
- Application (client) ID
2. ضيف الـ API permission
- side nav بتاع الـ app ← API permissions.
- Add a permission ← Microsoft Graph ← Application permissions (مش “Delegated”).
- دوّر على
CallRecords.Read.All← علّمها ← Add permissions. - Grant admin consent for {your tenant} — الشاشة دي معظم مشاكل الإعداد بتحصل فيها. الزرار ده بيظهر بس للـ users اللي بيقدروا يدّوا consent على مستوى الـ tenant (global admin، أو app admin، أو cloud app admin). لو مش بتشوفه، سلّم الصفحة لحد عنده الصلاحية.
- استنى علامة الـ ✓ خضرا جنب الـ permission. الحالة المفروض تكون “Granted for {your tenant}”.
من غير الخطوة دي مفيش حاجة هتشتغل — Microsoft هيخليك تعمل subscription بس مفيش events هتفير.
3. اعمل client secret
- side nav ← Certificates & secrets ← tab Client secrets ← New client secret.
- Description:
EduBook(أو أي حاجة سهلة تفتكرها). - Expires: اختار مدة. Microsoft قافل الحد الأقصى للـ secrets على 24 شهر. حط reminder في كالندارك تـ rotate قبل الانتهاء بشهر — لما يخلص EduBook هيقف، وهتحتاج تلصق واحد جديد.
- اضغط Add.
- انسخ عمود “Value” فوراً. Microsoft بيظهره مرة واحدة بس. عمود “Secret ID” مش اللي إنت عاوزه.
4. ربط من EduBook
في EduBook ← الإعدادات ← Integrations ← Microsoft Teams:
- الصق Microsoft tenant ID (من خطوة 1).
- الصق Application (Client) ID (من خطوة 1).
- الصق Client Secret (الـ Value من خطوة 3).
- اضغط ربط Teams.
EduBook بيعمل 3 حاجات لما تحفظ:
- بيكلّم Microsoft
/oauth/tokenللتحقق من الـ credentials. لو غلط بتظهر toast بـ error، مفيش حاجة بتتحفظ. - بيولّد
clientStateخاص بـ tenant بتاعك (بيستخدمه للتحقق من كل webhook بيجي من Microsoft). - بيكلّم Microsoft Graph لإنشاء
communications/callRecordssubscription بيشاور على webhook endpoint بتاعنا.
لو حاجة من دول فشلت هتشوف الخطأ في الـ toast. الفشل الأكتر شيوعاً رفض إنشاء الـ subscription بسبب إن admin consent ما اتعملش في خطوة 2.
في النجاح، الكارد بيتحوّل لـ متصل ✓ وبيظهر tenant ID + تاريخ انتهاء الـ subscription.
5. استخدمها
اعمل مجموعة أونلاين، اختار Microsoft Teams كمنصة، والصق
join URL بتاع الميتنج (الـ
https://teams.microsoft.com/l/meetup-join/... اللي الطلاب بيدوسوا
عليه عشان يدخلوا).
لما الطلاب يدخلوا الميتنج:
- كل join/leave بيتسجّل في EduBook.
- الوقت التراكمي بيتجمع (افتراضي threshold 30 دقيقة، قابل للتعديل لكل مجموعة).
- لما الطالب يعدّي الـ threshold، بيتعلّم حاضر بـ
source: teamsفي سجل الحضور.
المطابقة بـ display name لحساب Microsoft + Azure user id. للحصول على مطابقة موثوقة، اطلب من الطلاب يدخلوا Teams مسجّلين بنفس حساب Microsoft اللي إيميله موجود عندك في النظام.
الفرق بين الحضور بـ Zoom و Teams
| Zoom | Teams | |
|---|---|---|
| المطابقة بالإيميل | ✅ | ⚠️ (محدودة — اقرا تحت) |
| المطابقة بالتليفون | ✅ | ✅ |
| توقيع الـ webhook | HMAC-SHA256 في الـ header | clientState في الـ body |
| عمر الـ subscription | للأبد (في Zoom marketplace) | ~3 أيام (تجديد تلقائي) |
| إنشاء ميتنج تلقائي | ✅ Enterprise | ❌ (لصق يدوي) |
محدودية الـ email match: Microsoft Graph callRecord events بتعرّف
المشاركين بـ Azure user object id، مش بالإيميل. الحصول على الإيميل
محتاج طلب منفصل لـ /users/{id} تخطّيناه في v1 عشان السرعة. فلو
الطالب دخل Teams من حساب Microsoft شخصي مش متطابق مع سجله في
EduBook، المطابقة التلقائية هتفشل. حلول:
- شجّع الطلاب يستخدموا حساب العمل / المدرسة اللي إيميله متطابق مع سجلهم في EduBook.
- أو يدخلوا بـ PSTN dial-in — مطابقة التليفون بتستخدم رقم التليفون اللي Microsoft بيظهره على phone identity.
إنشاء ميتنج Teams تلقائي على الـ roadmap بس بيتطلب delegated permissions (per-user OAuth flow) بدل application permissions. دلوقتي، tenants Pro/Enterprise بيلصقوا الـ meeting URL يدوي — زي باقي الـ flow.
التجديد اليومي
Microsoft قافل callRecord subscriptions على 4230 دقيقة (~3 أيام). الـ renewal cron في EduBook بيشتغل مرة في اليوم، بيدوّر على subscriptions اللي فاضل لها أقل من ~24 ساعة، وبيكلّم Graph PATCH endpoint عشان يـ push تاريخ الانتهاء. مش محتاج تعمل حاجة.
لو التجديد فشل (غالباً: client secret منتهي)، الكارد بيظهر الخطأ في الإعدادات ← Integrations ← Microsoft Teams ← آخر خطأ. صلّح السبب (rotate الـ secret) واضغط إعادة الربط عشان يعيد إنشاء الـ subscription.
فصل الربط
الإعدادات ← Integrations ← Microsoft Teams ← فصل الربط بيعمل حاجتين:
- بيكلّم Microsoft Graph عشان يـ DELETE الـ subscription علشان الـ events تتوقف.
- بيمسح الـ credentials من قاعدة بيانات EduBook.
الـ Azure AD app registration على entra.microsoft.com مش بيتمسّ — تقدر تربط تاني بنفس الـ credentials في أي وقت.
مشاكل وحلولها
“Microsoft رفض البيانات دي” — راجع القيم التلاتة. عمود “Value” من Certificates & secrets هو اللي إنت عاوزه، مش Secret ID.
“Microsoft Graph رفض الـ subscription” — admin consent لـ
CallRecords.Read.All ما اتعملش (أو اتلغى). أعد خطوة 2 ←
Grant admin consent.
متصل بس “آخر حدث استقبلناه” بيفضل فاضي — تأكد إن Meeting URL
بتاع المجموعة هو بالظبط الـ join URL اللي Microsoft بيولّده
(مش tinyurl، مش لينك Teams calendar مع parameters زيادة). الـ
webhook بيـ match المجموعات بـ joinWebUrl exact string match.
الحضور التلقائي مش بيعلّم حد حاضر — غالباً المشاركين بيدخلوا كـ PSTN dial-in أو بحسابات Microsoft شخصية مش متطابقة. خلي طالب يدخل بحساب العمل/المدرسة اللي إيميله متطابق وجرّب تاني.