البدء السريع لتنفيذ مساحة التخزين المشتركة والتجميع الخاص

هذا المستند هو دليل بدء سريع لاستخدام "مساحة التخزين المشتركة" و"المساحات الخاصة" التجميع. وستحتاج إلى فهم كلتا الواجهتين لأنّ مساحة التخزين المشتركة تخزن القيم وتنشئ التجميع الخاص التقارير القابلة للتجميع.

الجمهور المستهدَف: مزوّدو تقنيات الإعلان ومزوّدي القياس

النسخة التجريبية

جرِّب العرض التوضيحي المباشر. اتّبِع الخطوات. في التعليمات التوضيحية لتفعيل واجهات برمجة تطبيقات "مبادرة حماية الخصوصية" فتح Chrome تساعدك "أدوات مطوري البرامج" في عرض نتائج حالات الاستخدام المختلفة. حالات الاستخدام المتوفرة في العرض التوضيحي:

  • تجميع خاص
    • قياس مدى الوصول الفريد
    • قياس الخصائص الديمغرافية
    • قياس التردد K+
  • الاستخدام العام
    • قياس حدث التمرير فوق الإطارات داخل إطارات محاطة بحدود
    • التنقّل في المستوى الأعلى
    • التحكم في الأماكن التي يمكن للجهات الخارجية الكتابة فيها

كيفية الاطّلاع على مساحة التخزين المشتركة

يمكنك استخدام "أدوات مطوري البرامج في Chrome" لعرض المعلومات التي يتم تخزينها في "مساحة التخزين المشتركة". يمكن للبيانات المخزنة في Application -> Shared Storage.

يمكنك الاطّلاع على البيانات المخزَّنة في مساحة التخزين المشتركة باستخدام "أدوات مطوري البرامج في Chrome".

عرض تقارير التجميع الخاص

لعرض التقارير القابلة للتجميع التي تم إرسالها، انتقل إلى chrome://private-aggregation-internals عند تفعيل وضع تصحيح الأخطاء، يظهر تقرير على الفور (دون تأخير) إلى [[YOUR_ORIGIN]]/.well-known/private-aggregation/debug/report-shared-storage مع التقرير المتأخر زمنيًا ليتم إرساله إلى [[YOUR_ORIGIN]]/.well-known/private-aggregation/report-shared-storage

لتفعيل تصحيح الأخطاء، اتّبِع التعليمات الواردة في صفحة تصحيح الأخطاء. .

عرض التقارير في chrome://private-aggregation-internals

Shared Storage API

لمنع التتبع عبر المواقع، بدأت المتصفحات في تقسيم جميع أشكال التخزين، بما في ذلك التخزين المحلي وملفات تعريف الارتباط وغير ذلك. ولكن هناك حالات استخدام التي تتطلب مساحة تخزين غير مقسَّمة. توفر واجهة برمجة تطبيقات مساحة التخزين المشتركة وصول غير محدود للكتابة إلى مختلف المواقع الإلكترونية عالية المستوى مع الحفاظ على الخصوصية الإذن بالقراءة

تقتصر مساحة التخزين المشتركة على مصدر السياق (متصل sharedStorage).

هناك حدّ أقصى لسعة التخزين المشتركة لكل مصدر، ويقتصر كل إدخال على الحد الأقصى لعدد الأحرف. وفي حال بلوغ هذا الحدّ، لن يتم إدخال المزيد من الإدخالات تخزين البيانات. يتم توضيح حدود تخزين البيانات في قسم مساحة التخزين المشتركة التطبيق.

استدعاء مساحة التخزين المشتركة

