Edited at

Connpass で自分が興味あるキーワードの勉強会が登録されたら、Microsoft Flow 経由で通知する

More than 1 year has passed since last update.

*Microsoft Flow の勉強がてら、自分用のメモとして残しておきます。

IT系勉強会を探すときに、Connpass をよく使っています。

https://connpass.com/

Connpass では、所属するグループが新しい勉強会を登録すると、メールで通知を行ってくれます。

しかし、特定のキーワードや地域名での通知機能は存在しません。このため、自分が所属するグループ外で、面白うな勉強会が開かれていても、情報を見過ごすことが何度かありました。

そこで、Microsoft Flow と組み合わせて


  • 自分が興味あるキーワード、地域の勉強会の登録情報を定期的に確認

  • 新しい勉強会が登録されたら、Microsoft Flow を経由して、メールで通知する

ようにしてみました。


Connpass のAPIについて

Connpass はREST APIを公開しています。

https://connpass.com/about/api/

パラメーターに所定の指定を行うことで、条件に一致した勉強会の情報をJSONで取得することができます。

例として、キーワードに


  • Azure

  • 東京都

を含む勉強会を検索する場合、以下のようなURIとなります。

https://connpass.com/api/v1/event/?keyword=azure&keyword=%E6%9D%B1%E4%BA%AC%E9%83%BD

ここから取得できる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 について

https://japan.flow.microsoft.com/ja-jp/


Microsoft Flow 側の設定

Microsoft Flow には、外部からのhttp通信を受け取ったら、次のアクションに移るトリガーが存在します。このトリガーを使って、最初の設定を行います。

flow_1.png

ここでは、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/

を御覧ください)

flow_2.png

設定画面から「宛先」「件名」「本文」を入力します。

これで、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 経由でメールが送信されます。

mail_from_flow.png


新着・更新があった勉強会の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 向けのドキュメントが参考に設定を行いました。

https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-http-endpoint

上記を参考に、Flow 側の設定を以下のようにします。ここでは「data」という名前のJSONデータを受信するようになっています。

flow_4.png

このエンドポイントに



{
"data":"hogehoge"
}

というデータを送信すると、トリガーが発動します。

次にGmail側の設定を行います。HTTPトリガーが受信するペイロードの型に合わせて、Gmailの本文内にデータを挿入することができます。

Gmailでは<br>タグを解釈して文章を改行するので、見やすくするため<br>タグを挿入しています。

flow_5.png

これで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経由で送信してくれます。

flow_6.png


積み残し


  • Azure Functions や AWS Lambda などのサーバーレスサービスでコードを実行させたい


参考情報

http://blog.livedoor.jp/sce_info3-craft/archives/9706167.html