Récupérer tous les messages d'un sujet via l'API

:notebook_with_decorative_cover: Ceci est un guide pratique expliquant comment récupérer tous les messages d’un sujet en utilisant l’API Discourse

Les résultats renvoyés par l’API Discourse pour de nombreuses routes sont paginés.

Par exemple, le point de terminaison de l’API pour “Obtenir un seul sujet” - Exemple : https://examplesite/t/{id}.json ne renverra que 20 messages par défaut, même si le sujet contient plus de 20 messages.

En raison de ce comportement, il existe deux façons d’utiliser l’API Discourse pour récupérer tous les messages d’un sujet en utilisant le point de terminaison .../t/{id}.json.

Ajouter un paramètre de requête

La façon la plus simple de récupérer tous les messages d’un sujet consiste à ajouter un paramètre de requête print=true à l’URL vers laquelle vous effectuez la demande.

Exemple : https://examplesite/t/{id}.json?print=true

Lorsque le paramètre de requête print=true est ajouté, Discourse définit la chunk_size (taille du lot) pour le nombre de messages renvoyés à 1000. Cela signifie que cette approche est recommandée tant que vous êtes certain que vos sujets ne contiennent pas plus de 1000 messages.

Plusieurs requêtes API

L’autre méthode pour récupérer tous les messages consiste à effectuer plusieurs requêtes API afin d’obtenir l’intégralité des messages du sujet :

  1. Tout d’abord, effectuez une requête GET initiale vers le point de terminaison .../t/{id}.json. Cela renverra un hash posts_stream contenant un tableau posts et un tableau stream. Le tableau posts vous donnera les 20 premiers messages.

  2. Vous devez maintenant parcourir le tableau stream, qui vous fournit tous les identifiants de messages du sujet. Supprimez les 20 premiers identifiants de messages du flux (sinon, vous les téléchargez à nouveau inutilement).

  3. Vous pouvez ensuite effectuer des requêtes supplémentaires vers le point de terminaison “Obtenir des messages spécifiques d’un sujet” .../t/{id}/posts.json, ajouter post_ids[], et transmettre tous les identifiants du tableau stream par lots de 20. Exemple : .../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

Limites de débit

Si vous rencontrez le message d’erreur Error: you have performed this action many times, please try again later lors de l’exécution de multiples appels API, cela indique que vous avez atteint les limites de débit de votre clé API.

Discourse impose une limite sur le nombre de requêtes print=true pouvant être effectuées par heure, contrôlée par le paramètre du site max prints per hour per user (nombre maximal d’impressions par heure par utilisateur). Ce paramètre est défini par défaut pour autoriser uniquement 5 sujets à être imprimés par heure. La définition de cette valeur à 0 désactive complètement l’impression (les requêtes avec print=true renverront une erreur 403).

Notez que la limite de débit ne sera pas appliquée si l’utilisateur effectuant la requête est un administrateur. Cela signifie que vous pouvez utiliser une clé API avec le nom d’utilisateur d’un administrateur (par exemple system) pour le paramètre Api-Username de la requête afin de contourner la limite de débit d’impression.

Si vous rencontrez des erreurs de limite de débit avec des requêtes API ne contenant pas print=true, nous vous recommandons d’ajouter un délai d’attente (timeout) à votre script API afin de ne pas dépasser les limites de débit. Alternativement, vous pouvez écouter les codes d’erreur 429 (trop de requêtes) et mettre en place une stratégie de réessai avec délai (backoff) lorsque vous recevez cette réponse.

Pour référence, les limites de débit par défaut listées ci-dessous s’appliquent à nos plans d’hébergement standard et entreprise :

:grey_exclamation: Hébergement sur site uniquement - Voir : Available settings for global rate limits and throttling pour les détails sur l’ajustement des limites de débit de l’API Discourse.

11 « J'aime »

Le paramètre de requête ?page est-il pris en charge ? Il fonctionne, mais d’une manière surprenante : ?page=1 ne renvoie que le premier message du sujet. Ainsi, pour paginer avec le paramètre, vous devez commencer par https://example.com/t/slug/topicId.json, puis passer à https://example.com/t/slug/topicId.json?page=2, puis continuer jusqu’à ce que vous obteniez finalement une réponse 404.

Salut Simon,

L’utilisation du paramètre ?page=1 avec le point de terminaison Get a single topic renverra les 20 premiers messages d’un sujet, et chaque numéro de page suivant renverra jusqu’à 20 messages.

Lorsqu’il n’y a plus de messages disponibles (par exemple, la page est trop élevée et invalide), vous obtiendrez une réponse 404.

Si vous ne spécifiez pas de numéro de page, le code définira le numéro de page sur 1, donc ?page=1 équivaut à ne pas ajouter de page explicite à la requête du sujet.

Si vous souhaitiez utiliser cette méthode pour récupérer tous les messages d’un sujet, vous devriez pouvoir le faire, même si cela n’est pas mentionné dans la Documentation de l’API Discourse.

3 « J'aime »

Merci ! Je travaille sur un bot Matrix pour récupérer des publications !

Je pense que c’est faux. Définir sur 0 désactivera complètement l’impression. La dernière description de ce paramètre est Nombre maximum d'impressions de pages /print (définir sur 0 pour désactiver l'impression).