Discourse REST API の使用例を共有してください 🧑‍💻

こんにちは皆さん :slight_smile:

多くの人が、自動化されたタスクから他のアプリケーションとの連携まで、さまざまな目的でDiscourse APIを使用しています。

どのように使用しているか教えていただけますか?

  • どのような目的で?

  • この目的のために、どのようなテクノロジー/ソフトウェア/プログラミング言語を使用していますか?

いくつか例を挙げますと、私は以下のように使用しています。

  • レビュー可能なアイテムのWebhookを使用しており、PHPスクリプトを実行してDiscourse APIを使用し、自動的にスパマーを削除します。私のコミュニティでは毎日多くのフラグが立てられた投稿があり、スパム検出の精度は100%なので、管理者はこれらのアカウントのほとんどを手動でレビューする必要がなくなり、管理者の作業が楽になります(ただし、このような方法はお勧めしません。使用する前に慎重に検討し、テストしました)。

  • Ko-Fi(寄付サイト)のWebhookを使用しており、PHPスクリプトを介してDiscourse APIを使用し、テーマコンポーネントの設定値を更新します。目標は、Discourseに表示される寄付の進捗バーをリアルタイムで更新することです。

  • Insomniaでテスト目的で使用しています。テストインスタンスに特定のコンテンツを投入したり、作成したいプロジェクトを検討する際にリクエストをテストしたり、メタで人々を助けたりするために使用できます。

皆さんはどうですか?網羅的に記述していただいても構いません。きっと興味深い使い方がたくさんあると思います :slight_smile:


APIに関する参考トピック: Discourse REST API Documentation
公式ドキュメント: https://docs.discourse.org/

「いいね!」 8

私はアマチュア気象学者(天気観測者)のフォーラムを運営しています。私ともう一人が気象データのフィードを提供しており、世界中の何百人もの人々がそれを利用して独自の超局所的な予報を作成しています。

ユーザーの一人が、予報の品質をチェックしたり、フィードの可用性をチェックしたりするための複雑な統計スクリプトを作成しました。彼のスクリプトがフィードに欠落、破損、または遅延したデータを見つけた場合、それはフォーラムのカテゴリに投稿を作成します。このカテゴリは、他の予報担当者が問題に気づき、自分たちにも影響を与える可能性があることを知るために、予測ソフトウェアのサポートに使用されています。

フィードの異常を検出するスクリプトはPHPを使用しています。問題を示すJSONファイルを生成し、次にcURLを使用してAPI経由で投稿をアップロードします。

「いいね!」 6

最近、ステップを連鎖できるさまざまなプラットフォームを試しましたが、その中で興奮したものを共有します。光学文字認識(OCR)で画像内のテキストを検出し、それをDiscourseの投稿に追加します!

私のサンドボックスのトピックで動作方法を示しています: https://notes.maiki.interi.org/t/testing-ocr-calls/403

最初のものはPipedreamで行い、ステップをたどりながらその方法を説明します。そのサービスにはワークフローを共有するベータ機能があり、以下は Pipedream - Connect APIs, AI, databases and more で共有されています。

:information_source: これはPipedreamとDiscourseを使用した詳細なガイドになりますが、私はすでにそのプラットフォームから移行しており、後でもっと共有する予定なので、詳細は控えめにします。:slight_smile:

ステップ

大まかな流れは次のとおりです。画像URLをGoogle Cloud Vision APIに送信し、結果をChatGPTに通し、結果をDiscourseの投稿に追加します。

トリガー

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

これはデータ送信用のWebhookを提供します。Discourseでは、2つの特定のНастройкиでWebhookを作成しました。

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

Post Eventsでのみ発火させることで、最初のトピックがプロセスをトリガーしないようにします。これは、トピックを外部関数(私が「機能的なメモ」と呼ぶもの)を適用するためのホルダーとして計画的に使用できるため、私にとって便利です。

そのタグでのみ発火させることで、タグを使用してトピックごとに生成されるWebhookを制御できます。一般的には、プロセスのロジックを単純に保つために、「functions」タグを1つだけ使用します。

Webhookは多くの情報を含むペイロードを送信します。プロセスの後半でトピックと投稿のIDを使用します。

条件に基づく終了

これは、編集理由が含まれているかどうかを確認するステップです。含まれている場合は、ワークフローを停止します。

最後のステップで編集理由を含めて投稿を更新し、このチェックにより投稿の更新を繰り返さないようにします:sweat_smile:

:information_source: Pipedreamの使用をやめた理由の1つは、Webhookチェックがサービスクレジットを消費していたことです。条件付きでWebhookを処理するために支払う必要があるとは思わないので、移行しました…

画像URLの抽出

このテストでは、各投稿に1つの画像がアップロードされるようにしました。このステップは「cooked」値を確認し、次の正規表現を使用してURLを取得します。

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

Google Cloud Vision API呼び出し

これはPipedreamのカスタムコードステップです。既製のコンポーネントでは私が望むものが得られず、サービスにはプロンプトからコードを記述できるコードアシスタントもあります。これらのAPI呼び出しは簡単なので、この方法で簡単に生成できました。

前のステップの値({{steps.extract_by_regular_expression.$return_value[0].match}})を取得し、これはコードです。

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による編集

前のステップ({{steps.google_cloud.$return_value.responses[0].fullTextAnnotation.text}})からの出力を取得し、ユーザーメッセージとして渡します。システムメッセージには次のように記述しています。

画像内のテキストを検出したvision APIの出力を読んでいます。メッセージを確認し、明確にするために校正してください。コメントなしで、編集されたテキストのみを返してください。

Discourseの投稿に追加

これもカスタムコードセクションです。Pipedreamの既製のDiscourseアクションは数個のシナリオ(トピックまたは投稿の作成)しかカバーしておらず、テキストを投稿に追加したいからです。

まず、コードは次のとおりです。

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

このステップのプロパティは次のように入力されます。

Post ID

元のペイロードから投稿IDを取得します: {{steps.trigger.event.body.post.id}}
これは、その投稿を直接編集するために使用されます。

Text
---

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

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

基本的に、各画像の後に水平線、編集されたテキストの引用ブロック、および生の出力を確認するための詳細を追加したいと考えています。
各投稿には1つの画像が含まれるため、これは非常に簡単に機能します。複数の画像を一度に処理する方法はどうでしょうか? :thinking:

Edit Reason

OCR Text Detection
これは投稿更新の編集理由として追加され、冒頭のステップによる投稿更新ループを防ぎます。 :point_up: :recycle: :ng:

:information_source: 外部サービスを扱う際には、常に編集理由を含めることが非常に役立つと感じています。


これで完了です!私のサンドボックスからわかるように、かなりうまく機能しています!

旅行が近づいており、OpenAIの編集を、必要に応じて英語に翻訳するように微調整する予定です。これは、このワークフローのシステムプロンプトに追加するオプションの1つです。

「いいね!」 2