Alle Beiträge aus einem Thema über die API abrufen

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

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

Beispielsweise 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, selbst wenn das Thema mehr als 20 Beiträge enthält.

Aufgrund dieses Verhaltens gibt es zwei Möglichkeiten, wie Sie die Discourse-API nutzen können, um alle Beiträge eines Themas über den Endpunkt .../t/{id}.json abzurufen.

Einen Abfrageparameter anhängen

Der einfachste Weg, alle Beiträge eines Themas abzurufen, besteht darin, einen Abfrageparameter print=true an die URL anzuhängen, an die Sie die Anfrage senden.

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

Wenn der Abfrageparameter print=true 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 des Themas zu erhalten:

  1. Zuerst stellen Sie eine initiale GET-Anfrage an den Endpunkt .../t/{id}.json. Dieser 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 iterieren, das Ihnen alle Beitrags-IDs im Thema liefert. Entfernen Sie die ersten 20 Beitrags-IDs aus dem Stream (sonst laden Sie sie unnötigerweise erneut herunter).

  3. Anschließend können Sie weitere Anfragen an den Endpunkt „Spezifische 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. Beispiel: \n.../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

Ratenlimits

Wenn Sie bei mehreren API-Aufrufen die Fehlermeldung Error: you have performed this action many times, please try again later erhalten, bedeutet dies, dass Sie auf Ratenlimits für Ihren API-Schlüssel stoßen.

Discourse hat ein Limit für die Anzahl der print=true-Anfragen pro Stunde, das durch die Site-Einstellung max prints per hour per user gesteuert wird. Diese Einstellung erlaubt standardmäßig nur, dass Benutzer 5 Themen pro Stunde drucken. Wenn Sie diesen Wert auf 0 setzen, wird das Drucken vollständig deaktiviert (Anfragen mit print=true führen zu einem 403-Fehler).

Beachten Sie, dass das Ratenlimit nicht angewendet wird, wenn der anfragende Benutzer ein Administrator ist. Das bedeutet, dass Sie einen API-Schlüssel mit dem Benutzernamen eines Administrators (z. B. system) für den Parameter Api-Username der Anfrage verwenden können, um das Druck-Ratenlimit zu umgehen.

Wenn Sie bei API-Anfragen, die kein print=true enthalten, auf Ratenlimit-Fehler stoßen, empfehlen wir, ein Timeout zu Ihrem API-Skript hinzuzufügen, damit Sie die Ratenlimits nicht überschreiten. Alternativ können Sie auf Fehlercodes 429 (zu viele Anfragen) lauschen und die Anfragen verzögern, wenn Sie diese Antwort erhalten.

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

:grey_exclamation: Nur für Self-Hosting – Weitere Informationen zur Anpassung der Discourse-API-Ratenlimits finden Sie unter: Available settings for global rate limits and throttling

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).