التفاعل مع discourse من Python؟

شكراً جزيلاً! نعم سأفعل ذلك! أنا أبحث تحديداً عن عدد مشاهدات الصفحات (المستخدمون المسجلون، المستخدمون المجهولون، برامج الزحف) ولكن لا يمكنني العثور عليها في وثائق واجهة برمجة التطبيقات (API). أي توجيهات؟

بعض الاستدعاءات الخاصة بالمسؤول ليست في وثائق واجهة برمجة التطبيقات (API)

أود فتح علامة التبويب “الشبكة” (network)، والانتقال إلى صفحة المسؤول، وعرض التقرير بالبيانات التي تريد استردادها، ثم التحقق من علامة التبويب “الشبكة” لمعرفة ما قام المتصفح بتحميله.

وهو في الواقع ملخص لـ Reverse engineer the Discourse API

ما سأفعله هو استخدام المكوّن الإضافي Data Explorer للحصول على ما تريده، وبعد ذلك يمكنك سحب ذلك باستخدام واجهة برمجة التطبيقات (API). تشغيل استعلامات Data Explorer باستخدام واجهة برمجة تطبيقات Discourse

بالتأكيد؛ إذا كنت تريد بيانات تختلف عما هو معروض بالفعل في لوحة المسؤول، فإن DE هو الطريق المناسب.

كما أنه يضمن أن تلك الاستعلامات لن تُرجع بيانات مختلفة بعد التحديث، ولكن أيضًا قد تتغير الهياكل الأساسية وقد تحتاج إلى صيانة الاستعلام.

مقايضات في كلتا الحالتين.

شكراً لكما! لقد نجحت باستخدام طريقة “الهندسة العكسية” + مفتاح واجهة برمجة التطبيقات (API)! شكراً جزيلاً!

وصلتُ إلى هذه المحادثة متأخرًا قليلاً (حسنًا، إلى امتدادها :p)، لكنني أيضًا أردتُ سحب بيانات من منتدى Discourse دون عناء إعداد مفتاح API. إذا كنتَ أنتَ (أو أي شخص آخر) ترغب في واجهة بسيطة لسحب المنشورات من أي منتدى Discourse، يمكنك الاطلاع عليها هنا: GitHub - elninotech/discourse-reader: A simple Python wrapper for reading data from Discourse forums · GitHub

تم إصدارها على PyPi، لذا يسهل تثبيتها باستخدام pip/uv، وتتعامل مع حدود المعدل (rate limiting) تلقائيًا، وهي مُعرَّفة الأنماط باستخدام Pydantic (مما يُحسّن تجربة المطور DX برأيي). الاستخدام:

from discourse_reader import DiscourseClient

client = DiscourseClient("https://meta.discourse.org")

# تصفح التصنيفات
for cat in client.categories():
    print(f"{cat.name}: {cat.topic_count} مواضيع")

# الحصول على موضوع مع جميع منشوراته
topic = client.topics.get(12345)
print(topic.title)
print(topic.opening_post.cooked)       # المنشور الأصلي (HTML)
print(topic.accepted_answer)           # الإجابة المقبولة أو None
for reply in topic.posts.replies():
    print(reply.username, reply.cooked)

بالتأكيد لن تقدّم هذه الأداة بيانات أفضل أو أسرع من إضافة مستكشف البيانات، لكنني أعتقد أنها لطيفة إذا كنتَ ترغب فقط في سحب دفعة من المواضيع أو إحصائيات بسيطة للموقع بسرعة :slight_smile:

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

لا يُسمح لك بأتمتة الوصول إلى المنتدى أو مراقبته، مثل استخدام أداة زحف للويب، أو إضافة للمتصفح، أو أي برنامج حاسوبي آخر غير متصفح ويب. يُسمح لك بزحف المنتدى لفهرسته لمحركات بحث متاحة للجمهور، إذا كنت تدير واحدًا.

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

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

وعلى هذا النحو، يقدم pydiscourse نفس الوظيفة، والفرق الوحيد هو الحاجة إلى مفتاح واجهة برمجة التطبيقات (لا أعرف مدى سهولة ذلك كمستخدم عادي)، وبعد ذلك يمكن استخدامه بنفس الطريقة لانتهاك شروط خدمة أي منتدى. لذا، إذا كانت القاعدة الافتراضية هي عدم أتمتة الوصول إلى المنتدى، أليس [pydiscourse] و discourse2 ينتهكان أيضًا شروط الخدمة؟ بل إن discourse2 يروج للوصول إلى البيانات المتاحة علنًا في قائمة ميزاته إذا لم يُقدَّم مفتاح واجهة برمجة التطبيقات:

