Condividi i tuoi casi d'uso della Discourse REST API đź§‘

Ciao a tutti :slight_smile:

Molte persone utilizzano l’API di Discourse per vari scopi, da attività automatizzate a interazioni con altre applicazioni.

Potete condividere come la utilizzate?

  • A quale scopo?

  • Quale tecnologia/software/linguaggio di programmazione utilizzate per questo scopo?

Ecco come la utilizzo per fornire alcuni esempi:

  • Utilizzo un webhook per gli elementi revisionabili che esegue uno script PHP, il quale utilizza l’API di Discourse per attivare l’eliminazione automatica degli spammer. Con molti post segnalati ogni giorno nella mia community e con un’accuratezza di rilevamento dello spam del 100%, rende il lavoro di amministratori e moderatori piĂą facile poichĂ© non devono piĂą rivedere manualmente la maggior parte di questi account (non consiglierei di utilizzare un metodo del genere, l’ho pensato e testato attentamente prima di utilizzarlo).

  • Utilizzo un webhook di Ko-Fi (un sito di donazioni) che utilizzerĂ  l’API di Discourse tramite uno script PHP per aggiornare il valore di un’impostazione di un componente tematico. L’obiettivo è avere una barra di avanzamento delle donazioni mostrata su Discourse che verrĂ  aggiornata in tempo reale.

  • La utilizzo per scopi di test con Insomnia. Può essere per popolare la mia istanza di test con contenuti specifici, testare richieste quando penso a progetti che vorrei creare, aiutare le persone su meta, ecc.

E voi? Sentitevi liberi di essere esaustivi, sono sicuro che ci sono molti utilizzi interessanti da ascoltare :slight_smile:


Argomento di riferimento sull’API: Discourse REST API Documentation
Documentazione ufficiale: https://docs.discourse.org/

8 Mi Piace

Gestisco un forum per meteorologi amatoriali (appassionati di meteo). Io e un’altra persona forniamo un feed di dati meteorologici che centinaia di altre persone in tutto il mondo utilizzano per generare le proprie previsioni iper-locali.

Uno dei nostri utenti ha scritto degli script statistici complessi per verificare la qualità delle sue previsioni e anche la disponibilità dei feed. Se i suoi script riscontrano dati mancanti, interrotti o in ritardo nei feed, creano un post nella categoria del forum utilizzata per supportare il software di previsione, consentendo agli altri previsori di sapere che c’è un problema che potrebbe interessare anche loro.

Gli script per rilevare le anomalie dei feed utilizzano PHP. Generano un file JSON che descrive il problema e quindi utilizzano cURL per caricare il post tramite l’API.

6 Mi Piace

Ho sperimentato molto di recente con varie piattaforme che consentono di concatenare passaggi e ne condividerò uno che mi ha entusiasmato: Riconoscimento Ottico dei Caratteri per rilevare testo in un’immagine e aggiungerlo al post di Discourse!

Il mio argomento sandbox mostra come funziona: https://notes.maiki.interi.org/t/testing-ocr-calls/403

Ho fatto la prima cosa su Pipedream e spiegherò come l’ho fatto seguendo i passaggi. C’è una funzionalità beta per la condivisione dei flussi di lavoro su quel servizio e la seguente è condivisa su Pipedream - Connect APIs, AI, databases and more.

:information_source: Sebbene questa sarebbe una guida approfondita all’uso di Pipedream con Discourse, rimarrò leggero sui dettagli, poiché ho già abbandonato quella piattaforma e ne condividerò di più in seguito. :slight_smile:

Passaggi

L’idea generale è: inviare l’URL dell’immagine all’API Google Cloud Vision, elaborare i risultati tramite ChatGPT, quindi aggiungere i risultati al post in Discourse.

Trigger

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

Questo fornisce un webhook per inviare dati. In Discourse ho creato un webhook con due impostazioni specifiche:

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

L’attivazione solo sugli eventi Post significa che il mio argomento iniziale non attiverà il processo; questo mi è utile in modo da poter pianificare l’uso degli argomenti come contenitori per l’applicazione di funzioni esterne (li chiamo “note funzionali”).

L’attivazione solo su quel tag significa che posso usare i tag per controllare quali webhook vengono prodotti per argomento; in generale avrei solo un tag “functions”, per mantenere semplice la logica del processo.
Il webhook invia un payload con molte informazioni e utilizzeremo gli ID dell’argomento e del post in seguito nel processo.

Fine basata su condizione

Questo è un passaggio per verificare se è incluso un motivo di modifica. In caso affermativo, interrompe il flusso di lavoro.
Nell’ultimo passaggio aggiorno il post e includo un Motivo di Modifica, e questo controllo mi assicura di non continuare ad aggiornare il post… :sweat_smile:

:information_source: Uno dei motivi per cui ho smesso di usare Pipedream è stato perché i miei controlli webhook consumavano crediti sul servizio. Non penso di dover pagare per elaborare condizionalmente un webhook, da qui il mio allontanamento…

Estrai l’URL dell’immagine

Ho deciso per questo test che ogni post avrebbe una singola immagine caricata. Questo passaggio controlla il valore “cooked” e utilizza la seguente espressione regolare per estrarre l’URL:

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

Chiamata all’API Google Cloud Vision

Questo è un passaggio di codice personalizzato su Pipedream. I componenti predefiniti non facevano quello che volevo, e il servizio ha anche un assistente di codice che può scrivere codice da un prompt; poiché queste chiamate API sono semplici, è stato facile produrle con questo metodo.
Prende il valore del passaggio precedente ({{steps.extract_by_regular_expression.$return_value[0].match}}) ed ecco il codice:

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 per la modifica

Prende l’output dal passaggio precedente ({{steps.google_cloud.$return_value.responses[0].fullTextAnnotation.text}}) e lo passa come messaggio Utente. Per il messaggio di sistema ho:

Sei lettura dell’output di un’API di visione che ha rilevato testo in un’immagine. Rivedi il messaggio e correggilo per chiarezza. Restituisci solo il testo modificato senza commenti.

Aggiungi al post in Discourse

Un’altra sezione di codice personalizzato, poiché le azioni Discourse predefinite in Pipedream (Discourse actions in Pipedream) coprono solo un paio di scenari (crea un argomento o un post), e voglio aggiungere il testo al post.
Innanzitutto, ecco il codice:

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,
        },
      },
    });
  },
});

Quelle proprietĂ  per il passaggio sono riempite in questo modo:

ID Post

Estrae l’ID del post dal payload originale: {{steps.trigger.event.body.post.id}}
Questo viene utilizzato per modificare direttamente quel post.

Testo
---

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

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

In sostanza, voglio aggiungere una linea orizzontale sotto ogni immagine, con una blockquote del testo modificato e i dettagli per controllare l’output grezzo.
Poiché ogni post conterrà un’immagine, questo funziona molto facilmente. Mi chiedo come fare con più immagini contemporaneamente? :thinking:

Motivo Modifica

OCR Text Detection
Questo viene aggiunto come motivo di modifica per l’aggiornamento del post, il che impedirà un loop di aggiornamento del post a causa del passaggio all’inizio. :point_up: :recycle: :ng:

:information_source: Trovo molto utile includere sempre un motivo di modifica, specialmente quando si ha a che fare con servizi esterni.


E questo è tutto! Come puoi vedere dal mio sandbox, funziona abbastanza bene!
Ho un viaggio in arrivo e ho intenzione di perfezionare la modifica di OpenAI per tradurre anche in inglese, se necessario, questa è un’opzione che avrei aggiunto al prompt di sistema per questo flusso di lavoro.

2 Mi Piace