本指南介绍如何使用 Discourse API 获取某个主题下的所有帖子。
Discourse API 对许多路由返回的结果都是分页的。
例如,“获取单个主题” 的 API 端点(示例:https://examplesite/t/{id}.json)默认仅返回 20 条帖子,即使该主题包含超过 20 条帖子。
由于这一行为,使用 .../t/{id}.json 端点获取主题下所有帖子有两种方法:
添加查询参数
获取主题下所有帖子的最简单方法是在请求 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 条帖子。 -
接下来,您需要遍历
stream数组,该数组包含主题中所有帖子的 ID。请从stream中移除前 20 个帖子 ID(否则您将无意义地重新下载它们)。 -
然后,您可以向 “获取主题中的特定帖子” 的
.../t/{id}/posts.json端点发起额外请求,附加post_ids[]参数,并以每批 20 个的方式传入stream数组中的所有 ID。示例:
.../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 对每小时可发起的 print=true 请求数量有限制,该限制由站点设置 max prints per hour per user 控制。该设置默认仅允许用户每小时打印 5 个主题。将其设置为 0 将完全禁用打印功能(带有 print=true 的请求将返回 403 错误)。
请注意,如果请求用户是管理员,则不会应用速率限制。这意味着,您可以在请求的 Api-Username 参数中使用管理员用户名(例如 system)来绕过打印速率限制。
如果您在使用不包含 print=true 的 API 请求时遇到速率限制错误,建议为您的 API 脚本添加超时机制,以避免超出速率限制。或者,您可以监听 429(请求过多)错误代码,并在收到该响应时降低请求频率。
供参考,以下默认速率限制适用于我们的标准版和企业版托管计划:
仅限自托管环境 - 详细信息请参阅:https://meta.discourse.org/t/available-settings-for-global-rate-limits-and-throttling/78612,了解如何调整 Discourse API 的速率限制。
