LINEmessagingAPIとGoogleアラートで自分専用ニュースボットを作る

# 気になる記事だけ通知してほしい
ニュースアプリというものはとても良くできていて、興味ありそうなニュースからそうじゃないものまでたくさんのニュースを並べてくれます。ただ個人的には、あるキーワードに関連するニュースを重点的に追いたい場面があります。例えば仕事でSAPのプロジェクトにアサインされた時には、SAPに関する情報を毎日追いたい。というような感じです。そういうときニュースアプリでは広く浅く情報が集まるので情報収集の効率がイマイチ上がりません。
※余談ですが、以前はカメリオっていうアプリがあって、そのアプリで特定のキーワードでニュースを集めることができたんですがだいぶ前にサービス終了してしまいました…

# Googleアラートってものがあるのか
あるとき樺沢紫苑さんの「学び効率が最大化するインプット大全」を読んでいると何やら「Googleアラート」というものがあって、それを使うと特定のキーワードでニュースを集めることができるそうです。これめっちゃええやんということで早速やりました

# 早速やってみた
こちらにアクセスし、さっそく設定。
https://www.google.co.jp/alerts
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646573/cbef7074-1c61-e9d4-e9a3-7364c2b2b5ec.png)
すると、見事Gmail宛に特定キーワードに関連するニュースだけが毎日配信されてきました。
これで情報収集の効率爆上がりや…ありがとう教えてくれた人…

# Gmailそもそも見ない問題
タイトルの通りです…本当にすみません。Googleさんが毎日律儀にニュースを送ってくれるんですが、そもそも私Gmail見ないんですね。（あるあるネタかもしれませんが個人のGmailアカウントっていろんなサービスの登録アドレスに使ってるから広告のメールやらなんやらがほとんどなので普段は見てないのです…）
じゃあ何なら見るんだろう、と考えたときにやっぱりLINEに通知してくれたら見るな、ということでGoogleアラートの通知をLINEに転送するボット（自分専用ニュースボット）を作りました！


# 作ったものと構成
 - 毎日8:15に、自分の興味あるニュースだけを通知してくれる
 - ニュース集めはGoogleアラートさんのお仕事
 - Gmailに通知されたニュースをLINEに転送する
 - 転送部分はGoogleAppsScriptで実装
 - キーワードの追加/削除はGoogleアラートでOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646573/309fdf69-9cc3-a80d-a087-32fdd4b39ea2.png)


# ソースコード

Main.gs

```javascript

// GoogleAppScriptの実行トリガーを時間主導型の1分ごとに設定
function getMail(){
    //未読メールを検索
    setTrigger(); // 翌日実行分のトリガをセットする
    var thds = GmailApp.search("label:inbox is:unread subject:Google アラート");  // 条件=【受信ボックスのメール and 未読 and 件名に"Google アラート"を含む】

    for(var n in thds){        
        var thd = thds[n];        
        var msgs = thd.getMessages();
        for(m in msgs){
            var msg = msgs[m];
            var body = msg.getPlainBody();  //メール本文
            body =   body.substr(1 ,4999);  //LineAPIが5000文字までしか読めないため4999文字で切る
            sendLineMessage(body);
        }
      thds[n].markRead(); //次回実行の検索に引っかからないようにするため、既読にする
    }
}

//#####次回トリガー設定関数#####
function setTrigger() {

  var m = Moment.moment().add(24,"hours"); //現在日時 + 24時間後
  var NextTriggerTime = new Date(m.format('YYYY/M/D'))
  NextTriggerTime.setHours(m.format('H'));
  NextTriggerTime.setMinutes(15); 
  
  ScriptApp.newTrigger('getMail').timeBased().at(NextTriggerTime).create();  
}
```

LineMessage.gs

```javascript
//グローバル変数
var channel_access_token = "[LineAPIアクセストークン]"; //ProductionWorkSpace
var headers = {
   "Content-Type": "application/json; charset=UTF-8",
   "Authorization": "Bearer " + channel_access_token
};

//#####ラインメッセージ関数#####
function sendLineMessage(message){
  var payload =
   {
    "messages":[
        {
            "type":"text",
            "text":message
        }
    ]
   };
  
  var params ={method : 'post', headers: headers, payload: JSON.stringify(payload)};
  Logger.log(message);
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/broadcast", params);
}
```

構成図を見てもらえばわかる通り、実は高度な事は何もやってなくてGmailの内容をLINEに転送するだけです笑
とはいえ少しだけ説明します

 - setTrigger関数の意図は、以前書いた[こちら](https://qiita.com/kuma16/items/ec803f9bf4fc232d0060)の記事で詳しく書いてます
 - このソースでは、条件=【未読 and 件名に"Google アラート"を含む】となっているので、一度処理したメールを次回処理対象から外すために既読処理が必要となります（thds[n].markRead();の部分です）
 - Googleアラートの仕様上キーワード毎にメールが分かれます。このプログラムもそれに従って1メールが1メッセージになるようになっています。
 - つまりGoogleアラートにキーワードを追加したら、メッセージが勝手に増えてくれます（逆にキーワード削除したら勝手に減ってくれます）
 
# 出来上がった我が家のニュースボット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646573/de2bde18-5c70-cacb-6e67-335d2d3f7d03.png)
非常に良いです。このボットを作っておけば今後気になるキーワードが出てきた時もGoogleアラートの設定画面をポチポチするだけで情報収集がめちゃくちゃはかどります。