Teilen Sie Ihre Anwendungsfälle mit der Discourse REST API 🧑

Hallo zusammen :slight_smile:

Viele Leute nutzen die Discourse API fĂĽr verschiedene Zwecke, von automatisierten Aufgaben bis hin zur Interaktion mit anderen Anwendungen.

Könnt ihr teilen, wie ihr sie nutzt?

  • Zu welchem Zweck?

  • Welche Technologie/Software/Programmiersprache nutzt ihr dafĂĽr?

Hier sind ein paar Beispiele, wie ich sie nutze:

  • Ich nutze einen Webhook fĂĽr „reviewable items“, der ein PHP-Skript ausfĂĽhrt. Dieses Skript nutzt die Discourse API, um die automatische Löschung von Spammern auszulösen. Da täglich viele Beiträge in meiner Community markiert werden und die Spam-Erkennungsgenauigkeit bei 100 % liegt, erleichtert dies die Arbeit der Administratoren und Moderatoren, da sie die meisten dieser Konten nicht mehr manuell ĂĽberprĂĽfen mĂĽssen (ich wĂĽrde diese Methode jedoch nicht empfehlen, ich habe sie sorgfältig durchdacht und getestet, bevor ich sie eingesetzt habe).

  • Nutze einen Ko-Fi (eine Spenden-Website) Webhook, der ĂĽber ein PHP-Skript die Discourse API nutzt, um den Einstellungswert einer Theme-Komponente zu aktualisieren. Ziel ist es, eine Spenden-Fortschrittsanzeige auf Discourse anzuzeigen, die in Echtzeit aktualisiert wird.

  • Ich nutze sie zu Testzwecken mit Insomnia. Dies kann dazu dienen, meine Testinstanz mit spezifischen Inhalten zu fĂĽllen, Anfragen zu testen, wenn ich ĂĽber Projekte nachdenke, die ich erstellen möchte, Leuten im Meta-Bereich zu helfen usw.

Was ist mit euch? Fühlt euch frei, ausführlich zu sein, ich bin sicher, es gibt viele interessante Anwendungsfälle zu hören :slight_smile:


Referenzthema zur API: Discourse REST API Documentation
Offizielle Dokumentation: https://docs.discourse.org/

8 „Gefällt mir“

Ich betreibe ein Forum fĂĽr Amateur-Meteorologen (Wetterbeobachter). Ich und eine weitere Person stellen einen Feed mit Wetterdaten bereit, den Hunderte von anderen Menschen auf der ganzen Welt nutzen, um ihre eigenen hyperlokalen Vorhersagen zu erstellen.

Einer unserer Benutzer hat einige komplexe statistische Skripte geschrieben, um die Qualität seiner Vorhersagen zu überprüfen und auch die Verfügbarkeit der Feeds zu überprüfen. Wenn seine Skripte fehlende, fehlerhafte oder verspätete Daten in den Feeds finden, erstellen sie einen Beitrag in der Forenkategorie, die zur Unterstützung der Prognosesoftware verwendet wird, damit die anderen Prognostiker wissen, dass es ein Problem gibt, das sie ebenfalls betreffen könnte.

Die Skripte zur Erkennung von Feed-Anomalien verwenden PHP. Sie generieren eine JSON-Datei, die das Problem beschreibt, und verwenden dann cURL, um den Beitrag ĂĽber die API hochzuladen.

6 „Gefällt mir“

Ich habe kürzlich viel experimentiert mit verschiedenen Plattformen, die das Verketten von Schritten ermöglichen, und ich teile eine, die mich begeistert hat: Optical Character Recognition (OCR) zur Erkennung von Text in einem Bild und das Anhängen an den Discourse-Post!

Mein Sandbox-Thema zeigt, wie es funktioniert: https://notes.maiki.interi.org/t/testing-ocr-calls/403

Ich habe das erste auf Pipedream gemacht und werde erklären, wie ich es gemacht habe, indem ich die Schritte nachvollziehe. Es gibt eine Beta-Funktion zum Teilen von Workflows auf diesem Dienst, und das Folgende wird unter Pipedream - Connect APIs, AI, databases and more geteilt.

:information_source: Obwohl dies eine ausführliche Anleitung zur Verwendung von Pipedream mit Discourse wäre, halte ich mich mit den Details zurück, da ich diese Plattform bereits verlassen habe und später mehr darüber berichten werde. :slight_smile:

Schritte

Die grobe Gliederung ist: Bild-URL an die Google Cloud Vision API senden, die Ergebnisse durch ChatGPT laufen lassen und dann die Ergebnisse an den Post in Discourse anhängen.

Trigger

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

Dies stellt einen Webhook zur Verfügung, an den Daten gesendet werden können. In Discourse habe ich einen Webhook mit zwei spezifischen Einstellungen erstellt:

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

