LoginSignup
1
1

More than 1 year has passed since last update.

【Google Apps Script】LINE Notifyで毎日降水量をチェックしたい

Last updated at Posted at 2022-11-20

はじめに

研究の関係上、私は毎日新ひだかの降水量を確認する必要がある。
そこで、LINE Notifyに毎日、前日の降水量を通知してもらえるbotを作成したので記事にしました。
簡単に言うと、Google Apps Scriptでスクレイピングして、LINE Notifyに毎日降水量を通知させようというものです。

LINE Notifyからトークンの取得

LINE notifyのHPにログイン、マイページをクリックしてトークンを発行する。ページから移動したら発行したトークンは二度と表示されないので注意。
トークンを取得したら、毎日通知をしたいグループにLINE Notifyを招待する。

Google Apps Scriptにコードを書く

JavaScriptに似ているのでとっつきやすい。
Google Driveの 新規 > その他 > Google Apps Scriptを選択してファイルを作成。

スクレイピングのためのライブラリを導入

GASのWebスクレイピングではParserライブラリを使いがち(らしい)。
GASのエディタ画面のライブラリを選択し、そこでスクリプトIDを入力して追加。
スクリプトIDは、このページの下部にある"Completed code of Parser library."から飛んだ先にあるGASのプロジェクトの設定のスクリプトIDから得られる。
私が導入したときは以下のIDだった(2022/11/20)。

1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw

書いたコードはこちら

前日の日付を取得し、アメダス笹山の1時間毎の降水量をスクレイピング。その後、降水量のデータをLINE Notifyを利用しLINEに送る。このコードでは閾値を5 mmに設定し、1時間最大降水量が5 mm以上であれば詳細な降水量のデータを、5 mm未満であれば簡素な降水量のデータを通知するようにしている。

//アメダスから降水量を取得
function getPrecipitation(year, month, day) {
  //降水量閾値設定
  THRESHOLD = 5 

  //スクレイピングし、降水量の部分を取得
  let response = UrlFetchApp.fetch(`https://tenki.jp/past/${year}/${String(month).padStart(2,'0')}/${String(day).padStart(2,'0')}/amedas/1/4/22206.html`);
  let text = response.getContentText("utf-8");
  let topic_block = Parser.data(text).from('<table class="common-list-entries amedas-table-entries"').to('</table>').build();
  let content_block = Parser.data(topic_block).from('<tr>').to('</tr>').iterate();

  //降水量と時間を配列に格納
  let times = []
  let values = []
  for(let i = 1; i<content_block.length -1 ;i++){
    time = Parser.data(content_block[i]).from('<td>').to('</td>').iterate()[0]; //時間
    value = Parser.data(content_block[i]).from('<td>').to('</td>').iterate()[2]; // 降水量
    times.push(time);
    values.push(Number(value).toFixed(1));
  }
   let value_max = Math.max.apply(null,values); //1日の1時間最大降水量を取得

  //降水量によって通知内容を変更
   if(value_max >= THRESHOLD){ //閾値以上であれば詳細な降水量を通知
     ret = `\n${Number(year)}${Number(month)}${Number(day)}日の1時間最大降水量は${value_max} mmでした。\n\n時   降水量(mm)\n`
     for (let i = values.length -1; i >= 0; i--){
       ret += `${times[i]} ${values[i]} mm\n`
     }
   }else{ //閾値以下であれば最大降水量のみを通知
     ret = `\n${Number(year)}${Number(month)}${Number(day)}日の1時間最大降水量は${value_max} mmでした。`
   }
   return ret;
}

//LINEnotifyを利用してLINEに通知
function sendToLINE(txt) {
  let token = ['ここにトークンを入力'];
  let options = {
    "method": "post",
    "payload" : {"message": txt },
    "headers": {"Authorization": "Bearer " + token}    
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

//実行
function main(){
  //前日の日付を取得
  let date    =  new Date();
  let day     = date.getDate();
  date.setDate(day-1); //前日に変更
  let year    = date.getFullYear();
  let month   = date.getMonth()+1;
  day         = date.getDate();
  console.log(`${year} ${String(month).padStart(2,'0')} ${String(day).padStart(2,'0')}`)

  //前日の降水量を取得し、LINEに通知
  let txt = getPrecipitation(year, month, day)
  sendToLINE(txt);
}

実行間隔を設定

GASのトリガー画面からトリガーを追加する。この時、実行する関数はmainを選択。
これで時間通りにLINEに通知がくるはず。

おわりに

GASはとっつきやすくて良いですね。LINE Notifyも非常に便利でよろしい。

参考文献

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1