يمكن لتقنيات الإعلانات الكتابة إلى مساحة التخزين المشتركة باستخدام JavaScript أو عناوين الاستجابة. لا تتم القراءة من مساحة التخزين المشتركة إلا في ملف JavaScript معزول. بيئة تسمى الوظيفة الصغيرة.

  • استخدام JavaScript بإمكان تقنيات الإعلانات على تنفيذ وظائف محددة لمساحة التخزين المشتركة مثل ضبط القيم وإلحاقها وحذفها خارج JavaScript الوظيفة. ومع ذلك، فإن وظائف مثل قراءة مساحة التخزين المشتركة وتنفيذ يجب إكمال التجميع الخاص من خلال برنامج JavaScript صغير. يمكن العثور على الطرق التي يمكن استخدامها خارج إطار عمل JavaScript في السطح المقترَح لواجهة برمجة التطبيقات: خارج الوظيفة.

    يمكن العثور على الطرق المستخدمة في الوظيفة المصغّرة أثناء العملية في سطح واجهة برمجة التطبيقات المقترح: في الوظيفة.

  • استخدام عناوين الردود

    فعلى غرار JavaScript، تُستخدَم دوال محددة فقط، مثل الإعداد والإلحاق ويمكن حذف القيم في مساحة التخزين المشتركة باستخدام عناوين الردود. إلى استخدام "مساحة التخزين المشتركة" في عنوان الردّ، "Shared-Storage-Writable: ?1" يجب تضمينه في عنوان الطلب.

    لبدء طلب من العميل، شغّل التعليمة البرمجية التالية، اعتمادًا على الطريقة التي اخترتها وهي:

    • جارٍ استخدام fetch()
        fetch("https://a.example/path/for/updates", {sharedStorageWritable: true});
    
    • استخدام العلامة iframe أو img
        <iframe src="https://a.example/path/for/updates" sharedstoragewritable></iframe>
    
    • استخدام سمة IDL مع علامة iframe أو img
        let iframe = document.getElementById("my-iframe");
        iframe.sharedStorageWritable = true;
        iframe.src = "https://a.example/path/for/updates";
    

يمكن العثور على مزيد من المعلومات في مساحة التخزين المشتركة: الرد العناوين:

الكتابة في مساحة التخزين المشتركة

للكتابة إلى مساحة التخزين المشتركة، يُرجى الاتصال بـ sharedStorage.set() من داخل أو خارج وظيفة محدودة لـ JavaScript. إذا تم استدعاؤها من خارج الوظيفة الصغيرة، فستتم كتابة البيانات إلى أصل سياق التصفح الذي تم إجراء الاتصال منه. في حال الاتصال من داخل الوظيفة المصغّرة، تتم كتابة البيانات على مصدر سياق التصفح الذي حمّل الوظيفة الصغيرة. تاريخ انتهاء صلاحية المفاتيح التي تم ضبطها هو 30 يوم من آخر تحديث.

الحقل ignoreIfPresent اختياري. في حال توفُّرها وضبطها على true، مفتاح إذا كان موجودًا بالفعل. يتم تجديد صلاحية المفتاح لمدة 30 يومًا من طلب set() حتى إذا لم يتم تعديل المفتاح.

إذا تم الوصول إلى "مساحة التخزين المشتركة" عدة مرات في الصفحة نفسها، تم تحميل الصفحة يتم استبدال قيمة المفتاح. إنها لفكرة جيدة أن تستخدم sharedStorage.append() إذا كان المفتاح يحتاج إلى الحفاظ على القيمة السابقة.

  • استخدام JavaScript

    خارج الوظيفة:

    window.sharedStorage.set('myKey', 'myValue1', { ignoreIfPresent: true });
    // Shared Storage: {'myKey': 'myValue1'}
    window.sharedStorage.set('myKey', 'myValue2', { ignoreIfPresent: true });
    // Shared Storage: {'myKey': 'myValue1'}
    window.sharedStorage.set('myKey', 'myValue2', { ignoreIfPresent: false });
    // Shared Storage: {'myKey': 'myValue2'}
    

    وبالمثل، داخل الوظيفة المصغّرة:

    sharedStorage.set('myKey', 'myValue1', { ignoreIfPresent: true });
    
  • استخدام عناوين الردود

    يمكنك أيضًا الكتابة إلى مساحة التخزين المشتركة باستخدام عناوين الردود. للقيام بذلك، استخدم Shared-Storage-Write في عنوان الاستجابة بالإضافة إلى ما يلي الأوامر:

    Shared-Storage-Write : set;key="myKey";value="myValue";ignore_if_present
    
    Shared-Storage-Write : set;key="myKey";value="myValue";ignore_if_present=?0
    

    يمكن فصل العناصر المتعددة بفواصل، ويمكن أن تضم set وappend delete، وclear.

    Shared-Storage-Write :
    set;key="hello";value="world";ignore_if_present, set;key="good";value="bye"
    

