Bonjour à tous !
Je me demande s’il existe une méthode via l’API Discourse pour obtenir l’identifiant d’un message à partir d’une URL canonique de message telle que https://myweb.site/t/<topic_id>/<post_number>, où bien sûr TN est l’identifiant/numéro du sujet et PN est le numéro du message.
J’ai effectué quelques essais en utilisant les données du flux de messages depuis https://myweb.site/t/<topic_id>.json, en pensant que, par exemple, le message numéro N correspondrait au N-ième identifiant de message dans les données post_stream->stream renvoyées par l’appel. Cependant, si des messages ont été supprimés ou si des divisions ont été effectuées dans le flux des messages du sujet, le numéro de message ne correspond pas à la N-ième position dans le stream.
Avez-vous essayé /t/<topic_id>/posts.json ? Cela récupère 20 publications et vous pouvez prendre celle dont le numéro correspond à post_number, qui contiendra un identifiant de publication.
Mais pour en obtenir plus de 20, il faudra une pagination, ce dont je ne vois pas comment procéder pour le moment.
J’avais désespérément besoin de cette même fonctionnalité il y a deux ans. Je n’ai toujours pas trouvé comment le faire (mieux) correctement. Voici mon astuce :
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
Cela contourne les problèmes mentionnés : {print: true} résout le problème de pagination. La méthode find est nécessaire car la modération peut créer un décalage entre les indices du tableau et les numéros de message.
Cela fonctionne pour les sujets de la taille sur laquelle je travaille. Cependant, une méthode plus directe via l’API serait plus satisfaisante.