Help us understand the problem. What is going on with this article?

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

TakeshiNickOsanai
Developer Relation Manager, Sales Engineer/PreSales, User Community Supporter, CMS Engineer, AWS Certified Solutions Architect
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away