إلحاق قيمة

يمكنك إلحاق قيمة بمفتاح حالي باستخدام الطريقة append. إذا لم يكن المفتاح غير موجود، يؤدي استدعاء append() إلى إنشاء المفتاح وتعيين القيمة. يمكن أن باستخدام JavaScript أو عناوين الاستجابة.

  • استخدام JavaScript

    لتعديل قيم المفاتيح الحالية، استخدِم sharedStorage.append() من أي مما يلي: داخل أو خارج الوظيفة الصغيرة.

    window.sharedStorage.append('myKey', 'myValue1');
    // Shared Storage: {'myKey': 'myValue1'}
    window.sharedStorage.append('myKey', 'myValue2');
    // Shared Storage: {'myKey': 'myValue1myValue2'}
    window.sharedStorage.append('anotherKey', 'hello');
    // Shared Storage: {'myKey': 'myValue1myValue2', 'anotherKey': 'hello'}
    

    لإلحاق داخل الوظيفة المصغّرة:

    sharedStorage.append('myKey', 'myValue1');
    
  • استخدام عناوين الردود

    مثلما هو الحال مع تعيين قيمة في مساحة التخزين المشتركة، يمكنك استخدام Shared-Storage-Write في عنوان الاستجابة لتمرير زوج المفتاح/القيمة.

    Shared-Storage-Write : append;key="myKey";value="myValue2"
    

القراءة من مساحة التخزين المشتركة

يمكنك القراءة من مساحة التخزين المشتركة فقط من داخل الوظيفة الصغيرة.

await sharedStorage.get('mykey');

أصل سياق التصفح الذي تم تحميل وحدة العمل الصغير منه المستخدم الذي تتم قراءة مساحة التخزين المشتركة له.

جارٍ الحذف من مساحة التخزين المشتركة

يمكنك تنفيذ عمليات الحذف من "مساحة التخزين المشتركة" باستخدام JavaScript من الداخل. أو خارج الوظيفة المصغّرة أو باستخدام عناوين الاستجابة مع delete() للحذف جميع المفاتيح في آنٍ واحد، استخدِم clear() من أي منهما.

  • استخدام JavaScript

    للحذف من "مساحة التخزين المشتركة" خارج التطبيق الصغير، اتّبِع الخطوات التالية:

    window.sharedStorage.delete('myKey');
    

    للحذف من "مساحة التخزين المشتركة" من داخل التطبيق الصغير، اتّبِع الخطوات التالية:

    sharedStorage.delete('myKey');
    

    لحذف جميع المفاتيح مرة واحدة من خارج الوظيفة المصغّرة:

    window.sharedStorage.clear();
    

    لحذف جميع المفاتيح مرة واحدة من داخل الوظيفة المصغّرة:

    sharedStorage.clear();
    
  • استخدام عناوين الردود

    لحذف القيم باستخدام عناوين الردود، يمكنك أيضًا استخدام Shared-Storage-Write في عنوان الاستجابة لتمرير المفتاح المطلوب حذفه.

    delete;key="myKey"
    

    لحذف جميع المفاتيح باستخدام عناوين الردود:

    clear;
    

تبديل السياق

