Ich frage mich, ob es über die Discourse-API eine Möglichkeit gibt, die Post-ID aus einer canonical-Post-URL wie https://myweb.site/t/<topic_id>/<post_number> zu erhalten, wobei TN natürlich die Topic-ID/Nummer und PN die Post-Nummer ist.
Ich habe einige Versuche mit den Post-Stream-Daten von https://myweb.site/t/<topic_id>.json unternommen. Ich ging beispielsweise davon aus, dass Post-Nummer N die n-te Post-ID im post_stream->stream-Datenbestand sein würde, der durch den Aufruf zurückgegeben wird. Wenn jedoch Posts gelöscht wurden oder in den Topic-Post-Fluss Aufteilungen vorgenommen wurden, entspricht die Post-Nummer nicht der n-ten Position im stream.
Hast du /t/<topic_id>/posts.json ausprobiert? Damit erhältst du 20 Beiträge, und du kannst den Beitrag mit der Nummer post_number auswählen, der eine Beitrags-ID enthält.
Um jedoch mehr als 20 Beiträge zu erhalten, benötigst du eine Paginierung, die ich im Moment nicht weiß, wie man umsetzt.
Ich habe diese Funktion vor zwei Jahren dringend benötigt. Ich habe immer noch nicht herausgefunden, wie man es (noch) besser macht. Dies ist mein Hack:
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
Damit werden die genannten Probleme umgangen: Das {print: true} löst das Paginierungsproblem. Das find ist notwendig, da Moderation eine Diskrepanz zwischen Array-Indizes und Post-Nummern verursachen kann.
Es funktioniert für die Größe der Themen, mit denen ich arbeite. Dennoch wäre ein direkterer Weg über die API befriedigender.