ミリシタのイベントを自動で google カレンダーに予定として登録する
ミリシタのイベントを自動で google カレンダーに予定として登録する
注意
- matsurihi.me さんの API を利用します。リクエストのしすぎに注意。
- Microsoft Azure の利用は無料ではありませんが、ここで紹介するような使い方だと高くて月に数円とかいうレベルだと思います。
- 追記すると思います。
- 追記、改変しました。現在は GitHub からデプロイしているので npm モジュールのインストールを手動では行っていません。 (18/9/6)
- index.js を更新しました。リファクタリングしただけでやっている内容に変更はありません。Develop by srymh · Pull Request #4 · srymh/notifyMilliEvents(18/9/16)
- 理由(ワケ)あって、リポジトリを一時的に非公開 (19/5/3)
利用するサービス
- matsurihi.me Princess — Public REST API
- Microsoft Azure Function App
- IFTTT
- Google Calendar
ざっくり概要
Azure Function App でタイマーをトリガーにして matsurihi.me からイベントの開催期間一覧を受け取り、同時に IFTTT の Webhook に必要な情報を POST してそれをトリガーに Google カレンダーに予定を登録します。下の画像のような雰囲気ですね。
なお、私は素人もいいところなのでこれを目にして参考にされる方はご注意ください。IFTTT を利用しなくてもできてしまいそうな気がしますが、後々調べてみるつもりです(たぶん調べない)。
手順
IFTTT で新しいアプレットを作る
IFTTT で新しいアプレットを作ります。
this
に Webhooks のReceive a web request
that
に Google Calendar のCreate a detailed event
を割り当て、それぞれ以下のように設定していきます。
this の設定
まずは IFTTT の this
である Trigger の設定をします。
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
はアカウントごとのキーです。
Webhooks からは三つまでのパラメータを送ることができます。それぞれ
- Value1: イベント名
- Value2: イベントの開始日時時刻
- Value3: イベントの終了日時時刻
とすることにします。この辺りは初めてだとわかりにくいかもしれませんが、例えば「Value1 をイベント名とする」というのは、Webhooks にそのような設定があるというわけではなく、Webhooks に POST するときに渡すパラメータをそのようにするというルールを決めておくという意味に過ぎません。ちょっとこの辺の表現があっている自信がありません。
that の設定
次に IFTTT の that
である Action の設定です。Google Calendar に登録する予定を次のように設定します。
- Which calendar? には自分のアカウントを入力します。
- Start time に Value2
- End time に Value3
- Title に Value1
IFTTT での設定は以上です。
ここの段階で Webhooks の URL にイベントの情報を GET なり POST で送信すればカレンダーに登録されます。つまりは IFTTT で作ったこのアプレットはただの汎用的な「Webhooksをトリガーとして Google Calendar へ予定を登録するアプレット」です。
Function App の設定
ここからは IFTTT で作った「Webhooksをトリガーとして Google Calendar へ予定を登録するアプレット」を実行するかしないかを判断し、実行する場合にはミリシタの開催イベントの情報を送信する処理を定期的に行う関数を作ることになります。
適当に Function App を作ります。
タイマーをトリガーとした関数を作成します。以下の画像のように作成開始画面が一様ではなくいろいろありますが、トリガーがタイマーならどれでもOKです。ここでは javascript で関数定義します。
or
入出力設定
イベントを Google カレンダーに登録するのは新規イベント開始後の最初の一回目の API へのリクエストの時だけで良いので、二回目以降の API へのリクエスト時にはそのイベントがカレンダーに既に登録してあるかどうかを判定する必要があります。IFTTT の Webhooks に POST すると IFTTT が Google カレンダーに登録するわけなので、Function App では IFTTT に POST したかどうかを記憶しておけば良いです。どうやって記憶するかという話になりますが、Function App を作成するときに Storage の項目の新規作成にチェックを入れた場合は同時に Azure の Storage Account が作られているのでそこに保存することにします。下の画像のように適当な名前でテーブルを新規作成します。
作成したテーブルを Function App の入力と出力の両方に設定します。Function App で作成した関数の統合画面を開き、入力と出力をそれぞれ次の画像のようにします。
- テーブル名はストレージアカウントで作成したテーブルの名前
- テーブルパラメーター名は関数定義内でテーブルを指定する識別子
入力
出力
トリガーの設定
トリガーの設定をします。 トリガーはタイマーになっているかと思いますが、スケジュールを変更します。
index.js で定義した関数は一回実行するたびに一度 matsurihi.me さんにイベントの情報を問い合わせます。ミリシタのイベント開始は午後三時です。matsurihi.me さんがどのタイミングで情報を更新するかわかりませんが、早くても午後三時以降に一日一度だけ問い合わせれば十分です。その設定は以下の画像のようになります。
入出力設定とトリガー設定は 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 の経験があまりないので下記コードには改善すべき点が山のようにあります。期待通りの動きをする時点で考えるのをやめました...