هذا المستند هو دليل بدء سريع لاستخدام "مساحة التخزين المشتركة" و"المساحات الخاصة" التجميع. وستحتاج إلى فهم كلتا الواجهتين لأنّ مساحة التخزين المشتركة تخزن القيم وتنشئ التجميع الخاص التقارير القابلة للتجميع.
الجمهور المستهدَف: مزوّدو تقنيات الإعلان ومزوّدي القياس
النسخة التجريبية
جرِّب العرض التوضيحي المباشر. اتّبِع الخطوات. في التعليمات التوضيحية لتفعيل واجهات برمجة تطبيقات "مبادرة حماية الخصوصية" فتح Chrome تساعدك "أدوات مطوري البرامج" في عرض نتائج حالات الاستخدام المختلفة. حالات الاستخدام المتوفرة في العرض التوضيحي:
- تجميع خاص
- قياس مدى الوصول الفريد
- قياس الخصائص الديمغرافية
- قياس التردد K+
- الاستخدام العام
- قياس حدث التمرير فوق الإطارات داخل إطارات محاطة بحدود
- التنقّل في المستوى الأعلى
- التحكم في الأماكن التي يمكن للجهات الخارجية الكتابة فيها
كيفية الاطّلاع على مساحة التخزين المشتركة
يمكنك استخدام "أدوات مطوري البرامج في Chrome" لعرض المعلومات التي يتم تخزينها في "مساحة التخزين المشتركة". يمكن للبيانات المخزنة
في Application -> Shared Storage
.
عرض تقارير التجميع الخاص
لعرض التقارير القابلة للتجميع التي تم إرسالها، انتقل إلى
chrome://private-aggregation-internals
عند تفعيل وضع تصحيح الأخطاء، يظهر تقرير
على الفور (دون تأخير) إلى
[[YOUR_ORIGIN]]/.well-known/private-aggregation/debug/report-shared-storage
مع التقرير المتأخر زمنيًا ليتم إرساله إلى
[[YOUR_ORIGIN]]/.well-known/private-aggregation/report-shared-storage
لتفعيل تصحيح الأخطاء، اتّبِع التعليمات الواردة في صفحة تصحيح الأخطاء. .
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()
، تم تخزين زوج المفتاح/القيمة.
في سياق الطرف الأول
سياق الطرف الثالث
يمكن تخزين زوج المفتاح/القيمة في تقنية الإعلان أو سياق تابع لجهة خارجية من خلال
إنشاء إطار 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 الموجود في القسم مساحة التخزين المشتركة
برنامج فك الترميز.
الخطوات التالية
توضّح الصفحات التالية الجوانب المهمة لمساحة التخزين المشتركة ومساحة التخزين الخاصة. واجهات برمجة التطبيقات للتجميع.
- مقدّمة عن مساحة التخزين المشتركة (لمطوّر البرامج في Chrome)
- حالات استخدام مساحة التخزين المشتركة (مطوّر برامج Chrome)
- مقدّمة عن التجميع الخاص (مطوّر برامج Chrome)
- شرح مساحة التخزين المشتركة (GitHub)
- شرح حول التجميع الخاص (GitHub)
- عرض توضيحي لميزة "مساحة التخزين المشتركة" و"التجميع الخاص"
بعد أن تتعرف على واجهات برمجة التطبيقات، يمكنك البدء في جمع التقارير التي يتم إرسالها كطلب POST إلى نقاط النهاية التالية بتنسيق JSON في نص الطلب.
- تقارير تصحيح الأخطاء -
context-origin/.well-known/private-aggregation/debug/report-shared-storage
- التقارير -
context-origin/.well-known/private-aggregation/report-shared-storage
بعد جمع التقارير، يمكنك إجراء اختبار باستخدام الاختبار المحلي الأداة أو إعداد بيئة تنفيذ موثوقة للتجميع الخدمة للحصول على التقارير المجمَّعة
مشاركة ملاحظاتك
يمكنك مشاركة ملاحظاتك حول واجهات برمجة التطبيقات والمستندات على GitHub.