Nur das Auslösen bei Post-Ereignissen bedeutet, dass mein anfängliches Thema den Prozess nicht auslöst; das ist für mich nützlich, damit ich Themen als Halter für die Anwendung externer Funktionen (ich nenne sie “funktionale Notizen”) verwenden kann.

Nur das Auslösen bei diesem Tag bedeutet, dass ich Tags verwenden kann, um zu steuern, welche Webhooks pro Thema erzeugt werden; im Allgemeinen hätte ich nur einen “functions”-Tag, um die Prozesslogik einfach zu halten.
Der Webhook sendet eine Payload mit vielen Informationen, und wir werden die Topic- und Post-IDs später im Prozess verwenden.

Ende basierend auf Bedingung

Dies ist ein Schritt, um zu prĂĽfen, ob ein Bearbeitungsgrund angegeben ist. Wenn ja, stoppt er den Workflow.
Im letzten Schritt aktualisiere ich den Beitrag und füge einen Bearbeitungsgrund hinzu, und diese Prüfung stellt sicher, dass ich den Beitrag nicht immer wieder aktualisiere… :sweat_smile:

:information_source: Einer der Gründe, warum ich Pipedream nicht mehr verwende, war, dass meine Webhook-Prüfungen Credits auf dem Dienst verbrauchten. Ich glaube nicht, dass ich dafür bezahlen sollte, einen Webhook bedingt zu verarbeiten, daher mache ich weiter…

Bild-URL extrahieren

Ich habe beschlossen, dass jeder Beitrag für diesen Test ein einzelnes Bild hochgeladen bekommt. Dieser Schritt prüft den “cooked”-Wert und verwendet den folgenden regulären Ausdruck, um die URL zu extrahieren:

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

Google Cloud Vision API-Aufruf

Dies ist ein benutzerdefinierter Code-Schritt auf Pipedream. Die vorgefertigten Komponenten taten nicht, was ich wollte, und der Dienst hat auch einen Code-Assistenten, der Code aus einer Eingabeaufforderung schreiben kann; da diese API-Aufrufe unkompliziert sind, war es einfach, sie auf diese Weise zu erstellen.

Er nimmt den Wert des vorherigen Schritts ({{steps.extract_by_regular_expression.$return_value[0].match}}) und das ist der 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 zur Bearbeitung

Nimmt die Ausgabe des vorherigen Schritts ({{steps.google_cloud.$return_value.responses[0].fullTextAnnotation.text}}) und ĂĽbergibt sie als Benutzernachricht. FĂĽr die Systemnachricht habe ich:

Sie lesen die Ausgabe einer Vision-API, die Text in einem Bild erkannt hat. ĂśberprĂĽfen Sie die Nachricht und bearbeiten Sie sie zur besseren Lesbarkeit. Geben Sie nur den bearbeiteten Text ohne Kommentare zurĂĽck.

An den Post in Discourse anhängen

Ein weiterer benutzerdefinierter Code-Abschnitt, da die vorgefertigten Discourse-Aktionen in Pipedream nur ein paar Szenarien abdecken (einen Beitrag oder ein Thema erstellen) und ich den Text an den Beitrag anhängen möchte.

Hier ist zuerst der 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,
        },
      },
    });
  },
});

Diese Eigenschaften fĂĽr den Schritt werden wie folgt ausgefĂĽllt:

Post ID

Holt die Post-ID aus der ursprĂĽnglichen Payload: {{steps.trigger.event.body.post.id}}
Dies wird verwendet, um diesen Beitrag direkt zu bearbeiten.

Text
---

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

[details="Detected text"]
{{steps.google_cloud.$return_value.responses[0].textAnnotations[0].description}}
[/details]

Grundsätzlich möchte ich eine horizontale Linie unter jedem Bild hinzufügen, mit einem Blockquote des bearbeiteten Textes und den Details, um die Rohausgabe zu überprüfen.
Da jeder Beitrag ein Bild enthalten wird, funktioniert dies sehr einfach. Ich frage mich, wie man das mit mehreren Bildern gleichzeitig macht? :thinking:

Bearbeitungsgrund

OCR Text Detection
Dies wird als Bearbeitungsgrund fĂĽr die Beitragsaktualisierung hinzugefĂĽgt, was eine Endlosschleife bei der Beitragsaktualisierung aufgrund des Schritts am Anfang verhindert. :point_up: :recycle: :ng:

:information_source: Ich finde es super hilfreich, immer einen Bearbeitungsgrund anzugeben, besonders wenn man mit externen Diensten arbeitet.


Und das ist alles! Wie Sie in meinem Sandbox-Thema sehen können, funktioniert es ziemlich gut!
Ich habe eine bevorstehende Reise und plane, die OpenAI-Bearbeitung zu verfeinern, um bei Bedarf auch ins Englische zu übersetzen. Das ist eine Option, die ich der Systemaufforderung für diesen Workflow hinzugefügt hätte.

2 „Gefällt mir“