Zapier を使用して Discourse API にリクエストを送信する

Discourse API へのリクエストは、Zapier Webhook をアクションステップとして使用する Zap を作成することで自動化できます。このトピックでは、以下のアクションのリクエストを実行する方法について説明します。

  • ユーザーをグループに追加
  • カスタムバッジの付与

Zapier を使用して他の種類の API リクエストを実行する方法については、このトピックを読み、次に Discourse API ドキュメント で目的のアクションを検索してください。また、特定のアクションに対する API リクエストの作成方法については、Reverse engineer the Discourse API を参照してください。

トリガーステップの設定

各 Zap にはトリガーとアクションステップが必要です。トリガーは、アプリケーションから Zap のアクションステップへデータを渡すために使用されます。場合によっては、トリガーは特定の条件を満たすデータがある場合にのみ Zap がアクションステップを完了するように制御するためにも使用できます。

アクションステップを設定するには、Zapier ダッシュボード にアクセスし、「Make a Zap」ボタンをクリックしてください。トリガーアプリを選択するための検索フォームが開きます。

このトピックの例では、テスト用に API 呼び出しを設定しやすい WordPress の「New User」イベントをアクションステップとして使用しています。

トリガーステップの「Test This Step」ノードを使用すると、トリガーアプリから取得したデータサンプルを選択し、Zap のアクションステップに渡すことができます。このデータはアクションステップの設定に役立ちます。

Discourse から詳細を取得するためのオプションステップの追加

トリガーアプリから渡されるデータの種類によっては、最終的な API リクエストを行う前に Discourse からデータを取得する必要がある場合があります。例えば、WordPress の「New User」トリガーは、ユーザーの WordPress ユーザー名とメールアドレスを渡します。メールアドレスは Discourse ユーザーのメールアドレスと一致することはわかっていますが、この例の API リクエストでは、ユーザーの Discourse ユーザー名を知る必要があります。

メールアドレスからユーザーの Discourse 詳細を取得するには、Zap にアクションステップを追加してください。Webhook のアクションメニューから「GET」を選択します。

Webhook の編集テンプレートステップで、Discourse サイトのベース URL の後に /admin/users/list/all.json を続けて URL セクションに入力します。例えば、私のサイトのベース URL が https://demo.scossar.com の場合、URL フィールドに https://demo.scossar.com/admin/users/list/all.json と入力します。

Query String Params セクションで、キーとして「email」を入力し、「Insert a Field」アイコンをクリックしてドロップダウンメニューを開きます。ユーザーのメールアドレスを含むトリガーステップで渡された値を選択してください。

リクエストの認証

フォームを下にスクロールして Headers セクションに移動してください。このセクションはリクエストの認証に使用されます。以下の 3 つのキー/値のペアが必要です。

  • Api-Username : サイトの管理者ユーザー名。ほとんどの場合、「system」ユーザーが適しています。
  • Api-Key : 最初のキー/値のペアで使用したユーザー名に関連付けられた API キー
  • Content-Type : multipart/form-data

完了した Headers セクションは、ユーザーの API キーを使用している場合、以下のような表示になります。

「Continue」ボタンをクリックして、このリクエストに対して Discourse から取得されたデータを確認してください。

最終的なアクションステップの追加

トリガーと Discourse からデータを取得するためのオプションステップが設定されたら、「Add a Step」リンクをクリックし、アクションメニューから「Webhooks by Zapier」を選択してください。その後、Discourse への API リクエストで使用するリクエストメソッドを選択するよう求められます。

このトピックで使用される例に必要なリクエストタイプは以下の通りです。

  • ユーザーをグループに追加: PUT
  • カスタムバッジの付与: POST

このトピックの例以外の API リクエストを設定するには、Discourse API ドキュメント を確認し、目的のリクエストの例があるか調べてください。例が見つからない場合は、Discourse API のリバースエンジニアリング方法 を読み、目的のアクションの URL とリクエストメソッドを見つける方法を学びましょう。リクエストメソッドが見つかったら、アクションメニューから選択してください。

注:リクエストに DELETE メソッドを使用する場合は、アクションメニューから「Custom Request」を選択してください。

最終的なアクションステップの設定

アクションの Headers セクションは、すべての API リクエストで同じ方法で設定できます。詳細については、このトピックの「リクエストの認証」セクションを参照してください。Discourse から詳細を取得するためのオプションステップを追加している場合、最終的なアクションの Headers セクションも、そのステップと同じ方法で設定できます。

Header のキー/値ペアを追加した後、API リクエストのフォームの URL フィールドと Data フィールドを入力する必要があります。

ユーザーをグループに追加

ユーザーをグループに追加するには、/groups/<group_id>/members.json に対して PUT リクエストを送信します。グループ ID を見つける最も簡単な方法は、Discourse UI を通じてグループページにアクセスし、ブラウザのアドレスバーの URL に .json を追加することです。例えば、私のサイトには https://demo.scossar.com/g/support に「support」グループがあります。https://demo.scossar.com/g/support.json にアクセスすると、グループ ID が 41 であることがわかります。私のフォーラムのベース URL は https://demo.scossar.com です。ユーザーをグループに追加する最終的なアクションステップの URL は https://demo.scossar.com/groups/41/members.json に設定されます。

