気象庁のAPIを使った雨の日だけ通知してくれるLINE Notifyの作成


概要

これまで気象庁の気象データはスクレイピングをすることでしか得られませんでしたが、1カ月ほど前に気象庁HPがAPI化した(厳密なAPIではないらしい)ということで早速使っていこうと思います。

今回作成するものは

  1. 気象庁HPからAPIで天気予報データを取得
  2. 雨の日だけLINE Notifyで通知

というシンプルなもので、GoogleAppsScriptを使って実装していきます。

気象庁のAPI

まず、気象庁のAPIの仕様を把握する必要があります。この記事が詳しいです。

なお、これはF12を押すと表示されるデベロッパーツールで見ることもできて、Chromeの場合は以下のように見ることができます。

  1. 取得したい情報が表示されているページを開く
  2. F12
  3. Network
  4. リロード(ctrl+R or F5)
  5. XHRを選択し、順番に見ていく
  6. Preview表示する

このときNameのところのアドレスがエンドポイントです。

GASで処理

GASでapiを利用する際は以下のように記述します。

let response = UrlFetchApp.fetch("https://www.jma.go.jp/bosai/forecast/data/forecast/120000.json");
let response_json = JSON.parse(response.getContentText());

responce_jsonの中身を見てほしい情報をたどってください。

let weather = response_json[0]["timeSeries"][0]["areas"][0]["weathers"][0];
weather = weather.replace(/ /g, "");
let rainy_percent = response_json[0]["timeSeries"][1]["areas"][0]["pops"];
rainy_percent = rainy_percent.slice(0, 4);

降水確率が高いかどうかの条件分岐とLINEで送りたい文字を決めていきます

if (rainy_percent.filter(element => element >= 50).length == 0){
  return
}
let text = 
`\n今日の天気:${weather}
降水確率:  6時-\t${rainy_percent[0]}%
     12時-\t${rainy_percent[1]}%
     18時-\t${rainy_percent[2]}%`

sendLINE(text)

LINE Notifyに通知

まずは、LINEのトークンを取得する必要があります。以下の記事が詳しいです。

取得したらコードは単純です。コピペして先ほど取得したトークンの部分だけ書き換えればいいです。

function sendLINE(text) {
 let messageText = text

 let token = "先ほど取得したトークン"
 let options = {
   "method" : "post",
   "headers" : {
     "Authorization" : "Bearer "+ token
   },
   "payload" : {
     "message" : messageText
   }
 }

 let url  = "https://notify-api.line.me/api/notify"
 UrlFetchApp.fetch(url, options)
}

GASで定期実行

以下の記事が参考になると思います。

こんな感じで設定すれば毎朝定期実行して、降水確率が高い日だけ通知してくれます。

実際に通知が来ました!

参考文献