new wings

プログラミングを始めたので、感想を書いてくと思います

ミリシタのイベントを自動で google カレンダーに予定として登録する

ミリシタのイベントを自動で google カレンダーに予定として登録する

注意

  • matsurihi.me さんの API を利用します。リクエストのしすぎに注意。
  • Microsoft Azure の利用は無料ではありませんが、ここで紹介するような使い方だと高くて月に数円とかいうレベルだと思います。
  • 追記すると思います。

利用するサービス

ざっくり概要

Azure Function App でタイマーをトリガーにして matsurihi.me からイベントの開催期間一覧を受け取り、同時に IFTTT の Webhook に必要な情報を POST してそれをトリガーに Google カレンダーに予定を登録します。下の画像のような雰囲気ですね。

f:id:namaharumaki:20180819102450p:plain

なお、私は素人もいいところなのでこれを目にして参考にされる方はご注意ください。IFTTT を利用しなくてもできてしまいそうな気がしますが、後々調べてみるつもりです(たぶん調べない)。

手順

IFTTT で新しいアプレットを作る

IFTTT で新しいアプレットを作ります。

  • this に Webhooks の Receive a web request
  • thatGoogle CalendarCreate a detailed event

を割り当て、それぞれ以下のように設定していきます。

this の設定

まずは IFTTT の this である Trigger の設定をします。

f:id:namaharumaki:20180819102622p:plain

Webhooks の Event Name は任意の文字列ですが、URL の一部となるので個人情報を入れないほうが良いです。Webhooks を呼ぶための URL は IFTTT の Webhooks のページから確認することができます。Documentation をクリックするとアカウントごとのキーと URL が書かれたページに遷移します。URL 中の {event} は Webhooks の設定時に入力した Event Name で置き換えます。ここでは https://maker.ifttt.com/trigger/notify-event/with/key/hogehoge となります。hogehoge はアカウントごとのキーです。

f:id:namaharumaki:20180819112652p:plain

Webhooks からは三つまでのパラメータを送ることができます。それぞれ

  • Value1: イベント名
  • Value2: イベントの開始日時時刻
  • Value3: イベントの終了日時時刻

とすることにします。この辺りは初めてだとわかりにくいかもしれませんが、例えば「Value1 をイベント名とする」というのは、Webhooks にそのような設定があるというわけではなく、Webhooks に POST するときに渡すパラメータをそのようにするというルールを決めておくという意味に過ぎません。ちょっとこの辺の表現があっている自信がありません。

that の設定

次に IFTTT の that である Action の設定です。Google Calendar に登録する予定を次のように設定します。

  • Which calendar? には自分のアカウントを入力します。
  • Start time に Value2
  • End time に Value3
  • Title に Value1

f:id:namaharumaki:20180819112727p:plain

IFTTT での設定は以上です。

ここの段階で Webhooks の URL にイベントの情報を GET なり POST で送信すればカレンダーに登録されます。つまりは IFTTT で作ったこのアプレットはただの汎用的な「Webhooksをトリガーとして Google Calendar へ予定を登録するアプレット」です。

Function App の設定

ここからは IFTTT で作った「Webhooksをトリガーとして Google Calendar へ予定を登録するアプレット」を実行するかしないかを判断し、実行する場合にはミリシタの開催イベントの情報を送信する処理を定期的に行う関数を作ることになります。

適当に Function App を作ります。

f:id:namaharumaki:20180819112743p:plain

タイマーをトリガーとした関数を作成します。以下の画像のように作成開始画面が一様ではなくいろいろありますが、トリガーがタイマーならどれでもOKです。ここでは javascript で関数定義します。

f:id:namaharumaki:20180819112816p:plain

or

f:id:namaharumaki:20180819112839p:plain

入出力設定

イベントを Google カレンダーに登録するのは新規イベント開始後の最初の一回目の API へのリクエストの時だけで良いので、二回目以降の API へのリクエスト時にはそのイベントがカレンダーに既に登録してあるかどうかを判定する必要があります。IFTTT の Webhooks に POST すると IFTTT が Google カレンダーに登録するわけなので、Function App では IFTTT に POST したかどうかを記憶しておけば良いです。どうやって記憶するかという話になりますが、Function App を作成するときに Storage の項目の新規作成にチェックを入れた場合は同時に Azure の Storage Account が作られているのでそこに保存することにします。下の画像のように適当な名前でテーブルを新規作成します。

f:id:namaharumaki:20180819112858p:plain

作成したテーブルを Function App の入力と出力の両方に設定します。Function App で作成した関数の統合画面を開き、入力と出力をそれぞれ次の画像のようにします。

  • テーブル名はストレージアカウントで作成したテーブルの名前
  • テーブルパラメーター名は関数定義内でテーブルを指定する識別子

入力

f:id:namaharumaki:20180819112913p:plain

出力

f:id:namaharumaki:20180819112933p:plain

トリガーの設定

トリガーの設定をします。 トリガーはタイマーになっているかと思いますが、スケジュールを変更します。

index.js で定義した関数は一回実行するたびに一度 matsurihi.me さんにイベントの情報を問い合わせます。ミリシタのイベント開始は午後三時です。matsurihi.me さんがどのタイミングで情報を更新するかわかりませんが、早くても午後三時以降に一日一度だけ問い合わせれば十分です。その設定は以下の画像のようになります。

f:id:namaharumaki:20180819113212p:plain

入出力設定とトリガー設定は function.json を直接編集することでも設定できます。

関数の定義

次に関数の定義を javascript で書きます。

下準備その一: npm モジュールの node-rest-client request を利用したいのでインストールします。Function App のプラットフォーム機能からコンソールを選択し、wwwroot ディレクトリの元で npm install node-rest-client npm install request と打ちます。

下準備その二: IFTTT の Webhooks の URL を環境変数に登録します。ソースコード内に直接書いても構いません。Function App のプラットフォーム機能からアプリケーション設定を選択し、新しい文字列の追加をクリックします。

  • アプリ設定名: IFTTT_WEBHOOK_TRIGGER
  • 値: https://maker.ifttt.com/trigger/notify-events/with/key/hogehoge

「アプリ設定名」はソースコード上から「値」を取得するための識別子です。process.env(["IFTTT_WEBHOOK_TRIGGER"]) のように書くことで https://maker.ifttt.com/trigger/notify-event/with/key/hogehoge が取得できます。

index.js に次のようなコードを書きます。javascript の経験があまりないので下記コードには改善すべき点が山のようにあります。期待通りの動きをする時点で考えるのをやめました...

参考