Partagez vos cas d'utilisation de l'API REST Discourse 🧑‍💻

Salut tout le monde :slight_smile:

De nombreuses personnes utilisent l’API Discourse à diverses fins, des tâches automatisées aux interactions avec d’autres applications.

Pouvez-vous partager comment vous l’utilisez ?

  • Ă€ quelle fin ?

  • Quelle technologie/logiciel/langage de programmation utilisez-vous Ă  cet effet ?

Voici comment je l’utilise pour donner quelques exemples :

  • J’utilise un webhook d’élĂ©ment vĂ©rifiable qui exĂ©cute un script PHP, lequel utilise l’API de Discourse pour dĂ©clencher la suppression automatique des spammeurs. Avec de nombreux messages signalĂ©s chaque jour dans ma communautĂ©, et avec une prĂ©cision de dĂ©tection de spam de 100 %, cela facilite le travail des administrateurs et des modĂ©rateurs car ils n’ont plus Ă  examiner manuellement la plupart de ces comptes (je ne recommanderais pas d’utiliser une telle mĂ©thode cependant, j’y ai soigneusement rĂ©flĂ©chi et je l’ai testĂ©e avant de l’utiliser).

  • Utilise un webhook Ko-Fi (un site de dons) qui utilisera l’API de Discourse via un script PHP pour mettre Ă  jour la valeur d’un paramètre d’un composant de thème. L’objectif est d’avoir une barre de progression des dons affichĂ©e sur Discourse qui sera mise Ă  jour en temps rĂ©el.

  • Je l’utilise Ă  des fins de test avec Insomnia. Cela peut ĂŞtre pour peupler mon instance de test avec du contenu spĂ©cifique, tester des requĂŞtes lorsque je rĂ©flĂ©chis Ă  des projets que j’aimerais crĂ©er, aider les gens sur meta, etc.

Et vous ? N’hésitez pas à être exhaustif, je suis sûr qu’il y a beaucoup d’utilisations intéressantes à entendre :slight_smile:


Sujet de référence sur l’API : Discourse REST API Documentation
Documentation officielle : https://docs.discourse.org/

8 « J'aime »

J’administre un forum pour les météorologues amateurs (observateurs de la météo). Mon collègue et moi fournissons un flux de données météorologiques que des centaines d’autres personnes dans le monde utilisent pour générer leurs propres prévisions hyper-locales.

L’un de nos utilisateurs a écrit des scripts statistiques complexes pour vérifier la qualité de ses prévisions et aussi la disponibilité des flux. Si ses scripts détectent des données manquantes, défectueuses ou retardées dans les flux, ils créent un message dans la catégorie du forum utilisée pour le support du logiciel de prévision, ce qui permet aux autres prévisionnistes de savoir qu’il y a un problème qui pourrait aussi les affecter.

Les scripts de détection d’anomalies de flux utilisent PHP. Ils génèrent un fichier JSON décrivant le problème, puis utilisent cURL pour téléverser le message via l’API.

6 « J'aime »

J’ai beaucoup expérimenté récemment avec diverses plateformes qui permettent d’enchaîner des étapes, et je vais partager celle qui m’a enthousiasmé : la reconnaissance optique de caractères (OCR) pour détecter du texte dans une image, et l’ajouter au message Discourse !

Mon sujet de bac Ă  sable montre comment cela fonctionne : https://notes.maiki.interi.org/t/testing-ocr-calls/403

J’ai fait le premier sur Pipedream, et je vais expliquer comment je l’ai fait en suivant les étapes. Il existe une fonctionnalité bêta pour partager des flux de travail sur ce service, et le suivant est partagé à l’adresse https://pipedream.com/new?h=tch_3Z6fa9.

:information_source: Bien que cela puisse constituer un guide approfondi sur l’utilisation de Pipedream avec Discourse, je vais rester léger sur les détails, car j’ai déjà quitté cette plateforme et j’en partagerai davantage plus tard. :slight_smile:

Étapes

L’ébauche est la suivante : envoyer l’URL de l’image à l’API Google Cloud Vision, traiter les résultats avec ChatGPT, puis ajouter les résultats au message dans Discourse.

Déclencheur

Screenshot 2023-08-08 at 11-23-21 OCR Test - Pipedream

Cela fournit un webhook pour envoyer des données. Dans Discourse, j’ai créé un webhook avec deux paramètres spécifiques :

Screenshot 2023-08-08 at 11-24-41 Admin - notes

Le déclenchement uniquement sur les événements de message signifie que mon sujet initial ne déclenchera pas le processus ; c’est utile pour moi afin de pouvoir utiliser les sujets comme conteneurs pour appliquer des fonctions externes (je les appelle des “notes fonctionnelles”).

Le déclenchement uniquement sur cette étiquette signifie que je peux utiliser les étiquettes pour contrôler les webhooks produits par sujet ; en général, je n’aurais qu’une seule étiquette “fonctions”, pour maintenir la logique du processus simple.

Le webhook envoie une charge utile avec beaucoup d’informations, et nous utiliserons les ID de sujet et de message plus tard dans le processus.

Fin basée sur une condition

C’est une étape pour vérifier si une raison de modification est incluse. Si c’est le cas, cela arrête le flux de travail.

