/v1 في Power BI. ويغطي
نمط الاتصال عبر Power Query (M)، ونموذجًا دلاليًا بمخطط نجمي مبنيًا
على /v1/activities، والتحديث التزايدي، ومتى تُستخدم مجموعات بيانات
إعداد التقارير المعاينة لنتائج التصيّد الاحتيالي لكل شخص.
تستخدم الأمثلة مضيف الإنتاج في الولايات المتحدة
(https://api.us-east-1.livingsecurity.ai/v1). بالنسبة إلى مؤسسة في الاتحاد الأوروبي، استخدم
https://api.eu-west-1.livingsecurity.ai/v1 في كلٍّ من Fn_FetchAll و
Fn_GetJson، ثم اربط بيانات اعتماد مصدر البيانات بذلك المضيف. راجع
المناطق.
يستخدم هذا الدليل بيانات اعتماد Basic المخزّنة مع مفتاح API. ولا تحتاج إلى
عميل OAuth. راجع المصادقة لمعرفة خيارات
بيانات الاعتماد، وDeveloper Hub
للاطلاع على الوصول والإعداد.
الغرض من هذا المثال
استخدمه عندما تحتاج إلى:- تحميل نقاط نهاية القوائم في
/v1إلى مجموعة بيانات Power BI مع ترقيم صفحات صحيح قائم على المؤشر وإعادة محاولة عند تجاوز حد المعدل. - بناء نموذج دلالي تكون فيه المقاييس (“الكيانات النشطة”، “الأنشطة لكل كيان نشط”) بُعدية بدلًا من عدّها من جدول مسطّح.
- تقليص تحديث Power BI المجدول من قراءة كاملة للسجل التاريخي إلى نافذة يومية صغيرة باستخدام التحديث التزايدي.
- اختيار مستوى التفصيل المناسب للتصيّد الاحتيالي: إجماليات الحملات (تشغيلية) مقابل النتائج لكل شخص والأحداث المصنّفة (معاينة إعداد التقارير).
المتطلبات الأساسية
- مفتاح API يملك الأذونات التي تحتاج إليها استعلاماتك:
- المثال التشغيلي:
activity:readوentity:readوsimulation:read. - التصيّد الاحتيالي لكل شخص عبر مجموعات بيانات إعداد التقارير:
reporting:read. راجع مفاتيح API.
- المثال التشغيلي:
- Power BI Desktop، أو مساحة عمل Power BI / Fabric يمكنك فيها إنشاء نموذج دلالي وجدولة التحديث.
اختيار مستوى التفصيل المناسب
يوفّر/v1 سطحين مترابطين للتصيّد الاحتيالي. وهما غير قابلين للاستبدال.
تستدعي أمثلة استعلامات Power BI أدناه المسارات التشغيلية
(
/v1/simulations، /v1/simulations/{id}/results، /v1/activities،
/v1/entities). وبالنسبة إلى إعداد تقارير التصيّد الاحتيالي لكل شخص، يُفضّل استخدام عائلة
إعداد التقارير المعاينة الواردة أدناه. لا يمكن لمفتاح مُنح reporting:read فقط
استدعاء /v1/simulation_results التشغيلي (تعيد واجهة API الرمز 403).
مقياس الصعوبة
صعوبة المحاكاة عدد صحيح من 1 إلى 5 في/v1/simulations (difficulty_level)،
و/v1/simulation_results (difficulty_level)، وخصائص /v1/activities
(difficulty_tier)، و/v1/reporting/simulation_events (difficulty_tier).
1 هي الأسهل و5 هي الأصعب. لا تملك المحاكاات التكيفية والتدريجية
قيمة واحدة على مستوى الحملة، لذا تكون /v1/simulations.difficulty_level هي null
بينما يمكن أن تظل difficulty_level لكل مستلم في النتائج محددة. وللمطابقة مع
صادرات منخفض/متوسط/مرتفع القديمة، اعتبر 1–2 منخفضة، و3 متوسطة، و4–5
مرتفعة.
نمط الاتصال (Power Query)
تستند كل استعلامات المثال إلى أربع قواعد. وتفرض خدمة Power BI كلًّا منها، وليست مجرد تفضيلات أسلوبية.أبقِ عنوان URL الأساسي في Web.Contents ثابتًا وأنهِه عند /v1
أبقِ عنوان URL الأساسي في Web.Contents ثابتًا وأنهِه عند /v1
ضع كل ما هو ديناميكي في
RelativePath وQuery. يجب أن يكون الوسيط الأول في
Web.Contents سلسلة نصية حرفية تنتهي عند جذر /v1
الإقليمي للمؤسسة:- الولايات المتحدة:
https://api.us-east-1.livingsecurity.ai/v1 - الاتحاد الأوروبي:
https://api.eu-west-1.livingsecurity.ai/v1
"simulations" وليس
"v1/simulations"). لا تلصق مضيف الولايات المتحدة لمؤسسة في الاتحاد الأوروبي.إذا بُني الوسيط الأول بدمج السلاسل النصية، فلن تتمكن خدمة Power BI
من تحديد مصدر البيانات بشكل ثابت، وسيفشل التحديث المجدول بخطأ
“مصدر بيانات ديناميكي”، حتى لو عمل الاستعلام في Power BI
Desktop.وفّر مفتاح API كبيانات اعتماد Basic مخزّنة، وليس في نص الاستعلام
وفّر مفتاح API كبيانات اعتماد Basic مخزّنة، وليس في نص الاستعلام
عندما يطلب Power BI بيانات الاعتماد لمصدر بيانات
/v1، اختر
Basic والصق مفتاح API في حقل اسم المستخدم. وضع قيمة بديلة مثل
x في حقل كلمة المرور. ترفض خدمة Power BI كلمة المرور الفارغة
حتى لو تجاهلت واجهة API هذا الحقل. ويعمل أيضًا وضع المفتاح في كلمة المرور مع
اسم مستخدم بديل.لا تضف ترويسة Authorization في M. فهي تعمل على جهازك المكتبي، ثم
تدمج المفتاح في ملف الاستعلام وتتعارض مع التحديث المجدول.دع اختبار الاتصال في مربع حوار بيانات الاعتماد يعمل
دع اختبار الاتصال في مربع حوار بيانات الاعتماد يعمل
GET /v1 يتطلب مصادقة: فهو يعيد 200 مع مفتاح صالح و401
بدونه. وجّه مصدر البيانات إلى …/v1 ولا تتخطَّ الاختبار —
فالمفتاح الصالح يُحفظ، أما المفتاح الملغى أو المشوّه فيفشل فورًا.كانت الأمثلة الأقدم تستخدم المضيف المجرد كمصدر بيانات وتطلب منك تخطي
الاختبار لأن GET / تعيد دائمًا 404. أعد توجيه تلك النماذج إلى …/v1.عيّن limit=500 صراحةً في كل استعلام قائمة
عيّن limit=500 صراحةً في كل استعلام قائمة
حجم الصفحة الافتراضي في كل نقطة نهاية قائمة في
/v1 هو 25. ويؤدي إبقاؤه
على الوضع الافتراضي إلى مضاعفة عدد الطلبات للبيانات نفسها. يجب أن تكون قيم الاستعلام نصية —
limit = "500" في M، وليس limit = 500.دالة ترقيم الصفحات المشتركة
يستدعي كل استعلام في المثالFn_FetchAll واحدة تمرّ على
next_page_token إلى أن يصبح null (راجع
ترقيم الصفحات). وفيما يلي خصائصها البارزة:
- عنوان URL أساسي ثابت لـ
/v1، وRelativePathوQueryديناميكيان. مطلوب للتحديث المجدول ولاختبار بيانات الاعتماد. ManualStatusHandling = {429}مع إعادة محاولة محدودة. تقرأ الدالةRetry-Afterعندما يتيحها Power Query، وإلا تنتظر 30 ثانية، وتتوقف بعد 5 استجابات429متتالية مع خطأ صريح بدلًا من الدوران حتى تنتهي مهلة التحديث. ولا تُعاد محاولة5xxعمدًا — إذ ينبغي أن يظهر خطأ الخادم، لا أن ينتج بصمت مجموعة بيانات جزئية.Timeoutمدتها 60 ثانية. تستجيب الصفحات عادةً في أقل بكثير من ثانية، لذا فإن دقيقة من الصمت تعني أن الطلب قد توقف.Binary.BufferقبلJson.Document. فمن دون التخزين المؤقت، قد يعيد محرك mashup طلب تدفق الاستجابة إذا قرأه أكثر من مرة.- يُمرَّر
baseQueryدون تغيير في كل تكرار. رموز الصفحات هي مؤشرات معتمة وموقّعة مرتبطة بالمؤسسة وبيانات الاعتماد وإصدار العقد وبصمة المرشحات والفرز. ويُرفض تغيير مرشح أثناء القراءة باعتباره رمزًا غير صالح بدلًا من إعادة البدء من الصفحة الأولى.
Fn_FetchAll.pq — base and call shape
استعلامات مصنّفة لكل نقطة نهاية
يتبع كل مستهلك لـFn_FetchAll الشكل نفسه: استدعاء نقطة النهاية،
وإسقاط قائمة أعمدة ثابتة، وحذف المميِّز object، وتصنيف
الطوابع الزمنية بالنوع datetimezone حتى لا تنزاح مقاييس التاريخ بصمت بسبب
المنطقة الزمنية لسعة التحديث.
Excel
يعمل Power Query (M) نفسه في Get & Transform في Excel — فهو المحرك نفسه الموجود في Power BI Desktop. استخدم هذا عندما تريد جدولًا في ورقة عمل بدلًا من نموذج دلالي. في Excel لنظام Windows (Microsoft 365 أو Excel 2024 أو 2021 أو 2019 أو 2016):- Data → Get Data → From Other Sources → Blank Query.
- في Power Query Editor، اختر الرئيسية → محرر متقدم. الصق
Fn_FetchAllأولًا، ثم أعد تسمية ذلك الاستعلام إلىFn_FetchAll(Query Settings → Name، أو انقر بزر الماوس الأيمن في جزء Queries → Rename). - كرّر ذلك مع
Fn_GetJson، ثم مع كل استعلام تقرير. - يفتح Home → Close & Load → Close & Load To… مربع الحوار Import Data.
اختر Only Create Connection لـ
Fn_FetchAllوFn_GetJson(فهما دالتان وليستا جدولين). واختر Table لكل استعلام تقرير تريده في ورقة عمل. - عند أول تحديث، اختر Basic: مفتاح API في User name، وقيمة
بديلة مثل
xفي Password. يخزّن Excel بيانات اعتماد واحدة لكل عنوان URL لمصدر بيانات؛ وتعيد الاستعلامات اللاحقة التي تصل إلى مضيف/v1نفسه استخدامها.
قد يكون Close & Load To… معطّلًا عند إنشاء أول استعلام في
مصنف. استخدم Close & Load، ثم في Excel اختر Data →
Queries & Connections، وانقر بزر الماوس الأيمن على الاستعلام، واختر Load To.
وقد وثّقت Microsoft هذا المسار لهذه الحالة.
Living-Security-Version من Power Query على مصدر
مصادَق عليه — وهو القيد نفسه في Power BI. ثبّت حساب الخدمة أو مرّر api_version في سجل
الاستعلام. راجع
إصدارات العقد وبيانات الاعتماد المخزّنة.
استعلامات تقارير جاهزة (تعيينات الأعمدة والاختلافات عن تصدير
مزوّد سابق):
الامتثال لكل شخص
تسجيلات التدريب على مستوى الشخص × التكليف.
سجل التصيّد الاحتيالي عبر البريد الإلكتروني
تفاعلات التصيّد الاحتيالي على مستوى الحدث، خلال آخر 12 شهرًا.
المستخدمون الأكثر عرضة للاختراق
ملخص لكل شخص خلال 12 شهرًا للنقرات وبيانات الاعتماد والإبلاغ.
مجموعات بيانات إعداد التقارير المعاينة (التصيّد الاحتيالي لكل شخص)
توفّر عائلة إعداد التقارير المعاينة مجموعات بيانات للتصيّد الاحتيالي لكل شخص. وتتطلبreporting:read وصولًا إلى إعداد التقارير لمؤسستك.
استخدم كتالوج مجموعات البيانات أدناه لفحص مخططاتها وسياسات بياناتها.
اكتشف الكتالوج الفعلي:
simulation_results
- المسار:
GET /v1/reporting/simulation_results - مستوى التفصيل: كيان × محاكاة
- المرشحات:
simulationوentityوupdated_after، بالإضافة إلىlimit/page_token - كائن الإرسال:
reporting.simulation_result - مفاتيح الربط:
entity_id،simulation_id
ReportingSimulationResults.pq (sketch)
updated_after كحد أدنى شامل للعلامة المائية عند تحديث الأقسام
الحديثة. تُعاد صياغة أبعاد النتائج القابلة للتغيير في مكانها تحت id نفسه.
simulation_events
- المسار:
GET /v1/reporting/simulation_events - مستوى التفصيل: واقعة مصنّفة واحدة لكل تفاعل مرصود
- المرشحات:
simulationوentityوevent_typeوoccurred_after، بالإضافة إلىlimit/page_token - كائن الإرسال:
reporting.simulation_event - أنواع الأحداث: رموز عامة مغلقة مثل
simulation.deliveredوsimulation.openedوsimulation.link_clickedوsimulation.credentials_submittedوsimulation.reported— وليست أنواع أنشطة ClickHousephishing.simulation.*الخام - الجهاز:
device_typeهو الفئة المشتقة (تشمل الرموز المرصودةdesktopوmobileوtabletوunknown).user_agentالخام غير موجود على/v1. ولا يوجد عنوان IP الخام أبدًا على/v1(لا يُحفظ أبدًا؛ip_hashالمملّح فقط).
ReportingSimulationEvents.pq (sketch)
occurred_after لعمليات تحميل الأحداث التزايدية. الوقائع للإلحاق فقط؛
والوصولات المتأخرة تكون صفوفًا جديدة.
entities
- المسار:
GET /v1/reporting/entities - مستوى التفصيل: صف حالي واحد لكل كيان
- المرشحات:
typeوupdated_after، بالإضافة إلىlimit/page_token - كائن الإرسال:
reporting.entity - مفتاح الربط:
id/entity_id(القيمة نفسها)
reporting.simulation_results.entity_id = reporting.entities.id.
يبقى GET /v1/entities التشغيلي على entity:read وهو إذن مختلف.
ReportingEntities.pq
entity_versions وcohort_memberships
تتضمن مجموعتا البيانات هاتان استثناءً مسمًّى يقتصر على الوضع الحالي:لا يوجد جدول موثوق لسجل الإصدارات أو العضويات. تعرض مجموعة البيانات هذه الصف الحالي كفترة واحدة مفتوحة النهاية (valid_toفارغة، وis_currentصحيحة).valid_fromهيcreated_atأوupdated_atبخلاف ذلك لإصدارات الكيانات، ووقت رصد الطلب لعضويات المجموعة. لا تُختلق فترات تاريخية مغلقة.
- entity_versions:
GET /v1/reporting/entity_versions. المرشحات نفسها لـ entities.valid_fromهيcreated_atأوupdated_atبخلاف ذلك. ويُستبعد الكيان الذي يكون كلا طابعيه الزمنيين فارغًا. - cohort_memberships:
GET /v1/reporting/cohort_memberships. المرشحات:cohortوentityوupdated_after.updated_atهو آخر تحديث للمجموعة حتى يبقى التحديث التزايدي دقيقًا.valid_fromهو وقت رصد الطلب. اربطentity_idبـreporting.entities.id.
ReportingEntityVersions.pq
ReportingCohortMemberships.pq
نموذج دلالي بمخطط نجمي على /v1/activities
/v1/activities هو تدفق الأحداث ذات الطوابع الزمنية للمؤسسة. وليس له
مقاييس رقمية — فكل كمية في التقرير هي عدد صفوف — مما يجعل المخطط
النجمي ملائمًا بطبيعته.
Activitiesهو جدول وقائع الأحداث بمستوى التفصيل الحقيقي. صف واحد لكل نشاط. تُحذف المشاركات هنا وتُعاد بناؤها كجدول مستقل.ActivityParticipantsموجود لأن المشاركين علاقة واحد إلى متعدد فعلًا، بأدوار مثلactorوtarget. إن التسطيح علىActivitiesسيؤدي إما إلى تكرار صفوف الأنشطة (مما يضخّم كل عدّ) أو إلى إسقاط المشاركين الإضافيين. والعلاقة معActivitiesهي العلاقة الوحيدة ثنائية الاتجاه في النموذج، بحيث تصل شريحة الكيان إلى جدول الوقائع.Entitiesهو البُعد الذي يسمّي المشاركين. تحمل صفوف المشاركين في النشاطentity_idودورًا لكن لا تحمل اسم عرض.Datesيُنشأ في M (دون أي استدعاء لواجهة API) ويُعلَّم كجدول التاريخ في النموذج. وهذا ما يجعل التحليلات الزمنية في DAX (DATESINPERIOD،DATEADD) مشروعة. وتعلن أعمدة اسم الشهر واليومsortByColumnعلى نظيراتها الرقمية حتى لا ترتب العناصر المرئية الأشهر أبجديًا.
discourageImplicitMeasures): إجمالي
الأنشطة، والكيانات النشطة، والأنشطة لكل كيان نشط، وأيام النشاط،
ومتوسط يومي لآخر 7 أيام.
شكل جدول الربط
يمرّActivityParticipants على /v1/activities ويفكّك مصفوفة participants
إلى صف واحد لكل مشارك:
ActivityParticipants.pq
ActivityParticipants على /v1/activities بشكل مستقل بدلًا من
الإشارة إلى استعلام Activities. في Power BI، يجلب كل استعلامين محمَّلين كجدولين
بياناتهما بشكل مستقل وقت التحديث. وإبقاؤهما مستقلين
يتيح للخدمة تحديث أقسام الجدولين بالتوازي.
التحديث التزايدي
يعلن كلا الجدولين على مستوى الوقائع (Activities وActivityParticipants)
سياسة تحديث تزايدي في Power BI: الاحتفاظ بخمس سنوات من الأقسام السنوية،
وإعادة استيراد آخر 14 يومًا عند كل تحديث.
الآلية هي زوج من معاملات DateTime، RangeStart وRangeEnd،
تعيد خدمة Power BI ربطهما لكل قسم وقت التحديث. ويدمج كل استعلام وقائع هذه المعاملات في مرشحَي
start_date وend_date في واجهة API، بحيث يتناسب حجم الطلبات على مستوى القسم مع القسم،
وليس مع السجل التاريخي الكامل. ويوسّع الاستعلام نافذة API بدقيقة
من كل جانب ويعيد تطبيق حد [RangeStart, RangeEnd) نصف المفتوح الدقيق
محليًا، بحيث لا تعتمد صحة الأقسام على ما إذا كان الخادم
يعامل حدوده كشاملة أم حصرية.
Activities.pq — the fold that makes incremental refresh work
نافذة الـ 14 يومًا سخية عمدًا. فاستيعاب الأنشطة ليس للإلحاق فقط عند
اللحظة الحالية: إذ تضيف عمليات الملء الرجعي للموصّلات أحداثًا بطوابع زمنية ماضية.
ونافذة من يوم إلى يومين ستُفوّت هذه الأحداث بصورة دائمة.
توسيع نافذة التحديث داخل واجهة API
يقبلGET /v1/activities المرشحين start_date وend_date اللذين تُدمج فيهما
معاملات Power BI، ويرشّح event_ts بين الحدين.
Entities هو بُعد، ولذلك يحدّثه هذا المثال بالكامل في كل مرة
بدلًا من التحديث التزايدي.
تستخدم مجموعات بيانات إعداد التقارير علاماتها المائية الخاصة (updated_after،
occurred_after) بدلًا من نافذة تاريخ الأنشطة.
حدود المعدل أثناء التحديث
يفرض/v1 ميزانيات منفصلة لكل مفتاح ولكل عنوان IP (راجع
حدود المعدل). التزم بـ 429 + Retry-After؛ ولا
تضمّن ميزانية طلبات ثابتة في نموذجك. وهناك خاصيتان في تحديثات Power BI
لهما أهمية:
- القراءة الكاملة لجدول واحد تتم تسلسليًا. يحتاج كل طلب صفحة إلى رمز الصفحة السابقة، لذا يكون الجدول الواحد محكومًا بزمن الاستجابة بغض النظر عن حجم الصفحة.
- تحديثات الجداول المتزامنة تتضاعف. إن تحديث عدة جداول كبيرة
بالتوازي هو الحالة التي تبلغ السقف، ولهذا يهم مسار إعادة محاولة 429
في
Fn_FetchAll. فضّل عددًا أقل من الجداول المتوازية بدلًا من افتراض تزامن غير محدود.
إصدارات العقد وبيانات الاعتماد المخزّنة
يقبل/v1 ترويسة الطلب Living-Security-Version لتثبيت إصدار عقد منشور
(راجع البدء السريع لواجهة API). لا يستطيع Power
Query إرسال تلك الترويسة عندما يستخدم مصدر البيانات بيانات اعتماد مخزّنة —
إذ تسمح مصادر البيانات المجهولة فقط بترويسات مخصصة. ويؤدي إضافتها إلى فشل التحديث
بالخطأ:
contract_version المثبّت لحساب الخدمة،
أو أحدث إصدار منشور إذا لم يكن هناك تثبيت.
أكّد إصدار عقد الحساب مع مسؤول API لديك قبل
نشر التحديث. راجع سجل تغييرات API للاطلاع على
الإصدارات المدعومة.
إذا بدأ التحديث يتصرف بشكل غير متوقع، فافحص ترويسة استجابة API
Living-Security-Version لمعرفة أي عقد
خدم الطلب فعليًا.
تحديث النموذج والتحقق منه
انشر النموذج الدلالي إلى مساحة عمل Power BI، واربط بيانات اعتماده المخزّنة بمصدر/v1 الإقليمي، ثم شغّل تحديثًا قبل تفعيل
الجدولة. راجع سجل التحديث بحثًا عن حالات الفشل أو القراءات غير المكتملة.
تحقق من أعداد الصفوف مقابل قراءة مستقلة من API باستخدام المرشحات نفسها.
يتضمن دليل ترقيم الصفحات أمثلة Python وcURL
لقراءة مجموعة نتائج كاملة. قد يبدو التحديث الذي يقرأ الصفحة الأولى فقط
ناجحًا على مجموعة بيانات صغيرة؛ لذا قارن الأعداد قبل
الاعتماد على التقرير.
خيارات النموذج
- لإجماليات الحملات والنتائج لكل شخص مستويا تفصيل مختلفان.
يستدعي
SimulationResultsGET /v1/simulations/{id}/results(طلب GET واحد لكل تشغيل). وبالنسبة إلى التصيّد الاحتيالي لكل شخص، أضف استعلامات لـGET /v1/reporting/simulation_resultsوGET /v1/reporting/simulation_events(أوGET /v1/simulation_resultsالتشغيلي إذا كنت تملكsimulation:readبالفعل). vectorsفي/v1/simulationsمسطّح إلى سلسلة نصية مفصولة بفواصل. ولا يمكن تقطيع عمود من نوع قائمة كبُعد حقيقي. إذا احتاجت صفحة تقرير إلى الترشيح حسب المتجه، فأضف جدول ربط بين المحاكاة والمتجه.
الخطوات التالية
Developer Hub
أنشئ حساب خدمة ومفتاح API لـ Power BI.
البدء السريع لواجهة API
صادِق على طلبات
/v1 باستخدام مصادقة Basic.ترقيم الصفحات
غلاف القائمة، ورموز المؤشر، وثبات المرشحات عبر القراءة.
حدود المعدل
ميزانيات كل مفتاح وكل عنوان IP، وعقد 429، وإرشادات إعادة المحاولة.

