# 从帖子编号到帖子ID

**URL:** https://meta.discourse.org/t/from-post-number-to-post-id/193247
**Category:** Development
**Tags:** rest-api
**Created:** [2021年六月9日 07:06 UTC](https://meta.discourse.org/t/from-post-number-to-post-id/193247 "2021-06-09T07:06:57Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![marcozambi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcozambi/32/119505_2.png) [@marcozambi](https://meta.discourse.org/u/marcozambi)
#### Post date: [2021年六月9日 07:06 UTC](https://meta.discourse.org/t/from-post-number-to-post-id/193247/1 "2021-06-09T07:06:57Z")

</div>

大家好！

我想知道是否可以通过 Discourse API，从类似 `https://myweb.site/t/<topic_id>/<post_number>` 的规范帖子 URL 中获取帖子 ID，其中 TN 显然是主题 ID/编号，PN 是帖子编号。

我尝试了几次，使用了来自 `https://myweb.site/t/<topic_id>.json` 的帖子流数据，以为例如帖子编号 N 会对应调用返回的 `post_stream->stream` 数据中的第 n 个帖子 ID。但如果帖子被删除或在主题帖子流中进行了拆分，帖子编号并不对应 `stream` 中的第 n 个位置。

我是否忽略了什么显而易见的东西？

---

<div class="post-metadata">

### Author: ![Mark\_Schmucker](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mark_schmucker/32/124810_2.png) [@Mark\_Schmucker](https://meta.discourse.org/u/Mark_Schmucker)
#### Post date: [2021年六月10日 02:20 UTC](https://meta.discourse.org/t/from-post-number-to-post-id/193247/2 "2021-06-10T02:20:45Z")

</div>

你试过 `/t/<topic_id>/posts.json` 吗？它会返回 20 条帖子，你可以取其中的第 post\_number 条，其中包含帖子 ID。

但如果要获取超过 20 条，就需要分页，目前我还没看出如何实现。

---

<div class="post-metadata">

### Author: ![benkeks](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/benkeks/32/175218_2.png) [@benkeks](https://meta.discourse.org/u/benkeks)
#### Post date: [2021年七月21日 16:43 UTC](https://meta.discourse.org/t/from-post-number-to-post-id/193247/3 "2021-07-21T16:43:15Z")

</div>

两年前我就急需同样的功能。我至今仍未找到更恰当的实现方法。这是我的变通方案：

```ruby
def get_topic_post(topic_id, post_num)
    topic = @api.topic(topic_id, {print: true})
    post_obj = topic['post_stream']['posts'].find { |p| p['post_number'] == post_num }
    if post_obj
        post_obj['id']
    else
        throw "Could not find post #{topic_id}/#{post_num}."
    end
end

```

这规避了前述问题：`{print: true}` 解决了分页问题。而 `find` 是必要的，因为审核操作可能导致数组索引与帖子编号不匹配。

对于我所处理的帖子规模，这个方法有效。不过，如果能通过 API 找到更直接的方式，会更令人满意。
