ترقيم صفحات أحدث المشاركات عبر واجهة برمجة التطبيقات

مرحباً بالجميع!

أقوم بجلب أحدث المنشورات من واجهة برمجة التطبيقات باستخدام هذه النقطة الطرفية: https://community.learnaboutgmp.com/posts.json

كيف يمكنني الحصول على نتائج أكثر من أحدث المنشورات؟ هل هذا ممكن؟

لقد جربت https://community.learnaboutgmp.com/posts.json?page=2 لكنها لا تعمل.

شكراً مقدماً!

When I figured that out before I followed the instructions in the “reverse engineering” topic. I thought that I’d done it in GitHub - pfaffman/discourse-downloader: Download a Discourse topic for offline analysis, but I don’t see it there.

You might have to hit /latest.json?page=2 instead of /posts.json and filter out the posts from the result.

https://meta.discourse.org/latest.json?page=2

EDIT: Ohh you want latest posts, not latest topics. Considering /posts by itself doesn’t have a UI, it probably is missing pagination, I’m sure a PR could be created for this. But to get what you want right now you could still parse the /latest.json endpoint and parse out the topic_id and the post number and fetch the post with /t/<topic_id>/<post_number>, but yea I can see why pagination on the /posts endpoint would be helpful.

Okay, now that I’ve looked at the controller for /posts:

def latest
  params.permit(:before)
  ...

there is a “before” parameter, not a “page” parameter, but using it like a “page” is a bit different because it filters out private posts and such. But I think roughly you can use it like this:

  • hit /posts.json and get the first post id (currently it is 22000)
  • subtract 50 (that endpoint only shows at most 50 at a time)
  • hit /posts.json?before=21950
  • repeat

Part of the issue which doesn’t make total sense to me is that we are limiting the sql query to 50 results, but then we do more filtering on it after the initial sql query which is why you will not always get 50 results.

Thanks guys! I’ll play with it.

as the API designer: it works this way to make things easier on the Discourse server; if the server had to do a bunch of work to always fill up 50 posts anything using the API might start being a perf problem.

Basically it forces the consumers to be “good neighbors”, in a weird sense of the term.

سؤال حول استخدام واجهة برمجة التطبيقات (التي أستخدمها عبر gem discourse_api، رائع!) - يتعلق الأمر بالترقيم (أود أيضًا استخدام نقطة نهاية آخر المنشورات)، لكن في مثال الحالي أدناه سأقدم شيئًا من المستخدمين، لأنني بدأت العمل عليه أولاً.

أريد الحصول على جميع أنشطة مستخدم ما (المواضيع والردود كافية)، لذا أحاول ذلك:

vsoch = client.user_topics_and_replies("vsoch")

ثم أحصل باستمرار على قائمة مكونة من 30 عنصرًا، بغض النظر عما إذا كان المستخدم لديه المزيد بوضوح. حاولت تعديل كود المصدر لإضافة متغير للصفحة:

# frozen_string_literal: true
module DiscourseApi
  module API
    module UserActions
      def user_replies(username, page=1)
        params = { "username": username, "filter": '5', page: page }
        response = get("/user_actions.json", params)
        response.body["user_actions"]
      end

      def user_topics_and_replies(username, page=1)
        params = { "username": username, "filter": "4,5", page: page }
        response = get("/user_actions.json", params)
        response.body["user_actions"]
      end
    end
  end
end

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