はじめに
研究の関係上、私は毎日新ひだかの降水量を確認する必要がある。
そこで、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も非常に便利でよろしい。
参考文献