これは、Discourse API を使用してトピックからすべての投稿を取得する方法を説明するハウツーガイドです
Discourse API が多くのルートで返す結果はページネーションされています。
例えば、「単一のトピックを取得」の API エンドポイント - 例:https://examplesite/t/{id}.json は、トピックに 20 件以上の投稿が含まれていても、デフォルトでは 20 件の投稿のみを返します。
この動作により、.../t/{id}.json エンドポイントを使用してトピックのすべての投稿を取得するには、Discourse API を使うための 2 つの方法があります。
クエリパラメータを追加する
トピックからすべての投稿を取得する最も簡単な方法は、リクエストを行う URL に print=true クエリパラメータを追加することです。
例:https://examplesite/t/{id}.json?print=true
print=true クエリパラメータを追加すると、Discourse は返される投稿数に対する chunk_size を 1000 に設定します。つまり、トピックに 1000 件以下の投稿しかないことが確実であれば、このアプローチを使用するのが良い方法です。
複数の API リクエスト
すべての投稿を取得するもう一つの方法は、トピックからすべての投稿を取得するために複数の API リクエストを行うことです。
-
まず、
.../t/{id}.jsonエンドポイントに対して初期のGETリクエストを行います。これにはposts配列とstream配列を含むposts_streamハッシュが含まれています。posts配列からは最初の 20 件の投稿が取得できます。 -
次に、トピック内のすべての投稿 ID を提供する
stream配列をループ処理する必要があります。ストリームから最初の 20 件の投稿 ID を削除してください(そうしないと、不要に再ダウンロードすることになります)。 -
その後、追加のリクエストを「トピックからの特定の投稿を取得」
.../t/{id}/posts.jsonエンドポイントに行い、post_ids[]を追加して、stream配列から取得した ID を 20 件ずつのチャンクで渡します。例:\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
レート制限
複数の API 呼び出しを行う際に Error: you have performed this action many times, please try again later というエラーメッセージが表示された場合、API キーのレート制限に達していることを示しています。
Discourse には、1 時間あたりに行える print=true リクエストの数に制限があり、これは「ユーザーあたりの 1 時間あたりの最大印刷数」というサイト設定によって制御されています。この設定のデフォルト値は、ユーザーが 1 時間あたり 5 トピックのみを印刷できるように設定されています。この値を 0 に設定すると、印刷機能が完全に無効になります(print=true を含むリクエストは 403 エラーを返します)。
なお、リクエストを行うユーザーが管理者である場合は、レート制限は適用されません。つまり、リクエストの Api-Username パラメータに管理者のユーザー名(例:system)を使用して API キーを指定することで、印刷のレート制限を回避できます。
print=true を含まない API リクエストでレート制限エラーが発生する場合は、レート制限を超えないように API スクリプトにタイムアウトを設定することをお勧めします。あるいは、429(リクエストが多すぎます)エラーコードを監視し、そのレスポンスを受け取った際にリクエストをバックオフ(待機)させることもできます。
参考までに、以下に記載されているデフォルトのレート制限は、標準およびビジネスホスティングプランに適用されます。
セルフホスト版のみ - 詳細については、Discourse API のレート制限を調整する方法を Available settings for global rate limits and throttling を参照してください。