Dans la dernière étape, je mets à jour le message et j’inclus une raison de modification, et cette vérification m’empêche de continuer à mettre à jour le message… :sweat_smile:

:information_source: L’une des raisons pour lesquelles j’ai arrêté d’utiliser Pipedream est que mes vérifications de webhook consommaient des crédits sur le service. Je ne pense pas devoir payer pour traiter conditionnellement un webhook, d’où mon départ…

Extraire l’URL de l’image

J’ai décidé pour ce test que chaque message aurait une seule image téléchargée. Cette étape vérifie la valeur “cooked” et utilise l’expression régulière suivante pour extraire l’URL :

/https?:\/\/[^\s"]+/

Appel à l’API Google Cloud Vision

C’est une étape de code personnalisé sur Pipedream. Les composants pré-faits ne faisaient pas ce que je voulais, et le service dispose également d’un assistant de code qui peut écrire du code à partir d’une invite ; comme ces appels API sont simples, il était facile de les produire de cette manière.

Il prend la valeur de l’étape précédente ({{steps.extract_by_regular_expression.$return_value[0].match}}), et voici le code :

import { axios } from "@pipedream/platform";

export default defineComponent({
  props: {
    imageUrl: {
      type: "string",
      label: "Image URL",
      description: "URL of the image to be processed by Google Vision API",
    },
    apiKey: {
      type: "string",
      label: "API Key",
      description: "Your Google Cloud API Key",
      secret: true,
    },
  },
  async run() {
    const url = `https://vision.googleapis.com/v1/images:annotate?key=${this.apiKey}`;
    const body = {
      requests: [
        {
          image: {
            source: {
              imageUri: this.imageUrl,
            },
          },
          features: [
            {
              type: "TEXT_DETECTION",
            },
          ],
        },
      ],
    };

    const config = {
      method: "POST",
      url,
      data: body,
    };

    const response = await axios(this, config);
    return response;
  },
});

ChatGPT pour l’édition

Prend la sortie de l’étape précédente ({{steps.google_cloud.$return_value.responses[0].fullTextAnnotation.text}}) et la transmet comme message utilisateur. Pour le message système, j’ai :

Vous lisez la sortie d’une API de vision qui a détecté du texte dans une image. Examinez le message et corrigez-le pour plus de clarté. Retournez uniquement le texte édité sans commentaire.

Ajouter au message dans Discourse

Une autre section de code personnalisé, car les actions Discourse pré-faites dans Pipedream ne couvrent que quelques scénarios (créer un sujet ou un message), et je veux ajouter le texte au message.

Voici d’abord le code :

import { axios } from "@pipedream/platform";

export default defineComponent({
  props: {
    discourse: {
      type: "app",
      app: "discourse",
    },
    postId: {
      type: "string",
      label: "Post ID",
      description: "The ID of the post to append text to",
    },
    text: {
      type: "string",
      label: "Text",
      description: "The text to append to the post",
    },
    editReason: {
      type: "string",
      label: "Edit Reason",
      description: "The reason for editing the post",
      optional: true,
    },
  },
  async run({ steps, $ }) {
    const url = `https://${this.discourse.$auth.domain}/posts/${this.postId}.json`;
    const response = await axios($, {
      method: "GET",
      url: url,
      headers: {
        "Api-Username": `${this.discourse.$auth.api_username}`,
        "Api-Key": `${this.discourse.$auth.api_key}`,
      },
    });

    const updatedText = `${response.raw} ${this.text}`;

    return await axios($, {
      method: "PUT",
      url: url,
      headers: {
        "Api-Username": `${this.discourse.$auth.api_username}`,
        "Api-Key": `${this.discourse.$auth.api_key}`,
      },
      data: {
        post: {
          raw: updatedText,
          edit_reason: this.editReason,
        },
      },
    });
  },
});

Ces propriétés pour l’étape sont remplies comme suit :

ID du message

Récupère l’ID du message de la charge utile d’origine : {{steps.trigger.event.body.post.id}}
Ceci est utilisé pour modifier ce message directement.

Texte
---

<blockquote>
 {{steps.chat.$return_value.generated_message.content}}
</blockquote>

[details="Texte détecté"]
{{steps.google_cloud.$return_value.responses[0].textAnnotations[0].description}}
[/details]

En gros, je veux ajouter une ligne horizontale sous chaque image, avec une citation du texte édité, et les détails pour vérifier la sortie brute.
Comme chaque message contiendra une image, cela fonctionne très facilement. Je me demande comment faire avec plusieurs images à la fois ? :thinking:

Raison de la modification

Détection de texte OCR
Ceci est ajouté comme raison de modification pour la mise à jour du message, ce qui empêchera une boucle de mise à jour du message due à l’étape du début. :point_up: :recycle: :ng:
:information_source: Je trouve très utile d’inclure toujours une raison de modification, surtout lorsque l’on traite avec des services externes.


Et c’est tout ! Comme vous pouvez le voir sur mon bac à sable, cela fonctionne assez bien !

J’ai un voyage à venir, et je prévois d’affiner l’édition OpenAI pour traduire également en anglais si nécessaire, c’est une option que j’aurais ajoutée à l’invite système pour ce flux de travail.

2 « J'aime »