2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-19

気になる記事だけ通知してほしい

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

Googleアラートってものがあるのか

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

早速やってみた

こちらにアクセスし、さっそく設定。
https://www.google.co.jp/alerts
image.png
すると、見事Gmail宛に特定キーワードに関連するニュースだけが毎日配信されてきました。
これで情報収集の効率爆上がりや…ありがとう教えてくれた人…

Gmailそもそも見ない問題

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

作ったものと構成

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

image.png

ソースコード

Main.gs


// 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

//グローバル変数
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関数の意図は、以前書いたこちらの記事で詳しく書いてます
  • このソースでは、条件=【未読 and 件名に"Google アラート"を含む】となっているので、一度処理したメールを次回処理対象から外すために既読処理が必要となります(thds[n].markRead();の部分です)
  • Googleアラートの仕様上キーワード毎にメールが分かれます。このプログラムもそれに従って1メールが1メッセージになるようになっています。
  • つまりGoogleアラートにキーワードを追加したら、メッセージが勝手に増えてくれます(逆にキーワード削除したら勝手に減ってくれます)

出来上がった我が家のニュースボット

image.png
非常に良いです。このボットを作っておけば今後気になるキーワードが出てきた時もGoogleアラートの設定画面をポチポチするだけで情報収集がめちゃくちゃはかどります。

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?