2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Azure Functions + Node.js + Flow で、Connpass のイベント情報を定期的に取得する

Last updated at Posted at 2018-02-03

Azure Functions と Node.js の勉強がてら、作ってみました。前記事の続き となります。

やること

Connpass で、自分が興味あるキーワードの勉強会が新規登録・更新されたら、メールで通知する。

仕様

  • Azure Functions で、一日一回「Azure」「東京都」に関する勉強会の更新・登録情報を検索する。
  • 新着情報があったら、その勉強会のURLを Microsoft Flow に送信する。
  • Microsoft Flow で受け取った勉強会情報を、Gmail で送信する。

以下、

  • Microsoft Flow の設定
  • Azure Functions の設定
    • 初期設定
    • npmによるパッケージのインストール
    • Azure Functions の Node.js バージョン
  • Node.jsのコード作成
    • 設定とテスト
  • 実際の挙動

の順番で記述します。

Microsoft Flow の設定

Microsoft Flow の設定は前回の記事と同じ手順となります。

Azure Functions の設定

Microsoft Flow 側の設定が終了したら、Azure Functions の設定を行います。

Azure のポータル画面から、[新規]を選び、「functions」で検索=>[Functions App]を選択=>[作成]を行う

functions_1.png

アプリ名、リソースグループなどを設定してサービスを立ち上げる

functions_2.png

セットアップが終わったら、Functions のカスタム関数から新規関数を登録する。ここでは「タイマー」「JavaScript(=Node.js)」を選択する。

functions_4.png

もしくは、クイックスタートを使用しても良い。

カスタム関数の名前を設定。ここでは「ConnpassSearch」とした。下部はタイマーのスケジュール設定(cron方式)。Cronの書式で記述すると、そのルールに従って関数を実行する。
タイマーのスケジュールは後で変更できるので、とりあえずこのまま作成する。

functions_5.png

関数が登録され、初期のダミー関数とエディタが表示される。このエディタ内に、実行したい関数を登録していく。

functions_6.png

npmによるパッケージのインストール

次に、npmで必要なパッケージをインストールする。npmの操作方法は Azure のドキュメント に従って操作する。

https://<function_app_name>.scm.azurewebsites.net へアクセス。今回の例では、Functions App の名称を「connpasstest」としたため

となる。

[Debug Console]=>[CMD]へ移動して、コマンドプロンプトを表示する。

次に、npmをインストールしたい関数のディレクトリへ移動。
今回の例では「ConnpassSearch」という関数名にしたため、

D:\home\site\wwwroot\ConnpassSearch

へ移動する。

functions_7.png

コマンドプロンプトで

npm init
npm install --save request

と打ち込み、requestパッケージをインストールする。

Azure Functions の Node.js バージョン

ドキュメントによると、2018年2月時点では「6.5.1」で固定されているとのこと。

Node.js のコード作成

Azure Functions で実行する Node.js のコードを記述。

  • Connpass のAPIから、検索キーワードに合致した勉強会のデータを取得
  • コード実行時から24時間以内に登録・更新があった勉強会のデータを取得
  • 勉強会のURL情報を Microsoft Flow にpostする

というロジックで書いてみました。
(前回書いたphpのコードを JavaScript で書き直しました)

  'use strict';

  // モジュールと通信のためのエンドポイントを変数に定義

  const request = require('request');
  const URL = 'https://connpass.com/api/v1/event/?keyword=azure&keyword=%E6%9D%B1%E4%BA%AC%E9%83%BD';
  const FlowURL = 'Flowで設定したエンドポイント';


  // 関数[connpassSearch]で、勉強会の情報を取得

  connpassSearch(URL).then(function(response) {

  // APIからの返り値 response から連想配列 events を切り出す  

    const events = response.events;

    // events内の勉強会の更新日・登録日をUNIX TIME のミリ秒で取得
    // 過去24時間内に更新・登録された勉強会があったら、そのイベントURLを変数listに追記

    const dt = new Date();
    const yesterday = dt - 86400000;
    let list = '';

    for (let i in events) {
      let updated_at = new Date(events[i].updated_at);
      if (updated_at > yesterday) {
        list += events[i].event_url + "<br>";
      }
    }

    // 変数listをJSON型の変数[data]に加工する

    const hash = {
      data: list
    };

    const data = JSON.stringify(hash);

    // 更新・新着勉強会があったら = 変数 dataが空でなければ
    // Microsoft Flow へ更新・新着勉強会のURLを渡す
    
    if (data !== null) {
      postData(data);
    }
  });

  // Connpass のREST APIを叩くための関数「connpassSearch」を定義
  // Connpass のAPIから取得したデータを Promise で返す

  function connpassSearch(URL) {
    return new Promise((resolve, reject) => {
      request.get({
        uri: URL,
        headers: {
          'Content-type': 'application/json',
          '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',
        },
        json: true
      }, function(err, req, data) {
        resolve(data);
      });
    });
  }

  // Microsoft Flow へ JSONデータをポストするための関数 [postData]を定義

  function postData(data) {
    request.post({
      uri: FlowURL,
      headers: {
        'Content-type': 'application/json',
      },
      body: data,
    }).on('error', function(err) {
      console.log(err)
    });
  }

設定とテスト

先ほど作成した、Functions のエディタ画面から、Node.jsのコードを貼り付ける。
初期状態の関数には

module.exports = function (context, myTimer) {}

と記述されている。この「context」オブジェクトは、Functions の実行のために必要な記述とのことなので、そのまま残し、ダミーコードの部分を今回記述したコードに入れ替える。

module.exports = function (context, myTimer) {

// 作成したコードを貼り付ける

}

functions_8.png

コードを保存したら、実行テストを行って挙動を確認する。また、メニューの[統合]から、実行間隔を設定する。

Azure Functions では、協定世界時(UTC)が基準となる。Functionsサービスをどのリージョンに設定しても変わらない。東日本のリージョンに設定してもUTCとなる。

例として、毎日AM8時にコードを実行したい場合、設定は

0 0 23 * * *

となる。

functions_9.png

タイマーの設定が終わったら、保存をして終了。

実際の挙動

「Azure」「東京都」に関連する新着情報が、毎日定時にメールで届きます。

functions_10.png

#ちなみに

Movable Type に関する Connpass のエンドポイントは

https://connpass.com/api/v1/event/?keyword=Movable%20Type

となります。(ダイマ)

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?