【GAS × LINE Notify】梅雨時期で電車遅延多いからLINEに通知してみた

# はじめに
緊急事態宣言が終わり暫くの間はテレワークが続きましたが、6月末でそれも終わり電車通勤が始まりました・・。
一度テレワークを味わうと、通勤の無駄な時間にだいぶストレスを感じる毎日です。
その上最近は梅雨シーズンでもあるため、電車遅延で余計イライラ。
家出る前に電車の遅延がしていないか確認すればいいだけですが、「今日は大丈夫だろ。」と謎の自信で確認せずにいつも家をでています。笑

なので私が使う電車が遅延している場合は、通知してくれる仕組みが欲しいな。という思いと勉強にもなるのでLINEに遅延情報を通知してくれる機能を作りました。

今回作ったイメージはこんな感じ。

<img width="375" alt="IMG_0227.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491964/cc466165-6ed6-7032-3f55-88345fbdb6bc.jpeg">


# 環境
pythonでスクレイピングして取得した情報を加工して、その情報を投げるという方法も考えましたが、自前でサーバーを用意したりcronの設定やらを考えるのが面倒くさくて、「**GAS x LINE Notify**」が手軽にできそうなので今回はこの組み合わせにしました。(結構使い古されているっぽいけど..。)

# LINE Notifyからアクセストークンを発行する

1. 「[LINE Notify](https://www.google.co.jp/)」にアクセスしログイン
2. 「アクセストークンの発行(開発者向け)」の「トークンを発行する」を押下
3. 「トークン名」を記入（**遅延通知**と私は設定しました）、通知を送信するトークルームを選択後「発行する」を押下
4. 表示されたアクセストークンをGASで使うのでメモしときます。

# GASで遅延情報を取得して、LINE Notifyに投げるためのコードを書く 

1.「[Googleドライブ](https://www.google.co.jp/drive/apps.html)」にログイン(Googleアカウントない方は作成してください)
2. ログイン後に「新規」→「その他」→「Google Apps Script」を押下
3. GASのコードを書く、遅延情報は「[鉄道com遅延情報JSON](https://tetsudo.rti-giken.jp/free/delay.json)」から取得しました。

```javascript:delayNotify.gs
// 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のベタ書きを避ける！（プロパティサービスの活用）](https://qiita.com/Massasquash/items/2209ff367d65c5dd6181)
* [GASのProperties Serviceを使ってスクリプトのプロパティを読み書きをする）](https://qiita.com/unsoluble_sugar/items/ec5c935c4bfc2e06b246)  
<br>コード自体は上記載 delayNotify.gs 冒頭注釈[1],[2]のところです。今回はLINE Notifyで発行したアクセストークンを「**LINE_ACCESS_TOKEN**」に遅延通知対象の路線名を「**LINE_NAME**」に設定しました。簡単にできるんですね。スゴイ..。

```javascript:
// LINE Notify アクセストークン
// -- [1] --
const LINE_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_ACCESS_TOKEN");  
// 鉄道路線名
// -- [2] --
const LINE_NAME = PropertiesService.getScriptProperties().getProperty("LINE_NAME"); 
```

# GASを発火させるためのトリガーを設定
1. 「現在のプロジェクトのトリガー」を押下(吹き出し時計マーク)
![delay.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491964/9b762499-3c67-311c-50be-760ddc6563c6.png)
2. 遷移後のトリガー設定画面から右下の「トリガーを追加」
3. トリガーの設定を以下のように設定し保存(時間は間隔は好みで大丈夫です)![trigger.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491964/d1cc3b1f-ed76-735e-441f-19548459ef96.png)
これで、全設定は完了です。遅延が発生すると通知されるようになります。

# さいごに
ちょっとした日常の不満とかも、簡単にコードを作るだけ解消されるのがいいですね  。今回は遅延した路線名しか送っていないが、今後はもっと詳細を送れるように改良していきたいです。ソースコードは[こちら](https://github.com/aimyapp/delayNotify)にも管理しているので暇があれば今後も見てください。

最後に一言
テレワーク最高だよね。