Remarque : Ce guide suppose que vous exploitez un bot autorisé sur un forum Discourse, potentiellement en utilisant l’API Utilisateur ou une clé API Administrateur. Si votre bot est bloqué par les administrateurs, discutez de son objectif avec eux et ne tentez pas de contourner ce blocage.
Votre bot serait-il plus efficace s’il était exécuté sur le serveur ? Envisagez de créer un plugin à la place : Developing Discourse Plugins - Part 1 - Create a basic plugin
Introduction
Ce guide présente un algorithme permettant à un utilisateur bot d’inspecter et de traiter chaque message publié sur un forum Discourse auquel l’utilisateur du bot a accès (à l’exception des messages privés).
Vous aurez besoin d’un stockage durable pour un entier unique, représentant l’ID du dernier message traité avec succès. Par exemple, vous pouvez l’écrire dans Redis ou dans un fichier texte brut. L’utilisation de Redis vous permettra de conserver les abonnements au bus de messages même après les redémarrages de processus de votre côté.
Il est fortement recommandé de créer un tout nouveau compte utilisateur pour le bot, afin qu’il puisse être ajouté à des groupes et recevoir des messages privés si nécessaire. Évitez d’utiliser le compte @system.
L’ensemble d’algorithmes suivant est rédigé dans le style de la spécification WHATWG et construit progressivement l’algorithme pour surveiller continuellement les nouveaux messages.
Spécifications des algorithmes
Soit l’URL de base du forum l’URL du site sans barre oblique finale, par exemple https://meta.discourse.org ou https://www.contoso.com/forum pour les installations dans un sous-dossier.
Récupérer les prochains messages récents
Pour récupérer les prochains messages récents étant donné un entier ID du dernier message vu et un indicateur déclenché par le bus de messages, exécutez les étapes suivantes :
- Soit ID maximum de réponse le résultat de l’ajout de cinquante (50) à l’ID du dernier message vu.
- Soit URI de la requête la concaténation de l’URL de base du forum,
/posts.json,?before=, et de l’ID maximum de réponse. - Soit réponse le résultat de
récupération JSON en respectant les limites de taux avec l’URI de la requête et les identifiants. - Si la réponse est une erreur HTTP, interrompez ces étapes avec une erreur.
- Soit messages le tableau JSON à l’emplacement
latest_postsdans la réponse. - Soit l’indicateur nouveaux messages vus non défini.
- Pour chaque objet JSON message dans messages, dans l’ordre inverse, exécutez ces étapes :
- Soit ID du message le nombre JSON à l’emplacement
iddans message. - Définissez l’ID du dernier message vu sur l’ID du message.
- Définissez l’indicateur nouveaux messages vus.
Émettez message. (
En d’autres termes : envoyez le message au traitement personnalisé que vous souhaitez effectuer.)- Si l’émission a renvoyé un signal de contre-pression, brisez cette boucle.
- Soit ID du message le nombre JSON à l’emplacement
-
La boucle ci-dessus s’exécute dans l’ordre inverse afin que votre code voie les messages les plus anciens en premier et les plus récents en dernier. - Si l’indicateur nouveaux messages vus est défini :
- Exécutez les étapes pour
persister l’état dans le stockage avec l’ID du dernier message vu.
- Exécutez les étapes pour
- Terminez ces étapes en retournant l’ID du dernier message vu.
Sonder un ID de message existant élevé
Pour sonder un ID de message existant élevé, exécutez les étapes suivantes :
- Soit URI de la dernière requête de sondage la concaténation de l’URL de base du forum et de
/posts.json. - Soit réponse du dernier sondage le résultat de
récupération JSON en respectant les limites de taux avec l’URI de la dernière requête de sondage et les identifiants. - Si la réponse du dernier sondage est une erreur HTTP, interrompez ces étapes avec une erreur.
- Soit messages de sondage le tableau JSON à l’emplacement
latest postsdans la réponse du dernier sondage. - Pour chaque objet JSON message dans messages de sondage :
- Soit ID du message le nombre JSON à l’emplacement
iddans message. - Terminez ces étapes en renvoyant l’ID du message.
- Soit ID du message le nombre JSON à l’emplacement
- Interrompez ces étapes avec une erreur.
Remplissage rétroactif depuis le dernier
Pour remplir rétroactivement depuis le dernier étant donné un entier optionnel ID du dernier message vu, exécutez les étapes suivantes :
- Soit ID minimum du message l’ID du dernier message vu s’il est présent, et zéro (0) sinon.
- Soit ID de message existant élevé le résultat de sonder un ID de message existant élevé.
- Si l’ID de message maximum est une erreur, interrompez ces étapes avec une erreur.
- Exécutez les étapes pour remplir rétroactivement étant donné l’ID minimum du message et l’ID de message existant élevé.
Remplissage rétroactif
Pour remplir rétroactivement étant donné deux entiers ID minimum du message et ID de message existant élevé :
- Soit ID minimum actuel du message l’ID minimum du message.
- Répétez ces étapes :
- Exécutez les étapes pour récupérer les prochains messages récents étant donné l’ID minimum actuel du message et un indicateur déclenché par le bus de messages non défini.
- Si les étapes pour récupérer les prochains messages récents ne se sont pas terminées avec succès :
- Mettez à jour l’algorithme de réessai exponentiel avec un signal d’échec et attendez la durée spécifiée.
- Passez à l’itération suivante de la boucle (sans mettre à jour l’ID minimum actuel du message).
- Soit ID de réponse maximum candidat le résultat de l’ajout de cinquante (50) à l’ID minimum actuel du message.
- Si l’ID de réponse maximum candidat est supérieur ou égal à l’ID de message existant élevé,
terminez ces étapes. - Définissez l’ID minimum actuel du message sur l’ID de réponse maximum candidat.
Surveillance continue des nouveaux messages
Pour surveiller continuellement les nouveaux messages, exécutez les étapes suivantes :
- Soit ID du dernier message vu un entier optionnel non défini.
- Définissez l’ID du dernier message vu sur le résultat de
restauration de l’état depuis le stockage. - Si l’ID du dernier message vu est non défini :
- Définissez ID initial du message sur le résultat de sonder un ID de message existant élevé.
- Exécutez les étapes pour
persister l’état dans le stockage avec l’ID initial du message. - Définissez l’ID du dernier message vu sur l’ID initial du message.
- Définissez notifications sur le résultat de l’exécution des étapes pour
s’abonner au bus de messages, avec un canal /latest. - Exécutez les étapes suivantes de manière répétée :
- Définissez nouvel ID du dernier message vu sur le résultat de récupérer les prochains messages récents, avec l’indicateur déclenché par le bus de messages défini si une mise à jour du bus de messages s’est produite, et l’ID du dernier message vu.
- Si les étapes pour récupérer les prochains messages récents ne se sont pas terminées avec succès :
- Mettez à jour l’algorithme de réessai exponentiel avec un signal d’échec et attendez la durée spécifiée.
- Passez à l’itération suivante de la boucle.
- Si le nouvel ID du dernier message vu est différent de l’ID du dernier message vu :
- Mettez à jour l’algorithme de réessai exponentiel avec un signal de succès.
- Définissez l’ID du dernier message vu sur le nouvel ID du dernier message vu.
- Attendez un message sur notifications ou qu’un délai d’attente défini par l’implémentation se produise. Ce délai doit être d’au moins 10 minutes et peut raisonnablement aller jusqu’à 24 heures ou légèrement plus.
Algorithmes que vous devez fournir :
récupération JSON en respectant les limites de taux, prenant un URI de requête et des identifiants optionnels.
- Cela doit automatiquement effectuer un réessai exponentiel et/ou utiliser les informations
Retry-Afterfournies par le serveur lorsqu’une erreur 429 est rencontrée.
- Cela doit automatiquement effectuer un réessai exponentiel et/ou utiliser les informations
restauration de l’état depuis le stockage
persister l’état dans le stockage, prenant un entier
s’abonner au bus de messages