はじめに
緊急事態宣言が終わり暫くの間はテレワークが続きましたが、6月末でそれも終わり電車通勤が始まりました・・。
一度テレワークを味わうと、通勤の無駄な時間にだいぶストレスを感じる毎日です。
その上最近は梅雨シーズンでもあるため、電車遅延で余計イライラ。
家出る前に電車の遅延がしていないか確認すればいいだけですが、「今日は大丈夫だろ。」と謎の自信で確認せずにいつも家をでています。笑
なので私が使う電車が遅延している場合は、通知してくれる仕組みが欲しいな。という思いと勉強にもなるのでLINEに遅延情報を通知してくれる機能を作りました。
今回作ったイメージはこんな感じ。
環境
pythonでスクレイピングして取得した情報を加工して、その情報を投げるという方法も考えましたが、自前でサーバーを用意したりcronの設定やらを考えるのが面倒くさくて、「GAS x LINE Notify」が手軽にできそうなので今回はこの組み合わせにしました。(結構使い古されているっぽいけど..。)
LINE Notifyからアクセストークンを発行する
- 「LINE Notify」にアクセスしログイン
- 「アクセストークンの発行(開発者向け)」の「トークンを発行する」を押下
- 「トークン名」を記入(遅延通知と私は設定しました)、通知を送信するトークルームを選択後「発行する」を押下
- 表示されたアクセストークンをGASで使うのでメモしときます。
GASで遅延情報を取得して、LINE Notifyに投げるためのコードを書く
1.「Googleドライブ」にログイン(Googleアカウントない方は作成してください)
2. ログイン後に「新規」→「その他」→「Google Apps Script」を押下
3. GASのコードを書く、遅延情報は「鉄道com遅延情報JSON」から取得しました。
// LINE Notify アクセストークン
// -- [1] --
const LINE_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_ACCESS_TOKEN");
// 鉄道路線名
// -- [2] --
const LINE_NAME = PropertiesService.getScriptProperties().getProperty("LINE_NAME");
// 遅延情報
var delayInfo = "";
// 遅延情報あれば通知、なければ何もしない
function notify() {
if (isDelay(getDelayInfo())) {
sendDelayInfo(delayInfo);
}
}
// 電車が遅延しているか
function isDelay(json) {
// 遅延していれば遅延情報の初期値を上書き
if(json.find(j => j.name === LINE_NAME)) {
delayInfo = LINE_NAME + "が遅延してるんご...。";
return true;
}
return false;
}
// 遅延情報JSONを鉄道comのRSSから取得
function getDelayInfo() {
return JSON.parse(
UrlFetchApp.fetch(
"https://tetsudo.rti-giken.jp/free/delay.json"
).getContentText()
);
}
// 遅延情報をLINEへ送信
function sendDelayInfo(delayInfo) {
const options = {
method: "post",
payload: "message=" + delayInfo,
headers: {
Authorization: "Bearer " + LINE_ACCESS_TOKEN
}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
作成したコードをバージョン管理したい
作ったコード自体はバージョン管理したかったため、アクセストークンキーをベタ書きするのはちょっと..。てことで調べたところ、GASにプロパティを設定して、そのプロパティを使えるとうことみたいなので、以下記事を参考にさせていただきました。
- 【GAS】コードにAPIトークンやIDのベタ書きを避ける!(プロパティサービスの活用)
-
GASのProperties Serviceを使ってスクリプトのプロパティを読み書きをする)
コード自体は上記載 delayNotify.gs 冒頭注釈[1],[2]のところです。今回はLINE Notifyで発行したアクセストークンを「LINE_ACCESS_TOKEN」に遅延通知対象の路線名を「LINE_NAME」に設定しました。簡単にできるんですね。スゴイ..。
// LINE Notify アクセストークン
// -- [1] --
const LINE_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_ACCESS_TOKEN");
// 鉄道路線名
// -- [2] --
const LINE_NAME = PropertiesService.getScriptProperties().getProperty("LINE_NAME");
GASを発火させるためのトリガーを設定
- 「現在のプロジェクトのトリガー」を押下(吹き出し時計マーク)
- 遷移後のトリガー設定画面から右下の「トリガーを追加」
- トリガーの設定を以下のように設定し保存(時間は間隔は好みで大丈夫です)
これで、全設定は完了です。遅延が発生すると通知されるようになります。
さいごに
ちょっとした日常の不満とかも、簡単にコードを作るだけ解消されるのがいいですね 。今回は遅延した路線名しか送っていないが、今後はもっと詳細を送れるように改良していきたいです。ソースコードはこちらにも管理しているので暇があれば今後も見てください。
最後に一言
テレワーク最高だよね。