ユーザーをグループに追加するリクエストには、1 つのパラメータ(カンマ区切りのユーザー名リスト)が必要です。フォームの Data セクションで、キーとして「usernames」を入力します。その後、「Insert a Field」アイコンをクリックして、トリガーまたはオプションの GET アクションステップから渡されたユーザー名プロパティを検索してください。

私の場合、GET ステップで取得したユーザー名を使用したいので、「GET」メニューを展開し、ドロップダウンから「Username」を選択します。

フォームの他のセクションはデフォルト値のままにしてください。

「Continue」ボタンをクリックしてステップをテストしてください。以前のステップで渡したユーザーが Discourse サイトに存在し、選択したグループのメンバーでない場合、ステップをテストするとそのユーザーがグループに追加されます。

すべてが期待通りに動作すれば、Zap を有効にしてください。

カスタムバッジの付与

ユーザーにカスタムバッジを付与するには、フォーラムのベース URL に /user_badges を追加した URL に対して POST リクエストを送信します。私のサイトのバッジ付与 URL は https://demo.scossar.com/user_badges です。Zapier での完了した URL フィールドは以下のようになります。

フォームの Data セクションには 2 つのキー/値のペアが必要です。「username」キーを追加し、ユーザー名を返すフィールドに設定してください。「badge_id」キーを追加し、付与したいバッジの ID に設定してください。バッジ ID は、管理画面の「Badges」ページに移動し、左側のメニューからバッジを選択することで確認できます。ブラウザのアドレスバーの URL の最後の値がバッジ ID となります。

私が付与しているバッジの ID は 105 なので、完了した Data セクションは以下のようになります。

フォームの Headers セクションが設定されていることを確認し、「Continue」をクリックしてください。その後、「Send Test」ボタンをクリックして Zap をテストしてください。以前のステップで渡したユーザーにバッジが付与されているはずです。

すべてが正しく動作している場合は、Zap を有効にしてください。

「いいね!」 15

Can this workflow be used to automatically create an account for a new user and add them to a specific discourse group?

The use case here is someone buys a training product, I want to automatically then add them to the relevant discourse sub forum for that product.

I can get the new customer data into Zapier but the regular discourse zap doesn’t have create account capabilities - just wondering if I can do this via the API and webhook link as you describe in this example.

Thanks!

「いいね!」 2

The easiest approach would be to send an invite email to the person after they make a purchase. You can setup the invite so that the user is automatically added to a Discourse group when they accept the invitation. See Automate sending Discourse invite emails with Zapier for details.

If sending invites is not an option for you, it should be possible to use a Zapier webhook to create a Discourse user. The Discourse API Docs give details about the request to create a user.

「いいね!」 8

Thanks @simon I’ll try the email invite. No doubt some people won’t get it/find it/open it but it’s the easier option for sure.

Appreciate the speedy response too!

It’s often easier to have whatever is selling the thing make the discourse api calls directly.

「いいね!」 1

Is there a reason why this works for me when I do it in Zapier, but I get an empty response when I try to do my own fetch request?

I’m using ObservableHQ, but the idea is the same. Shouldn’t this work?:

fetch("https://mycommunity.com/g.json", {
  headers: {
    "Content-Type": "multipart/form-data",
    "Api-Username": Secret("DISCOURSE_USERNAME"),
    "Api-Key": Secret("DISCOURSE_KEY")
  },
  method: "GET",
  mode: "no-cors"
})

Are you able to get any API requests to Discourse working with calls in that format with ObservableHQ? It seems that there must be something wrong with the format of the request.

You can also double check requests by making curl calls from your terminal, or by using Postman.

「いいね!」 1

OK, I figured out what I needed to do:

  1. Install cors-anywhere locally and run the server
  2. Modify the request to include the reverse proxy before the API endpoint and call the json method in the Fetch Response object:
await (fetch("http://localhost:8080/mycommunity.com/g.json", {
  headers: {
    "Api-Username": Secret("DISCOURSE_USERNAME"),
    "Api-Key": Secret("DISCOURSE_KEY")
  },
})).json()
「いいね!」 2

ここに置いておきますね、チェックする価値があるかもしれません:

「いいね!」 2

@simon さん、このハウツーを教えていただきありがとうございます。Zapier で設定を進めているのですが、私のフォーラムにはバッジを付与するためのこの URL が存在しません。

これはすべての Discourse インストールで標準的な URL ではないのでしょうか、それとも最近のアップデートで URL が変更されたのでしょうか?

あるはずです。ただし、Discourse のユーザーインターフェースから直接アクセスできる URL ではありません。ここで説明されている手順に従って、私のサイトのルートを確認しました:Discourse API のリバースエンジニアリング方法。それによると、トピックで提供されている詳細 はまだ最新であるようです。

「いいね!」 2

言うまでもなく、それは私のミスでした。

「いいね!」 1