Alle Beiträge zu einem Thema mit der API abrufen

:notebook_with_decorative_cover: Dies ist eine Anleitung, die erklärt, wie man alle Beiträge aus einem Thema über die Discourse-API abruft.

Die von der Discourse-API für viele Routen zurückgegebenen Ergebnisse sind paginiert.

Zum Beispiel gibt der API-Endpunkt für “Ein einzelnes Thema abrufen” - z. B. https://examplesite/t/{id}.json standardmäßig nur 20 Beiträge zurück, auch wenn das Thema mehr als 20 Beiträge enthält.

Aufgrund dieses Verhaltens gibt es zwei Möglichkeiten, die Discourse-API zu verwenden, um alle Beiträge für ein Thema über den Endpunkt .../t/{id}.json abzurufen.

Query-Parameter anhängen

Der einfachste Weg, alle Beiträge aus einem Thema abzurufen, ist das Hinzufügen eines print=true-Query-Parameters zur URL, an die Sie die Anfrage senden.

Z. B.: https://examplesite/t/{id}.json?print=true

Wenn der print=true-Query-Parameter hinzugefügt wird, setzt Discourse die chunk_size für die Anzahl der zurückgegebenen Beiträge auf 1000. Das bedeutet, dass dies ein guter Ansatz ist, solange Sie sicher sind, dass Ihre Themen nicht mehr als 1000 Beiträge enthalten.

Mehrere API-Anfragen

Die andere Methode zum Abrufen aller Beiträge besteht darin, mehrere API-Anfragen zu stellen, um alle Beiträge aus dem Thema zu erhalten:

  1. Zuerst würden Sie eine anfängliche GET-Anfrage an den Endpunkt .../t/{id}.json stellen. Diese enthält einen posts_stream-Hash, der ein posts-Array und ein stream-Array enthält. Das posts-Array liefert Ihnen die ersten 20 Beiträge.

  2. Jetzt müssen Sie durch das stream-Array schleifen, das Ihnen alle Beitrags-IDs im Thema liefert. Entfernen Sie die ersten 20 Beitrags-IDs aus dem Stream (andernfalls laden Sie sie ohne Grund erneut herunter).

  3. Sie können dann zusätzliche Anfragen an den Endpunkt “Bestimmte Beiträge aus einem Thema abrufen” .../t/{id}/posts.json stellen, post_ids[] anhängen und alle IDs aus dem stream-Array in Blöcken von 20 übergeben. Z. B.
    .../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

Ratenbegrenzungen

Wenn Sie beim Stellen mehrerer API-Aufrufe die Meldung “Error: you have performed this action many times, please try again later” erhalten, deutet dies darauf hin, dass Sie die Ratenbegrenzungen für API-Schlüssel erreichen.

Discourse hat ein Limit für die Anzahl der print=true-Anfragen, die pro Stunde gestellt werden können, was durch die Website-Einstellung max prints per hour per user gesteuert wird. Diese Einstellung erlaubt standardmäßig nur 5 Themen pro Stunde. Sie können diese Einstellung auf 0 setzen, um die Ratenbegrenzung zu deaktivieren.

Beachten Sie, dass die Ratenbegrenzung nicht angewendet wird, wenn Sie einen All Users API-Schlüssel für die Anfragen verwenden und den Benutzernamen eines Website-Administrators für den Parameter Api-Username der Anfrage angeben. Das bedeutet, dass Sie anstatt die Website-Einstellung max prints per hour per user zu deaktivieren, einfach einen Admin-Benutzernamen (z. B. system) für die Anfragen verwenden könnten.

Wenn Sie Ratenbegrenzungsfehler bei API-Anfragen feststellen, die nicht print=true enthalten, empfehlen wir, Ihrem API-Skript ein Timeout hinzuzufügen, damit Sie die Ratenbegrenzungen nicht überschreiten. Alternativ können Sie auf 429 (zu viele Anfragen) Fehlercodes lauschen und die Anfragen zurückstellen, wenn Sie diese Antwort erhalten.

Als Referenz gelten die unten aufgeführten Standard-Ratenbegrenzungen für unsere Standard- und Business-Hosting-Pläne:

:grey_exclamation: Nur für selbst gehostete Installationen - Siehe: Available settings for global rate limits and throttling für Details zur Anpassung der Discourse-API-Ratenbegrenzungen.

11 „Gefällt mir“

Wird der ?page-Abfrageparameter unterstützt? Er funktioniert, aber auf überraschende Weise – ?page=1 gibt nur den ersten Beitrag im Thema zurück. Um mit dem Parameter zu paginieren, müssen Sie also mit https://example.com/t/slug/topicId.json beginnen, dann zu https://example.com/t/slug/topicId.json?page=2 springen und so weitermachen, bis Sie schließlich eine 404-Antwort erhalten.

Hallo Simon,

Die Verwendung des Parameters ?page=1 mit dem Endpunkt „Einzelnes Thema abrufen“ gibt die ersten 20 Beiträge eines Themas zurück. Jede nachfolgende Seitenzahl gibt bis zu 20 Beiträge zurück.

Wenn keine weiteren Beiträge verfügbar sind (z. B. die Seite ist zu hoch und ungültig), erhalten Sie eine 404-Antwort.

Wenn Sie keine Seitenzahl angeben, setzt der Code die Seitenzahl auf 1. ?page=1 ist also dasselbe, als wenn Sie keine explizite Seite an die Themenanfrage anhängen.

Wenn Sie diese Methode verwenden möchten, um alle Beiträge aus einem Thema abzurufen, sollten Sie dazu in der Lage sein, auch wenn dies in der Discourse API-Dokumentation nicht erwähnt wird.

3 „Gefällt mir“

Danke! Arbeite an einem Matrix-Bot, um Posts abzurufen!

Ich glaube, das ist falsch. Wenn Sie auf 0 setzen, wird der Druck vollständig deaktiviert. Die neueste Beschreibung für diese Einstellung lautet Maximale Anzahl von /print-Seitenaufrufen (auf 0 setzen, um das Drucken zu deaktivieren).