ゆとりSEですがなにか

忘れないようにメモしてます。

毎朝LINEで天気を通知してくれるトークルームを作った【LINE Notify】【GAS】

背景

勉強がてらプログラミングでモノを作ってみたいと思い立ち、毎朝LINEで天気を通知してくれるトークルームを作ることにしました。参考にあるサイトを見ながら、作ったのでその時の手順を公開します。実際作ってみるとすごく簡単で、プログラミングできない人でも1時間くらいでできてしまいそうです。

欲しいもの

  • 天気を確認するのがめんどくさいので毎朝7時にLINEに天気予報を通知してくれる。

  • 無料で運用。

  • 通知だけの機能で良い。返信など機能はいらない。

  • 場所は東京で固定。

  • 通知先も自分だけ。

構成

調べた結果、下記の構成でできそうだった。

f:id:yasuhiroa24:20200708181408j:plain

必要要素

  • LINE Notify

    メッセージアプリ「LINE」が提供するサービスで、使用すると簡単に無料でLINEにメッセージを送れたり、連携した外部のWebサービスからの通知をLINEで受け取ったりすることが出来ます。

  • GAS(Google App Scripts)

    Googleが提供するサーバーサイド・スクリプト環境。 ほぼJavaScript。 実行する環境(サーバとか)がgoogleのアカウントがあれば無料で使える。

  • Weather Hack

    天気情報を無料でAPI公開しているサービス

構築手順

STEP1 LINE Notifyを使えるようにする。

  • いつも使用している個人のLINE IDで以下にログイン

https://notify-bot.line.me/ja/

  • ログイン後マイページを開く

  • マイページ内の「トークンを発行する」ボタンをクリック f:id:yasuhiroa24:20200708182826p:plain

  • トークン名」「通知先のトークルーム」を設定する。ここでは天気通知、1対1で受け取るように設定。 f:id:yasuhiroa24:20200708183110j:plain

  • 設定後、「発行する」ボタンをクリックして、トークンを発行。

  • 発行されたトークンをコピーして控えておく。 f:id:yasuhiroa24:20200708183415j:plain

STEP2 Google Apps Scriptの準備

STEP3 Google Apps Scriptにコード書く

  • コードを書く。色々参考にして下記を記載。
// LINE Notifyで取得したアクセストークンをXXXXに置き換える
var lineToken = "XXXXXXXXXXXXXXXXXXXXXXXX"; 

function weatherForecast() {

  // 天気APIから情報を取得。「CITY_ID」を、天気を取得したいcity idに置き換える.東京なので130010
  var response = UrlFetchApp.fetch("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010"); 
  
  
  //受け取ったJSONデータを解析して配列jsonに格納
  var json=JSON.parse(response.getContentText());
  
  //ログの表示
  //Logger.log(json);
  
  // 最高気温と最低気温のデータがあるかチェック用に変数に格納
  var maxTempertureisnull = json["forecasts"][0]["temperature"]["max"];
  var minTempertureisnull = json["forecasts"][0]["temperature"]["min"];
  
  /* メッセージ */
  var strBody = json["location"]["city"] + "の天気"+ "\n";

 //天候のデータを格納
  var telop = json["forecasts"][0]["telop"] ;

  // 最高気温のデータがあれば摂氏で取得。無ければ---にする  
  if(maxTempertureisnull != null){
    var maxTemperture = json["forecasts"][0]["temperature"]["max"]["celsius"];
  }else{
    var maxTemperture = "---";
  }
  // 最低気温のデータがあれば摂氏で取得。無ければ---にする    
  if(minTempertureisnull != null){
    var minTemperture = json["forecasts"][0]["temperature"]["min"]["celsius"];
  }else{
    var minTemperture = "---";
  }  
    
  strBody = strBody + "天候: "+ telop + "\n";
  strBody = strBody + "最高気温: " + maxTemperture + "度" + "\n";
  strBody = strBody + "最低気温: " + minTemperture + "度" ;
  sendToLine(strBody);
}

function sendToLine(text){
  var token = lineToken;
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + text,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
  • 取得時間によっては、最高気温と最低気温のデータがある場合とnullの場合がある。そのエラーハンドリングをしているが、もっと良い方法があると思う。なにかあればコメントください。

STEP4 定刻に動かすトリガーの設定

  • スプレッドシートの上部メニューの「編集」>「現在のプロジェクトのトリガー」をクリック f:id:yasuhiroa24:20200708185006p:plain

  • プロジェクトの保存をしてない場合、確認系のポップアップが出るのでOKしていく

  • 「トリガーを追加」をクリック f:id:yasuhiroa24:20200708185049p:plain

  • トリガーの設定をする

    • 実行する関数を選択で「weatherForcast」を選択

    • イベントのソースを選択で「時間主導型」を選択

    • 時間ベースのトリガーのタイプを選択で「日付ベースのタイマー」を選択

    • 時刻を選択で「午前7時 〜8時」を選択 f:id:yasuhiroa24:20200708185347p:plain f:id:yasuhiroa24:20200708185402p:plain

  • 保存をクリック

STEP5 テスト

  • 時間が来る前に手動で実行する。 GAS のスクリプトエディタのプロジェクトの「実行」>「関数を実行」>「weatherForecast」をクリック

f:id:yasuhiroa24:20200708185557p:plain

  • LINEに通知が来ることを確認 f:id:yasuhiroa24:20200708215619p:plain

  • 午前7時から8時にLINEに通知が来ることを確認 f:id:yasuhiroa24:20200709072041p:plain

感想

GASがすごい便利だ。これが無料なんて。。

簡単にできて、かつ、有用なツールができて嬉しい。

GASとpython でもっと何か作りつつ向上させたい。

参考

https://qiita.com/iitenkida7/items/576a8226ba6584864d95

https://qiita.com/t_o_d/items/a29b4ba6eacad77b3690

https://www.smilevision.co.jp/blog/tsukutte10/