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

IFTTT を使って新しいトピック、投稿、または個人メッセージを作成したいですか?始めましょう!

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

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

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

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

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

次に、以下の通りアクションフィールドを入力します。

  • URL(必須): https://discourse.example.com/posts.json

  • メソッド(必須): POST

  • コンテンツタイプ: application/json

  • 追加ヘッダー:

Api-Key: [YOUR_API_KEY]
Api-Username: [API_USERNAME]

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

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

本文には {{ }} で囲まれた多くのフィールドが表示されます。これらのフィールド(コンテンツソース)は、トリガーサービスによって異なります。下部の 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

このオプションがもはや無料ではなく、開発者向けにプレミアム機能としてのみ利用可能になったのでしょうか?

「いいね!」 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 の方が連携機能が優れています。