*Microsoft Flow の勉強がてら、自分用のメモとして残しておきます。
IT系勉強会を探すときに、Connpass をよく使っています。
Connpass では、所属するグループが新しい勉強会を登録すると、メールで通知を行ってくれます。
しかし、特定のキーワードや地域名での通知機能は存在しません。このため、自分が所属するグループ外で、面白うな勉強会が開かれていても、情報を見過ごすことが何度かありました。
そこで、Microsoft Flow と組み合わせて
- 自分が興味あるキーワード、地域の勉強会の登録情報を定期的に確認
- 新しい勉強会が登録されたら、Microsoft Flow を経由して、メールで通知する
ようにしてみました。
Connpass のAPIについて
Connpass はREST APIを公開しています。
https://connpass.com/about/api/
パラメーターに所定の指定を行うことで、条件に一致した勉強会の情報をJSONで取得することができます。
例として、キーワードに
- Azure
- 東京都
を含む勉強会を検索する場合、以下のようなURIとなります。
ここから取得できるJSONには「results_available」という項目があり、検索条件に合致した件数が整数値として返ってきます。
大まかな仕様
APIの仕様を踏まえて、以下のように考えてみました。
(極めて単純な仕様です)
- Connpass のAPIを問い合わせるためのコードを作成
- 今回は、「Azure」「東京都」をキーワードに含むものとする
- キーワードに合致した勉強会の合計数「results_availavble」の値を取得。「number.txt」に保存する。
- 24時間後に取得した「results_available」の値と、前日に保存した「number.txt」の値を比較
- 「results_available」の値が、「number.txt」の値よりも大きい場合、キーワードに合致した勉強会が新しく登録されたと判断し、Microsoft Flow にシグナルを送る。
- Microsoft Flow から gmailで通知メールを送る
Microsoft Flow について
- MSさんが提供している、複数のウェブサービス連携システム
- LogicApps 上に構築されたサービスである
- 類似のサービスは「IFTTT」「Zapier」など
- AWSでいうと 「Flow Framework」 (であっているのかな?)
Microsoft Flow 側の設定
Microsoft Flow には、外部からのhttp通信を受け取ったら、次のアクションに移るトリガーが存在します。このトリガーを使って、最初の設定を行います。
ここでは、POSTメソッドで任意のJSONデータを受け取った場合、次のアクションを呼び出します。「HTTP POST のURL」に記述されたURLが、POST通信を行うためのエンドポイントとなります。
POSTによる通信を受けったら、次のトリガーに移動します。今回は、Microsoft Flow とGmail を連携し、Gmail から指定のメアドへ通知メールを送ることにします。
(Microsoft Flow と Gmail の連携については
https://japan.flow.microsoft.com/ja-jp/connectors/shared_gmail/gmail/
を御覧ください)
設定画面から「宛先」「件名」「本文」を入力します。
これで、Microsoft Flow 側の設定は終了です。
Connpass 問い合わせ用のコード
次に、Connpass のAPIへ問い合わせを行うためのコードを準備します。
<?php
// Connpass に問い合わせを行いたい APIのエンドポイントを記述
$base_url = 'https://connpass.com/api/v1/event/?keyword=azure&keyword=%E6%9D%B1%E4%BA%AC%E9%83%BD';
// Connpass 検索用の関数「searchConnpass」にエンドポイントを引き渡し、返り値を取得
$response = searchConnpass($base_url);
$json = json_decode($response, true) ;
// 連想配列からイベントの合計値を取得
$new_number = $json['results_available'];
// 前日に取得したイベントの合計値を取得
$old_number = file_get_contents("number.txt");
// イベント数が増加していた場合、最新のイベント数を number.txt に書き込み
// Microsoft Flow へ通知を行う関数「postToFlow」を実行
if ($old_number < $new_number) {
file_put_contents("number.txt" , $new_number);
postToFlow();
}
// Connpass 検索用の関数定義
function searchConnpass($base_url) {
// UserAgent 情報をセットする
$headers = array(
"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $base_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
// Microsoft Flow へ通知を行う関数「postToFlow」を定義
function postToFlow() {
$flow_url = 'Microsoft Flow で作成した HTTP POST 受信用のURLを記述';
// Microsoft Flow に渡すためのダミー用JSONを生成
$data = array("name" => "new arrival");
$data_string = json_encode($data);
// curlでPOST
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $flow_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close($curl);
}
?>
コードを記述したら、cronを設定して、日次で実行します。
前日の勉強会から数値が増えていたら、Flow 経由でメールが送信されます。
新着・更新があった勉強会のURLをGmailの本文に挿入する
上述のコードを元に、アレンジを加えます。
- 過去24時間以内に新着・更新があった勉強会のJSONデータを取得
- 新着・更新があった勉強会のURLを変数に格納
- JSONに加工して、Microsoft Flow のエンドポイントへポスト
- Gmailから送信された本文内に、各勉強会のURLを改行付きで表示する
という仕様で開発してみます。
Microsoft Flow 側の準備
Microsoft Flow のHTTPエンドポイントでJSONデータを取得するには、HTTPトリガーが受信するJSONの型を指定して、それに応じたJSONデータを送信する必要があります。
Microsoft Flow は Logic Apps 上に構築されているため、Logic Apps 向けのドキュメントが参考に設定を行いました。
上記を参考に、Flow 側の設定を以下のようにします。ここでは「data」という名前のJSONデータを受信するようになっています。
このエンドポイントに
{
"data":"hogehoge"
}
というデータを送信すると、トリガーが発動します。
次にGmail側の設定を行います。HTTPトリガーが受信するペイロードの型に合わせて、Gmailの本文内にデータを挿入することができます。
Gmailでは<br>タグを解釈して文章を改行するので、見やすくするため<br>タグを挿入しています。
これでMicrosoft Flow 側の設定は終了です。
コード
Microsoft Flow にJSONデータをpostするためのコードを記述して、24時間毎にcronで実行します。
<?php
// Connpass に問い合わせを行いたい APIのエンドポイントを記述
$base_url = 'https://connpass.com/api/v1/event/?keyword=azure&keyword=%E6%9D%B1%E4%BA%AC%E9%83%BD';
// Connpass 検索用の関数「searchConnpass」にエンドポイントを引き渡し、返り値を取得
$response = searchConnpass($base_url);
// 返り値のJSON から、勉強会に関する情報が格納された「events」のデータを取得
$data = json_decode($response, true);
$events = $data["events"];
// 新着勉強会の情報を格納するための変数「$list」を準備
$list = "";
// コードを実行した日時の24時間前の時間を「$yesterday」に格納
// 連想配列 $events から、過去24時間内に登録・更新があった勉強会の情報を取得
// 新着・更新勉強会のURL情報を改行タグ<br>を付加して変数$listに追記
foreach ($events as $key => $value) {
$update = strtotime($value["updated_at"]);
$yesterday = strtotime("-1 day" , time());
if ($update > $yesterday) {
$list = $list . $value["event_url"] ."<br>" ;
}
}
// 変数$listを、Microsoft Flow にPOSTするための関数「postToFlow」に渡す
postToFlow($list);
// Connpass 検索用の関数定義
function searchConnpass($base_url) {
// UserAgent 情報をセットする
$headers = array(
"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $base_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
// Microsoft Flow へ通知を行う関数「postToFlow」を定義
function postToFlow($list) {
$flow_url = 'Microsoft Flow で設定したHTTPのエンドポイントを記述';
// Microsoft Flow に渡すためのJSONを生成
$data = array("data" => $list);
$data_string = json_encode($data);
// curlでPOST
$headers = array(
"Content-Type: application/json",
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $flow_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($curl);
curl_close($curl);
}
コードが実行されると、過去24時間以内に登録・更新があった勉強会の情報をGmail経由で送信してくれます。
積み残し
- Azure Functions や AWS Lambda などのサーバーレスサービスでコードを実行させたい
参考情報