جلب جميع المشاركات من موضوع باستخدام API

:notebook_with_decorative_cover: هذا دليل إرشادي يشرح كيفية جلب جميع المشاركات من موضوع باستخدام واجهة برمجة تطبيقات Discourse.

النتائج التي تعيدها واجهة برمجة تطبيقات Discourse للعديد من المسارات تكون مُصفحة.

على سبيل المثال، نقطة نهاية واجهة برمجة التطبيقات لـ “الحصول على موضوع واحد” - مثال: https://examplesite/t/{id}.json ستعيد 20 مشاركة فقط افتراضيًا، حتى لو كان الموضوع يحتوي على أكثر من 20 مشاركة.

بسبب هذا السلوك، هناك طريقتان يمكنك استخدامهما لواجهة برمجة تطبيقات Discourse لجلب جميع المشاركات لموضوع باستخدام نقطة النهاية .../t/{id}.json.

إضافة مُعامل استعلام

أسهل طريقة لجلب جميع المشاركات من موضوع هي إضافة مُعامل استعلام print=true إلى عنوان URL الذي تقوم بتقديم الطلب إليه.

مثال: https://examplesite/t/{id}.json?print=true

عند إضافة مُعامل الاستعلام print=true، تقوم Discourse بتعيين chunk_size لعدد المشاركات التي يتم إرجاعها إلى 1000. هذا يعني أن هذا نهج جيد للاستخدام طالما أنك متأكد من أن مواضيعك لا تحتوي على أكثر من 1000 مشاركة.

طلبات واجهة برمجة تطبيقات متعددة

الطريقة الأخرى لجلب جميع المشاركات هي إجراء طلبات واجهة برمجة تطبيقات متعددة لجلب جميع المشاركات من الموضوع:

  1. أولاً، ستقوم بتقديم طلب GET أولي إلى نقطة النهاية .../t/{id}.json. سيحتوي هذا على تجزئة posts_stream تحتوي على مصفوفة posts ومصفوفة stream. ستمنحك مصفوفة posts أول 20 مشاركة.

  2. الآن تحتاج إلى المرور عبر مصفوفة stream التي تعطيك جميع معرفات المشاركات في الموضوع. قم بإزالة أول 20 معرف مشاركة من التدفق (وإلا فإنك تعيد تنزيلها دون داعٍ).

  3. يمكنك بعد ذلك تقديم طلبات إضافية إلى نقطة نهاية “الحصول على مشاركات محددة من موضوع” .../t/{id}/posts.json، وإضافة post_ids[]، وتمرير جميع المعرفات من مصفوفة stream في أجزاء من 20. مثال:

…/t/{id}/posts.json?post_ids=46&post_ids=47&post_ids=48&post_ids=49&post_ids=50&post_ids=51&post_ids=52&post_ids=53&post_ids=54&post_ids=55&post_ids=56&post_ids=57&post_ids=58&post_ids=59&post_ids=60&post_ids=61&post_ids=62&post_ids=63&post_ids=64&post_ids=65

حدود المعدل

إذا واجهت رسالة Error: you have performed this action many times, please try again later عند تقديم طلبات واجهة برمجة تطبيقات متعددة، فهذا يشير إلى أنك تواجه حدود معدل مفتاح واجهة برمجة التطبيقات.

لدى Discourse حد لعدد طلبات print=true التي يمكن تقديمها في الساعة، والتي يتم التحكم فيها بواسطة إعداد الموقع max prints per hour per user. يضبط هذا الإعداد افتراضيًا السماح للمستخدمين بطباعة 5 مواضيع فقط في الساعة. يمكنك تعيين هذا الإعداد إلى 0 لتعطيل حد المعدل.

لاحظ أن حد المعدل لن يتم تطبيقه إذا استخدمت مفتاح واجهة برمجة تطبيقات لجميع المستخدمين للطلبات وقدمت اسم مستخدم لمسؤول الموقع لمعلمة Api-Username للطلب. هذا يعني أنه بدلاً من تعطيل إعداد الموقع max prints per hour per user، يمكنك ببساطة استخدام اسم مستخدم مسؤول (على سبيل المثال system) للطلبات.

إذا كنت تواجه أخطاء في حدود المعدل مع طلبات واجهة برمجة التطبيقات التي لا تحتوي على print=true، فنحن نوصي بإضافة مهلة إلى برنامج واجهة برمجة التطبيقات الخاص بك حتى لا تتجاوز حدود المعدل. بدلاً من ذلك، يمكنك الاستماع إلى رموز الخطأ 429 (عدد كبير جدًا من الطلبات) والتراجع عن الطلبات عند تلقي هذا الرد.

كمرجع، تنطبق حدود المعدل الافتراضية المدرجة أدناه على خطط الاستضافة القياسية والأعمال لدينا:

discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub

:grey_exclamation: مُستضاف ذاتيًا فقط - انظر: Available settings for global rate limits and throttling للحصول على تفاصيل حول تعديل حدود معدل واجهة برمجة تطبيقات Discourse.

11 إعجابًا

هل يتم دعم معلمة الاستعلام ?page؟ إنها تعمل، ولكن بطريقة مفاجئة - ?page=1 تُرجع المنشور الأول فقط في الموضوع، لذلك للتنقل باستخدام المعلمة تحتاج إلى البدء بـ https://example.com/t/slug/topicId.json، ثم الانتقال إلى https://example.com/t/slug/topicId.json?page=2، ثم الاستمرار حتى تحصل في النهاية على استجابة 404.

مرحباً سيمون،

استخدام المعلمة ?page=1 مع نقطة نهاية الحصول على موضوع واحد سيعيد أول 20 مشاركة من موضوع، وكل رقم صفحة لاحق سيعيد ما يصل إلى 20 مشاركة.

عندما لا تكون هناك مشاركات متاحة (مثال: الصفحة مرتفعة جدًا وغير صالحة)، ستحصل على استجابة 404.

إذا لم تحدد رقم صفحة، فسيقوم الرمز بتعيين رقم الصفحة إلى 1، لذا فإن ?page=1 هو نفس عدم إلحاق صفحة صريحة بطلب الموضوع.

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

3 إعجابات

شكرا! أعمل على روبوت Matrix لجلب المشاركات!

أعتقد أن هذا خطأ. تعيينه إلى 0 سيعطل الطباعة على الإطلاق. الوصف الأخير لهذا الإعداد هو الحد الأقصى لعدد مرات عرض صفحة /print (تعيينه إلى 0 لتعطيل الطباعة).