يعمل في بيئات الخادم والمتصفح على حد سواء* (*مفيد لاستعلام البيانات العامة دون مفاتيح واجهة برمجة التطبيقات وعلى المصدر ذي الصلة، مثل أحدث المواضيع، وما إلى ذلك)

يوجد على الأرجح العديد من الحزم الأخرى بلغات مختلفة تدعم بالفعل هذا النوع من الوصول.

بعض السياق الإضافي: بنيت هذا لأتمكن من سحب البيانات بسهولة من منتدى يستضيفه أحد عملائنا (ولكننا لا نملك وصولاً مباشرًا إلى قاعدة البيانات). إنه ببساطة يجعل سير عملي أكثر نظافة، وأملُ أن أساعد الآخرين الذين يواجهون نفس الوضع.

المسألة هي أن إنشاء مفتاح API يتطلب أولاً الوصول إلى واجهة المسؤول (إدارة > متقدم > مفاتيح API)، لذا فإن منح مفتاح API هو شيء يريد المسؤولون فعله؛ لا يمكن لأي مستخدم عادي الحصول عليه.

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

ومع ذلك، ما زلت أرغب في مناقشة بعض النقاط الأخرى التي أثارها، والاستماع إلى آراء الآخرين بشأنها، وتحديداً: هل يمكن لأي شخص بالفعل استخدام أدوات مثل curl أو requests لاستخراج البيانات أو مراقبتها بشكل تافه؟ ألا ينبغي أن تقع المسؤولية على عاتق المطور نفسه بعدم انتهاك شروط الاستخدام؟ أم ينبغي أن تقع ضمن الأدوات التي يستخدمها؟

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

أيضاً، وبما أن discourse مرخصة بموجب GPLv2، هل إنشاء أداة مثل discourse-reader ينتهك بشكل مباشر أي شروط؟

أنا فضولي لمعرفة آراء الآخرين بشأن هذه النقاط.

تدعم أيضًا أداة Ruby الرسمية discourse_api الوصول إلى البيانات العامة دون الحاجة إلى مفتاح API. لذا، أعتقد أنه من المقبول وجود هذه الأداة. يقع على عاتق المستخدمين ضمان امتثالهم لأي شروط خدمة خاصة بكل منتدى.

(هذه وجهة نظري الشخصية - وليست بيانًا قانونيًا رسميًا من CDCK :sweat_smile:)

كما تجدر الإشارة إلى أن طلبات ‘البوت’ غير المصادق عليها تخضع لحدود معدل أكثر صرامة، وقد تتعرض لطبقات أمنية أخرى لحماية ‘البوت’ (مثل Cloudflare). لذا، إذا أمكن، فمن الأفضل دائمًا استخدام مفتاح API.

شكرًا على الرد! حتى الآن، قمت بتحديث README في حزمتي بإضافة إخلاء مسؤولية يحث على احترام شروط استخدام أي موقع قد يرغب المطور في استخدامه معه.

لم أكن على علم بهذه القاعدة الافتراضية في شروط الاستخدام على الإطلاق عند إنشاء هذا، وآمل أن يتعلم أي شخص ينظر في استخدام هذه الحزمة ذلك أيضًا في المستقبل :slight_smile:

نعم، هذا يكرّر ببساطة الحجج المتعلقة بمسجلات الفيديو (VCRs)… منذ فترة. وبالمثل، مفاتيح فتح الأقفال. توجد استخدامات مشروعة وغير مشروعة للأدوات، والمسؤولية تقع على عاتق المشغّل.

مرة أخرى، لستُ محاميًا (IANAL) وهذا ليس بيانًا رسميًا، لكنني أشعر أن هذا يعكس بدقة منظورنا في هذا الشأن:

هناك فرق كبير بين الاستكشاف النابع من نوايا حسنة باستخدام أداة (على سبيل المثال) وبين إعداد الأتمتة.

لن نشعر بالاستياء تجاه الأشخاص الذين يستخدمون أدوات مثل هذه في المنتدى (meta)، خاصة إذا كانوا يطورون وظائف أو يتعلمون كيفية التفاعل مع واجهة برمجة تطبيقات (API) الخاصة بـ Discourse. سنشجع ذلك، طالما أنك لا تقوم بجمع البيانات على نطاق واسع، أو التسبب في حمل زائد غير مبرر، أو الإضرار بتجربة الآخرين.