投稿番号から投稿IDへ

みなさん、こんにちは!
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 番目の位置に対応しません。

何か見落としているのでしょうか?

「いいね!」 3

/t/<topic_id>/posts.json を試しましたか?これにより 20 件の投稿が取得でき、その中から post_number 番目の投稿を選ぶと、投稿 ID が含まれます。

ただし、20 件を超える投稿を取得するにはページネーションが必要ですが、現時点でその方法がわかりません。

「いいね!」 2

2年前、私も同じ機能に切実に必要とされていました。しかし、いまだにそれをより適切に行う方法が見つかっていません。これが私のハックです:

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 を通じてより直接的な方法があれば、より満足できるでしょう。

「いいね!」 1