Conseil d'écriture de bot : Traiter chaque publication

:information_source: 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.

:information_source: 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 :satellite: 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_posts dans 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 id dans message.
    • Définissez l’ID du dernier message vu sur l’ID du message.
    • Définissez l’indicateur nouveaux messages vus.
    • :white_check_mark: Émettez message. (:information_source: 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.
  • :information_source: 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 :floppy_disk: persister l’état dans le stockage avec l’ID du dernier message vu.
  • 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 :satellite: 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 posts dans la réponse du dernier sondage.
  • Pour chaque objet JSON message dans messages de sondage :
    • Soit ID du message le nombre JSON à l’emplacement id dans message.
    • Terminez ces étapes en renvoyant l’ID du message.
  • 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é, :white_check_mark: 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 :arrow_forward: 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 :floppy_disk: 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 :satellite: 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 :

  • :satellite: 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-After fournies par le serveur lorsqu’une erreur 429 est rencontrée.
  • :arrow_forward: restauration de l’état depuis le stockage
  • :floppy_disk: persister l’état dans le stockage, prenant un entier
  • :satellite: s’abonner au bus de messages

14 « J'aime »