【☔️天気のBOT☔️】夜に雨が降るのかどうかを教えてくれるLINEBOTを作ったけど使い物にならなかった話

#はじめに
3年目エンジニアのまりもです。
僕の周りにいる友人、「朝に雨が降ってないなら傘は持ってかないぜ！」からの「夜に雨降るなんて聞いてねぇよ！」というパターンの人しかいません。

突発的な雨の場合は濡れて帰るかコンビニで課金して傘を入手するしか方法はありません。タスケテ

#なぜ傘を持っていかないのか
僕含め、傘を持たない友人たちにその理由を聞いた結果をまとめました。

- [x] そもそも傘は荷物になるから極力持ちたくない
- [x] 家出るときに降ってるなら持ってくけど、夜降るかなんて気にしない。僕たちはイマを生きてるんだ
- [x] 朝に天気予報を見る？　そんな時間あるなら1秒でも多く寝ていたい

qiita読んでる皆様もこんな感じだと思います（冗談）

#傘の有無を教えてくれるツールがあればよさそう
上記要望を解決してくれる手段を思いつき&作ったので皆様に共有します。

```ruby:tensai.hassou
毎朝　その日の夜中に雨が降る場合だけLINEにメッセージを送ってくれるBOTを作ればいいのでは
```
というわけで作ります。

#環境
・Mac/Windows
・GoogleAppScript
・LINE Developersアカウント
・OpenWeatherMapAPI
・無駄に傘を持ち歩きたくないという強い意志

