IFTTT で新しいトピック、投稿、PM を生成する

IFTTT を使って新しいトピック、投稿、またはプライベートメッセージを作成したいですか?さっそく始めましょう!

IFTTT サービスの Maker Webhooks を使用することで、Discourse API への呼び出しが可能です。そのためには、まず API キーを生成する必要があります。API キーは管理パネルの /admin/api/keys から作成できます。

また、ユーザー管理ページを通じてユーザー固有の API キーを生成することも可能です。

次に、IFTTT で 新しいアプリレットを作成 し、お好みのトリガーサービスを選択します。ここでは例として Google カレンダー サービスを使用します。

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/3/4/341b41d93de97b271496b99dcc53d21df4089ac4.png" width="591" height="409"\u003e

次に、新しいイベントが追加された場合 というトリガーを選択します。

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/a/9/a92552c97474e03de602f8f5b134e4d3929bc76b.png" width="690" height="330"\u003e

トリガーを Discourse に接続するには、アクションサービスとして Maker Webhooks を、アクションとして Web リクエストを送信 を選択します。

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/c/9/c9522a31c798594cadafc8f3962b0eb4cccc6a13.png" width="681" height="500"\u003e

次に、アクションフィールドを以下のように設定します。

  • URL (必須): https://discourse.example.com/posts.json
  • メソッド (必須): POST
  • コンテンツタイプ: application/json
  • 追加ヘッダー:
Api-Key: [YOUR_API_KEY]
Api-Username: [API_USERNAME]

\u003e :warning: 重要: API 認証情報は URL クエリパラメータではなく、HTTP ヘッダー (Api-Key および Api-Username) として送信する必要があります。Discourse は POST リクエストにおけるクエリパラメータ経由の API キー認証を受け付けません。IFTTT の Maker Webhooks サービスではカスタムヘッダーがサポートされています。追加ヘッダー フィールドを使用してヘッダーを追加してください。

  • ボディ:
{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\n場所: {{Where}}\n時刻: {{Starts}} - {{Ends}}",
 "category": 4,
 "created_at": "{{CreatedAt}}"
}

\u003cimg src="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/7/7/77365735ed9f95d460f2de4c16bcb13dbfda9ea0.png" width="194" height="500"\u003e

ボディテキストには {{ }} で囲まれた多くのフィールドが表示されます。これらのフィールド(コンテンツソース)は、サービスやトリガーによって異なります。下部の Ingredient ボタンから選択してください。

JSON ボディ内の titleraw フィールドは、必要に応じて周囲のテキストと共に編集できます。カテゴリ ID は、サイト内の /site.json URL から確認し、カテゴリフィールドに設定してください。その後、アクションを作成 ボタンをクリックしてアプリレットを作成します。アプリレット作成後、公開されるまで少し時間がかかる場合があります。

これで完了です :sunglasses:。これで、Google カレンダーに新しいイベントが追加されるたびに、新しいトピックが自動的に作成されるようになります :calendar_spiral:


新しいトピックの作成ではなく、既存のトピックへの返信を投稿するには、ボディテキストを以下のように変更します(category の代わりに topic_id を使用)。

{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\n場所: {{Where}}\n時刻: {{Starts}} - {{Ends}}",
 "topic_id": 4,
 "created_at": "{{CreatedAt}}"
}

新しいプライベートメッセージを作成するには:

{
 "title": "{{Title}}",
 "raw": "{{Description}}\n\n場所: {{Where}}\n時刻: {{Starts}} - {{Ends}}",
 "target_usernames": "discourse1,discourse2",
 "archetype": "private_message",
 "created_at": "{{CreatedAt}}"
}

この方法と同様に、他の IFTTT アクションサービス を使用して Discourse API リクエストを作成することも可能です。

「いいね!」 22

I wonder if this option is no longer free and only available as a premium for developers ?

「いいね!」 1

Discourse API ドキュメント に基づくと、Api_usernameApi_key は HTTP リクエストヘッダーで送信する必要があります。GET パラメータとして送信しても機能しません。

試してみましたが失敗しました。そのため、ここで指示された通り IFTTT を使用することができませんでした…

しかし、最終的には、Discourse に適切な設定でデータを送信できる簡易的なカスタム PHP スクリプト(リレーフックとして機能するもの)を作成しました。

コード
<?php
header('Content-Type: application/json');

// POST リクエストであることを確認します。
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0) {
    echo json_encode(array("error" => 'Request method must be POST!'));
}

// POST リクエストのコンテンツタイプが application/json に設定されていることを確認します。
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strcasecmp($contentType, 'application/json') != 0) {
    echo json_encode(array("error" => 'Content type must be: application/json'));
}

// 生 POST データを受信します。
$content = trim(file_get_contents("php://input"));

// 送信された生 POST データを JSON からデコードしようとします。
$payload = json_decode($content, true);

// json_decode が失敗した場合、JSON が無効です。
if (!is_array($payload)) {
    echo json_encode(array("error" => 'Received content contained invalid JSON!'));
    die();
}

if (empty($payload['discourse_endpoint'])) {
    echo json_encode(array("error" => 'Discourse endpoint must be provided in the json body!'));
    die();
}

if (empty($payload['api_key'])) {
    echo json_encode(array("error" => 'Discourse API Key must be provided in the json body!'));
    die();
}

if (empty($payload['api_username'])) {
    echo json_encode(array("error" => 'Discourse API User must be provided in the json body!'));
    die();
}

$discourse_endpoint = $payload['discourse_endpoint'];
$api_key = $payload['api_key'];
$api_user = $payload['api_username'];

unset($payload['discourse_endpoint']);
unset($payload['api_key']);
unset($payload['api_username']);

$data_string = json_encode($payload);

$ch = curl_init($discourse_endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    "Api-key: $api_key",
    "Api-username: $api_user",
    'Content-Length: ' . strlen($data_string)
));
$result = curl_exec($ch);

echo $result;
?>

詳細については、こちらをご覧ください: Generate new topics, posts and PM via Discourse Relay API Script - php - CTC Community Forum

「いいね!」 2

私も同様の状況で、Pinboardで特定のタグを付けたアイテムを投稿するIFTTTアプレットを設定しようとしています(他のアプレットでは、GETパラメータではなくヘッダーアイテムとしてトークンを渡すことができるMastodonに投稿しています)。

私の平凡なPHPの知識で、あなたのコードがどのように機能するかは完全に理解できます。サーバーに関する知識が少ないため、スクリプトはどこに配置できますか?CORSの問題を回避するために、同じサーバーにある必要がありますか?

それとも、IFTTT以外の別の統合ミドルプラットフォームを探すべきでしょうか?

IFTTTからのリクエストを受け入れ、curl関数を介してDiscourseインスタンスと通信できるサーバーにホストされていれば十分です。これは、DiscourseのWebインターフェースと同じタイプのリクエストを開始するだけです。:slight_smile:

「いいね!」 1

ありがとうございます。Zapier にアクセスできるようです。Zapier の方が連携機能が優れています。