Ceci est un guide 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 sujet unique” - Ex:
https://examplesite/t/{id}.jsonne 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 est d’ajouter un paramètre de requête
print=trueà l’URL à laquelle vous effectuez la requête.Ex:
https://examplesite/t/{id}.json?print=trueLorsque le paramètre de requête
print=trueest ajouté, Discourse définit lachunk_sizepour le nombre de messages renvoyés à 1000. Cela signifie que c’est une bonne approche à utiliser tant que vous êtes certain que vos sujets n’ont pas plus de 1000 messages.Requêtes API multiples
L’autre méthode pour récupérer tous les messages consiste à effectuer plusieurs requêtes API pour obtenir tous les messages du sujet :
Tout d’abord, vous effectueriez une requête
GETinitiale vers le point de terminaison.../t/{id}.json. Cela contiendra un hachageposts_streamqui contient un tableaupostset un tableaustream. Le tableaupostsvous donnera les 20 premiers messages.Vous devez maintenant parcourir le tableau
streamqui vous donne tous les identifiants de message dans le sujet. Supprimez les 20 premiers identifiants de message du flux (sinon vous les redéchargez inutilement).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, ajouterpost_ids[], et passer tous les identifiants du tableaustreampar lots de 20. Ex\n.../t/{id}/posts.json?post_ids[]=46\u0026post_ids[]=47\u0026post_ids[]=48\u0026post_ids[]=49\u0026post_ids[]=50\u0026post_ids[]=51\u0026post_ids[]=52\u0026post_ids[]=53\u0026post_ids[]=54\u0026post_ids[]=55\u0026post_ids[]=56\u0026post_ids[]=57\u0026post_ids[]=58\u0026post_ids[]=59\u0026post_ids[]=60\u0026post_ids[]=61\u0026post_ids[]=62\u0026post_ids[]=63\u0026post_ids[]=64\u0026post_ids[]=65Limites de débit
Si vous rencontrez un message
Erreur : vous avez effectué cette action de nombreuses fois, veuillez réessayer plus tardlors de l’exécution de plusieurs appels API, cela indique que vous atteignez les limites de débit de la clé API.Discourse a une limite sur le nombre de requêtes
print=truequi peuvent être effectuées par heure, ce qui est contrôlé par le paramètre du sitemax prints per hour per user. Ce paramètre est défini par défaut pour n’autoriser que 5 sujets par heure. Vous pouvez définir ce paramètre sur0pour désactiver la limite de débit.Notez que la limite de débit ne sera pas appliquée si vous utilisez une clé API pour tous les utilisateurs pour les requêtes et fournissez le nom d’utilisateur d’un administrateur du site pour le paramètre
Api-Usernamede la requête. Cela signifie qu’au lieu de désactiver le paramètre du sitemax prints per hour per user, vous pourriez simplement utiliser un nom d’utilisateur administrateur (par exemplesystem) pour les requêtes.Si vous rencontrez des erreurs de limite de débit avec des requêtes API qui ne contiennent pas
print=true, nous vous recommandons d’ajouter un délai à votre script API afin de ne pas dépasser les limites de débit. Alternativement, vous pouvez écouter les codes d’erreur429(trop de requêtes) et ralentir les requêtes lorsque vous recevez cette réponse.À titre de référence, les limites de débit par défaut indiquées ci-dessous s’appliquent à nos plans d’hébergement standard et business :
discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub
Auto-hébergé uniquement - Voir : Available settings for global rate limits and throttling pour plus de détails sur l’ajustement des limites de débit de l’API Discourse.
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.
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).
