Drupalから任意のトリガーでHttpリクエストを送信する
2024-01-09
azblob://2024/01/09/eyecatch/2024-01-09-send_http_request_from_drupal10-000.png

こんにちは!三瀬と申します。

今回はDrupalの「Rules」+「Rules HTTP Client」モジュールを使って、コンテンツやユーザーの新規追加時にDiscord Botでメッセージを送信する といった簡単な仕組みを作ってみたので、手順を残しておきます。

CMSからの通知機能を実現する一案になればと思います。

初期導入

以下のモジュールを、composer requireコマンドでいい感じにインストールして、いい感じに有効化します。

Rulesは「○○の条件で□□が起こった時に△△の処理を実行する」といった一連のルールを作成できるモジュールとなっており、ロジックアプリのようなフローをDrupal上である程度自由に構築することができます。

Rules HTTP Clientは、「△△の処理」の1つとしてHTTPを用いたデータ通信を提供するプラグインとなります。

コンテンツ作成時に通知を送信する

前提として、以下の構成をした記事を投稿した際に、タイトルおよびURLを送信するケースを想定します。

また、「Discord投稿する」といったチェックボックスのカスタムフィールドを用意しているので、こちらにチェックがついている場合のみ送信するようにします。

トリガーの設定

環境設定 > ワークフロー > Rulesのページに移動し、「Add reaction rule」ボタンをクリックします。

React on eventのプルダウンから「After saving a new コンテンツのアイテム entity」を選択し、その下のプルダウンから今回は「記事」のコンテンツタイプを選択します。

ラベルとシステム内部名称はいい感じにします。

「保存」を押したら以下のような設定画面が表示されます。

  • Events:□□が起こった時に
  • 条件:○○の条件で
  • アクション:△△を実行する

といった設定の流れとなります。

 

条件の設定

今回は「Discord投稿する == true」が条件となるのですが、実はRulesモジュールはそのままだとカスタムフィールドにアクセスすることができません。

その対応のため、最初に「Add condition」から「Entity is of bundle」を選択し、以下のように記載します(article の部分はコンテンツタイプの内部名称)。

Drupalにおけるbundleは、各エンティティが持つ情報の定義 のようなものになります。

なので上記のように設定すると、「このエンティティはarticleというコンテンツタイプの情報になるんだな」と認識してくれるようになり、Discord投稿するかどうかのカスタムフィールドを扱ってくれるようになります。

 

bundleの設定ができたら、再度「Add condition」から「Data comparison」を選択します。

比較データとしてDiscord投稿するかどうかのカスタムフィールドの内部名称を入力し(.value まで含める必要があります)、値が1の時に発火するようにします。

アクションの設定

後はHTTPリクエストの送信アクションを設定するだけです!

「アクションを追加」から「Request HTTP data」を選択し、URL・Headers・Body等を設定するだけ。。。。

と思っていたのですが、Headersに1行しか入力できなくなっている ことに気がつきました。

これは2024年1月現在のつまづきポイントなのですが、Headersの説明で「送信するリクエストヘッダを1行に1つずつ指定します」といったことを書いているのに明らかに複数行に対応していないプレーンテキストとなっています。

Headersを複数入力したい場合は、大元の修正リリースを待つか、ここ のコードの下に↓を追加してパッチを適用してください。

multiple = TRUE

 

今回は2つ入れたいので雑にパッチを当てました。

ということで以下の通りにDiscord投稿を行うためのアクションを設定していきます。Headersが複数入力可能になっていることが確認できます。

Body内にコンテンツのタイトル等を入れる必要があるのですが、フィールド値は {{ }} で囲うことで、代入することができます。

 

ここまで入力したら全て設定完了なので、保存して、実際に試してみましょう!

↓のように、「Discord投稿する」にチェックを入れて、保存します。

無事届きました。嬉しい。

 

本当はもうちょっと凝ったメッセージにしてみたいのですが、Bodyの中身に改行を挟めなかったので単調なものになってしまいました (改行コードを色んな手段で挟んでみたのですがダメでした...)

諸々融通が効かない部分があるので、送りたいパラメータだけまとめてLogicAppsに送るなどしてそこでデータを整形したりするのもアリです。

 

あと、↑の設定だけでは全てのケースをカバーできないので(今回のルールだけだと下書き保存した時でも発火してしまう)、実際はルールを複数作るなどして運用していく必要があります。

 

ユーザーの追加時に通知を送信する

ついでに、Drupal内でユーザーが新しく作成された時に投稿する仕組みを作ってみます。

今回はユーザー名に加えて、「趣味(field_user_hobby)」のカスタムフィールドを用意してみたのでそちらもメッセージに含めてみようと思います。

トリガーの設定

同様に「Add reaction rule」から、今度は「After saving a new ユーザー entity」を選択します。

条件の設定

今回もユーザー情報内のカスタムフィールドを扱いたいので、条件の中に「Entity is of bundle」を設定します。

入力欄は全て「user」になります。

アクションの設定

「アクションを追加」から「Request HTTP data」を選択し、設定していきます。Body以外はコンテンツ作成時のルールと同じです。

保存して、ユーザーを追加します。

無事投稿されました。