تتم كتابة بيانات مساحة التخزين المشتركة في المصدر (على سبيل المثال، https://example.adtech.com) من سياق التصفح الذي يمثله التي نشأت منها.

عند تحميل الرمز البرمجي التابع لجهة خارجية باستخدام علامة <script>، يتم تنفيذ الرمز. في سياق التصفح الخاص ببرنامج التضمين. لذلك، عندما يتم نسخ رمز الجهة الخارجية يستدعي sharedStorage.set()، تتم كتابة البيانات في القائمة المشتركة الخاصة بأداة التضمين مساحة التخزين: عند تحميل رمز الجهة الخارجية في إطار iframe، تتلقى التعليمة البرمجية سياق تصفح جديد، وأصله هو أصل iframe. ولذلك، يخزِّن استدعاء sharedStorage.set() الذي يتم إجراؤه من إطار iframe البيانات في مساحة التخزين المشتركة لأصل إطار iframe

سياق الطرف الأول

إذا كانت صفحة الطرف الأول تتضمن رمز JavaScript تابعًا لجهة خارجية، والذي يستدعي sharedStorage.set() أو sharedStorage.delete()، تم تخزين زوج المفتاح/القيمة. في سياق الطرف الأول

يشير ذلك المصطلح إلى البيانات المخزَّنة في صفحة الطرف الأول مع تضمين JavaScript من جهة خارجية.

سياق الطرف الثالث

يمكن تخزين زوج المفتاح/القيمة في تقنية الإعلان أو سياق تابع لجهة خارجية من خلال إنشاء إطار iframe وطلب set() أو delete() في رمز JavaScript من داخل iframe.

البيانات المخزَّنة في تقنية الإعلان أو سياق تابع لجهة خارجية

Private Aggregation API

لقياس البيانات القابلة للتجميع المخزنة في مساحة التخزين المشتركة، يمكنك استخدام خاصية واجهة برمجة التطبيقات للتجميع.

لإنشاء تقرير، يمكنك الاتصال بـ contributeToHistogram() داخل وظيفة صغيرة تتضمن مجموعة البيانات والقيمة. يتم تمثيل المجموعة بعدد صحيح 128 بت غير بعلامة إلى الدالة باعتبارها BigInt. القيمة هي عدد صحيح موجب.

لحماية الخصوصية، فإنّ حمولة التقرير، التي تحتوي على الحزمة والقيمة، يتم تشفيرها أثناء نقلها، ولا يمكن فك تشفيرها وتجميعها إلا باستخدام خدمة تجميع البيانات

سيحدّ المتصفّح أيضًا من المساهمات التي يمكن لموقع إلكتروني تقديمها في النتائج طلب البحث. وعلى وجه التحديد، ستتضمّن المساهمة الميزانية إلى إجمالي جميع التقارير من موقع إلكتروني واحد لمتصفّح معيّن في فترة زمنية محددة عبر جميع المجموعات. في حالة تجاوز الميزانية الحالية، لن يتم إنشاء التقرير.

privateAggregation.contributeToHistogram({
  bucket: BigInt(myBucket),
  value: parseInt(myBucketValue)
});

تنفيذ مساحة التخزين المشتركة والتجميع الخاص

استخدام إطار iframe متعدد المصادر

هناك حاجة إلى إطار iframe لاستدعاء وظيفة التخزين المشتركة.

في إطار iframe للإعلان، حمِّل وحدة الوظيفة المصغّرة عن طريق طلب addModule(). لتشغيل المُسجّلة في ملف العمل sharedStorageWorklet.js، في نفس JavaScript لإطار iframe للإعلان، طلب sharedStorage.run().

await window.sharedStorage.worklet.addModule('modules/sharedStorageWorklet.js');
await window.sharedStorage.worklet.run('shared-storage-report', {
  data: { campaignId: '1234' },
});

في هذا النص البرمجي، عليك إنشاء صف يتضمّن قيمة run غير متزامنة. . وregister مطلوب تشغيل هذه الفئة في إطار iframe للإعلان. داخل المنشأة sharedStorageWorklet.js:

class SharedStorageReportOperation {
  async run(data) {
    // Other code goes here.
    bucket = getBucket(...);
    value = getValue(...);
    privateAggregation.contributeToHistogram({
      bucket: bucket,
      value: value
    });
  }
}
register('shared-storage-report',
  SharedStorageReportOperation);

استخدام طلب من مصدر خارجي

"مساحة التخزين المشتركة" و"التجميع الخاص" يسمحان بإنشاء أدوات عمل متعددة المصادر بدون الحاجة إلى إطارات iframe من مصادر متعددة

يمكن أن تستدعي صفحة الطرف الأول استدعاء createWorklet() إلى المصدر المشترك. نقطة نهاية JavaScript.

async function crossOriginCall() {
  let privateAggregationWorklet = await sharedStorage.createWorklet(
    'https://cross-origin.dev/js/worklet.js',
  );
  await privateAggregationWorklet.run('pa-worklet');
}
crossOriginCall();

يجب أن تستجيب نقطة نهاية JavaScript من مصادر متعددة باستخدام العناوين Shared-Storage-Cross-Origin-Worklet-Allowed والسماح بالوصول من مصادر متعددة باستخدام Access-Control-Allow-Origin

Shared-Storage-Cross-Origin-Worklet-Allowed : ?1
Access-Control-Allow-Origin : https://first-party.dev

إنّ الوظائف الصغيرة التي يتم إنشاؤها باستخدام createWorklet() ستتضمّن selectURL وrun(). addModule() غير متاح لهذا الغرض.

class CrossOriginWorklet {
  async run(data){
    // Other code goes here.
    bucket = getBucket(...);
    value = getValue(...);
    privateAggregation.contributeToHistogram({
      bucket: bucket,
      value: value
    });
  }
}

تصحيح الأخطاء

لتفعيل تصحيح الأخطاء، يمكنك استدعاء طريقة JavaScript enableDebugMode() في أي سياق يتم فيه استخدام مساحة التخزين المشتركة والتجميع الخاص. سيكون هذا تطبيقه على التقارير المستقبلية في السياق نفسه.

privateAggregation.enableDebugMode();

لربط التقارير بالسياقات التي أدت إلى ظهورها، يمكنك إعداد مفتاح تصحيح أخطاء العدد الصحيح غير الموقَّع 64 بت الذي يتم تمريره إلى استدعاء JavaScript. تشير رسالة الأشكال البيانية debugKey هو BigInt.

privateAggregation.enableDebugMode({debugKey: 1234});

تصحيح أخطاء مساحة التخزين المشتركة

تعرض مساحة التخزين المشتركة رسالة خطأ عامة:

Promise is rejected without and explicit error message

يمكنك تصحيح أخطاء "مساحة التخزين المشتركة" من خلال إنهاء المكالمات باستخدام محاولة استقطاب العملاء مربّعات.

try {
  privateAggregation.contributeToHistogram({bucket, value});
} catch (e){
  console.log(e);
}

تصحيح أخطاء التجميع الخاص

يتم إرسال التقارير إلى /.well-known/private-aggregation/report-shared-storage و /.well-known/private-aggregation/debug/report-shared-storage تقارير تصحيح الأخطاء تلقي حمولة مشابهة لملف JSON التالي. تحدِّد هذه الحمولة بيانات api. باسم "مساحة التخزين المشتركة".

{
   "aggregation_coordinator_origin": "https://publickeyservice.msmt.gcp.privacysandboxservices.com",
   "aggregation_service_payloads": [ {
      "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAAAAgGZidWNrZXRQAAAAAAAAAAAAAAAAB1vNFaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt",
      "key_id": "1569ab37-da44-4a26-80d9-5ed6524ab2a7",
      "payload": "/9nHrWn1MnJWRxFvanbubciWE9mPyIij6uYLi5k351eQCd3/TZpe2knaatUNcniq4a4e61tmKebv50OmMRZFnnCfcAwIdIgLHu1a3en97PojqWJBfO52RiVMIcP7KQTLzMxq2LhvPSdV4zjXo1Teu/JuIK3LIyis3vUMpS+tUAX0QV+I6X5SVmZFiNW9aMb8DwLOtqrBy5JJ/EkOIY0G+1Fi1/3R7UtKsqM1o71A/OzdmlNkwO7EV/VUNinGvWnd19FvDHe/kqkNdTHKbhAnMmbZzHW9bsEQS81leElCla6BTdbdbeeFU/jbTj0AOaoNOIe5r7FU5NG6nW4ULXTCbLLjTQ1mtl3id3IP41Zin1JvABCDC/HUSgLFz8EUqkmbMIOlMfNYA79aURq6FqE0GO0HtICYf0GPNdVv7p4jY3FNn6+JS4l5F3t+3lP9ceo4IpCE+31jzMtYJ+19xFh6C5ufteBR/iknZFcc1w3caQBhgRl5jt8DbaOzYcW4690H8Ul4Oh2wRO+6/njifk+pExLay/O5swLi2lUUph5OUEaaztwwzh2mnhwIBxMkPnfsGihiF+5KDEajVfMZ3NLsIDoZO+l4RTZrkqE+jVkAqaZGBiCIx42Edp/JV0DXfrryypCdQBZr8iEbSzCM9hKsMfLN7S/VkPe5rDwOZbhKCn5XXgfGz5tSx/KbZgsQf4OCEhwAyNPHAh3MHU7xmkQ3pKg4EIUC/WOtKAlVDOtDMmPPoQY1eAwJhw9SxZaYF1kHjUkTm3EnGhgXgOwCRWqeboNenSFaCyp6DbFNI3+ImONMi2oswrrZO+54Tyhca5mnLIiInI+C3SlP4Sv1jFECIUdf/mifJRM5hMj6OChzHf4sEifjqtD4A30c4OzGexWarie2xakdQej9Go4Lm0GZEDBfcAdWLT9HwmpeI2u4HDAblXDvLN8jYFDOOtzOl90oU7AwdhkumUCFLRadXAccXW9SvLfDswRkXMffMJLFqkRKVE1GPonFFtlzaRqp7IgE8L6AOtz6NDcxAjHnEuzDPPMcWMl1AFH0gq7h"
   } ],
   "debug_key": "1234",
   "shared_info": "{\"api\":\"shared-storage\",\"debug_mode\":\"enabled\",\"report_id\":\"80d93c0a-a94e-4ab7-aeb5-a4ecd4bfc598\",\"reporting_origin\":\"https://privacy-sandbox-demos-dsp.dev\",\"scheduled_report_time\":\"1717784740\",\"version\":\"0.1\"}"
}

تصحيح أخطاء حمولة النص الواضح

debug_cleartext_payload هو Base64 بترميز CBOR يمكنك عرض الحزمة باستخدام برنامج فك الترميز أو استخدام رمز JavaScript الموجود في القسم مساحة التخزين المشتركة برنامج فك الترميز.

الخطوات التالية

توضّح الصفحات التالية الجوانب المهمة لمساحة التخزين المشتركة ومساحة التخزين الخاصة. واجهات برمجة التطبيقات للتجميع.

بعد أن تتعرف على واجهات برمجة التطبيقات، يمكنك البدء في جمع التقارير التي يتم إرسالها كطلب POST إلى نقاط النهاية التالية بتنسيق JSON في نص الطلب.

  • تقارير تصحيح الأخطاء - context-origin/.well-known/private-aggregation/debug/report-shared-storage
  • التقارير - context-origin/.well-known/private-aggregation/report-shared-storage

بعد جمع التقارير، يمكنك إجراء اختبار باستخدام الاختبار المحلي الأداة أو إعداد بيئة تنفيذ موثوقة للتجميع الخدمة للحصول على التقارير المجمَّعة

مشاركة ملاحظاتك

يمكنك مشاركة ملاحظاتك حول واجهات برمجة التطبيقات والمستندات على GitHub.