#実装
GoogleAppScriptを使ったLINEBOTの開発環境作りは「[【LINE BOT】機械学習？AI？ そんなもん使わずにいい感じに返信してくれるBOTを作るぜ！](https://qiita.com/Marimo_Mokyu/items/b1ab5a5f9397e45ad3c6)」を参考にしていただけたらと思います。

```javascript:コード.gs
//諸々の設定
var channel_access_token = "アクセストークンを記載"; 
var user_id = "ユーザーIDを記載";　//ログビューアーから取得したID
var line_url = 'https://api.line.me/v2/bot/message/push'
var openweathermap_url = 'http://api.openweathermap.org/data/2.5/forecast?id=1850147' //idで東京を指定
var openweathermap_appid = 'OpenWeatherMapAPIキーを記載' //https://openweathermap.org/api　ここから取得できる
```

まずはお決まりの設定を記述します。
OpenWeatherMapAPIの取得方法は[こちら](https://qiita.com/nownabe/items/aeac1ce0977be963a740)の記事を参考にしました。


```javascript:コード.gs
function setTrigger() {
  var triggerDay = new Date();
  triggerDay.setHours(06);
  triggerDay.setMinutes(20);
  ScriptApp.newTrigger("weatherforecast").timeBased().at(triggerDay).create();
}

// その日のトリガーを削除する関数(消さないと残る)
function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "weatherforecast") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}
```
朝6:30に家を出てるので、6:20くらいに通知してほしいです。このへんの時間はお好みで。

以下、ソースの全体像です。

```javascript:コード.gs

//諸々の設定
var channel_access_token = "アクセストークンを記載"; 
var user_id = "ユーザーIDを記載";　//ログビューアーから取得したID
var line_url = 'https://api.line.me/v2/bot/message/push'
var openweathermap_url = 'http://api.openweathermap.org/data/2.5/forecast?id=1850147' //idで東京を指定
var openweathermap_appid = 'OpenWeatherMapAPIキーを記載' //https://openweathermap.org/api　ここから取得できる
var text
var text_jp = []
var rain_flg = 0
var final_text


// その日の06時20分にトリガーを設定
function setTrigger() {
  var triggerDay = new Date();
  triggerDay.setHours(06);
  triggerDay.setMinutes(20);
  ScriptApp.newTrigger("weatherforecast").timeBased().at(triggerDay).create();
}

// その日のトリガーを削除する関数(消さないと残る)
function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "weatherforecast") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

//毎日AM6:20に以下のメソッドを起動
function weatherforecast() {
  //openweathermapから東京の天気予報を取得
  var weatherforecast_finalurl = openweathermap_url + '&APPID=' + openweathermap_appid
  var response = UrlFetchApp.fetch(weatherforecast_finalurl)
  var json = [JSON.parse(response.getContentText())]
  Logger.log(json[0]) //意図した場所の天気が取得できているか確認

  //天気情報を日本語に変換
  for (var i = 0; i <= 4; i++) {
    text = JSON.stringify((json[0].list[3 + i].weather[0].icon))
    Logger.log(json[0].list[3 + i]) //意図した時間の天気が取得できているか確認
    start_weatherforecast(text)
    text_jp[i] = text
  }
  //天気情報をline送信用に編集する
  text_edit()
  //lineへ送信する
  weatherforecast_to_line(channel_access_token,user_id,final_text);
}

//天気情報を日本語に変換
function start_weatherforecast(weather) {
  if (weather == '"01n"' || weather == '"01d"'){
    text = '快晴'
  }
  if (weather == '"02n"' || weather == '"02d"'){
    text = '晴れ'
  }
  if (weather == '"03n"' || weather == '"03d"'){
    text = '曇り'
  }
  if (weather == '"04n"' || weather == '"04d"'){
    text = '曇り'
  }
  if (weather == '"09n"' || weather == '"09d"'){
    text = '小雨'
    rain_flg = 1 //雨
  }
  if (weather == '"10n"' || weather == '"10d"'){
    text = '雨'
    rain_flg = 1 //雨
  }
  if (weather == '"11n"' || weather == '"11d"'){
    text = '雷雨'
    rain_flg = 1 //雨
  }
  if (weather == '"13n"' || weather == '"13d"'){
    text = '雪'
    rain_flg = 1 //雨
  }
  if (weather == '"50n"' || weather == '"50d"'){
    text = '霧'
  }
}

function text_edit() {
  final_text = '傘持っていくといいかも。\n' + '\n18:00  '
              + text_jp[3]+ '\n21:00  ' + text_jp[4]
}

//LINEへ送信
function weatherforecast_to_line(channel_access_token,user_id,text){
  if(rain_flg == 1){
    //LINEに取得結果を送る
    UrlFetchApp.fetch(line_url,{
      'headers': {
          'Content-Type': 'application/json; charset=UTF-8',
          'Authorization': 'Bearer ' + channel_access_token,
      },
      'method': 'post',
      'payload': JSON.stringify({
        'to': user_id,
        'messages' : [
          {
            'type':'text',
            'text':final_text,
          }
        ]
      })
    });
  }
}


```

#GASでトリガーの設定をする
このままだといつまで待っていても実行されないので、決まった時間に上記関数を実行させるように設定します。
<img width="617" alt="スクリーンショット 2019-08-08 22.05.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470825/46ae3b9f-8c94-c683-edc6-291309683f74.png">
GoogleAppScriptでから[編集]>[現在のプロジェクトのトリガー]を選択

<img width="731" alt="スクリーンショット 2019-08-08 22.09.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470825/317242c1-c29b-e799-5eed-6752efbb3eb5.png">
[トリガーを追加]ボタンを押下すると上の画面が出てきます。上記画像の通り設定してください。
**※時刻はLINEを送りたい時間より前に設定してください(今回の場合6:20に送りたいので午前5~6時に設定)**

#動いた。けど...☀️
<img width="355" alt="スクリーンショット 2019-08-08 22.12.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470825/9ae587dd-f824-d2fc-d55b-7d4b7bb9408a.png">
**動いた！！**　今日雨降るぞ！！！(今日は2019/08/08)　傘持って行こう！！！！！

#雨のはずなのに晴れました
なんで？　LINEBOTのバグ？　地球のバグ？　どっち？
どうやら調べてみると、OpenWeatherMapAPIは無料であるがゆえに精度に問題があるらしい。


おとなしく天気予報をみることにします。

それではみなさんさようなら。