TWICE最新ニュースを取得してくれるLINEbotつくった。

#はじめに
　TWICEファン歴２年ほど。TwitterやInstagramなどからも最新情報を取得できるが、公式以外の外部記事も気になる。また、K-POPがまとめられているサイトもあるのだが、毎日開くのも面倒。
　そこで、Twiceの最新ニュースを毎日取得してくれるLINEbotを開発しました。

##目次
1.Line Developersアカウントの準備
2.Google スプレッドシートに「TWICE」のニュースをスクレイピング
3.LINEbotで通知するようにGASでコーディング
4.アプリケーションを公開して定期トリガーを設定

#1.Line Developersアカウントの準備
　まずは、LINEbotを開発管理するページ（https://developers.line.biz/ja/） にアクセスし、新規チャネルを作ります。初めての場合はまずアカウントを作りましょう。

#2.Google スプレッドシートに「TWICE」のニュースをスクレイピング
###RSSフィードを取得
  今回はGoogleNewsから、取得したいニュースを調べます。こちらから[GoogleNews](https://news.google.com/topstories?hl=ja&gl=JP&ceid=JP:ja)のページにアクセスし、取得したいトピックスで検索します。
　TWICEで検索すると、関連するニュースが出てきます。この検索画面のページのURLをコピーしてください。スクレイピングする際に必要になります。
###Googleスプレッドシートにスクレイピング
　GoogleSpreadSheetを使用します。まずは、新規のGoogleスプレッドシートを作成し、ここにスクレイピングしていきます。
　一番左端A１セルに先ほどコピーしたURLを貼り付けます。
　フィードのインポートにはスプレッドシートの関数IMPORTFEEDを利用します。
　IMPORTFEED(フィードURL, クエリ, 見出し, アイテム数)　
　関数の引数について解説しています。

>フィードURL：RSSフィードURLを入力する。A1セルに入力したURLを指定。
クエリ：フィードに公開されている記事を取得したいので、itemを指定。
見出し：見出しの表示/非表示を設定。ここでは見出しを表示するためtrueを指定。
アイテム数：取得する記事の数を指定。ここでは5件取得する。

　あとは、日時を取得するように設定します。

1. C1セルに=TODAY()を記入して現在日時を取得する。
2. B1セルに=A1&"%d="&C1と記入。URL末尾に日付がくっつく。
3. IMPORTFEED関数の第一引数、フィードURLにB1セルを指定する

これで最新ニュースが以下のようにスクレイピングされるはずです。
![スクリーンショット 2020-10-16 9.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774875/311259b7-bf70-60e4-c494-d449cb8835e1.png)

#3.LINEbotで通知するようにGASでコーディング
　TWICEの最新ニュースを取得できるようになったので、これをLINE Botに通知するよう実装しましょう。
先ほど作成したスプレッドシートに紐づいたGAS上にコーディングしていきます。

　まずは、スプレッドシート上で「ツール」タブをクリック→「スクリプトエディタ」をクリック

- ニュースフィードを取得
- 前回の取得以降に配信されたニュースかチェック
- 最新のニュースフィードのみ配列に追加
- 配列をLINE Botにpush

```javascript:main.js
var CURRENT_TIME = new Date();

function main() {　
  // 紐づいているスプレッドシートの情報を取得
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  // 1.ニュースフィードを取得
  var feedsObj = getFeeds(sheets[0]);

  // ニュースフィード毎に最新か確認し、配列に格納
  var newFeeds = [];
  for (var i in feedsObj["feeds"]) {
    // 2.前回の取得以降に配信されたニュースかチェック
    if (
      new Date(feedsObj["feeds"][i][2]).getTime() >
      new Date(feedsObj["lastCheckTime"]).getTime()
    ) {
      // 3.最新のニュースフィードのみ配列に追加
      newFeeds.push(feedsObj["feeds"][i]);
    }
  }

  // Botで通知するメッセージの作成
  for (var i in newFeeds) {
    var message = [
      {
        type: "text",
        text: newFeeds[i][0] + "\r\n" + newFeeds[i][1]
      }
    ];
    Logger.log("メッセージ：" + message[0].text); // デバッグ用

    // 4. 配列をLINE Botにpush
    pushTemplate(message);
  }
}

function getFeeds(sheet) {
  // １週間前の日時を取得
  var pastDate = new Date();
  pastDate.setDate(pastDate.getDate() - 7);

  // 最終更新日を取得。更新日のセルが未入力だった場合は１週間前の日時を入れる
  var lastCheckTime = sheet.getRange("C1").getValue() || pastDate;
  Logger.log("lastCheckTime：" + lastCheckTime); // デバッグ用

  // 更新日のセルに現在日時を設定（C1セルが更新されるとスクレイピングを始めるので3秒待つ）
  sheet.getRange("C1").setValue(CURRENT_TIME);
  Utilities.sleep(3000);

  // スクレイピングしたフィードを取得
  var lastRow = sheet.getLastRow();
  var feeds = sheet.getRange(3, 1, lastRow - 2, 3).getValues();

  return { feeds: feeds, lastCheckTime: lastCheckTime };
}

// スクリプトプロパティの操作のための変数
var PROP = PropertiesService.getScriptProperties();
// LINE developersのメッセージ送受信設定に記載のアクセストークン
var ACCESS_TOKEN = PROP.getProperty("ACCESS_TOKEN");
// 必要なURL情報の定義
var URL_PUSH = "https://api.line.me/v2/bot/message/push";
// ヘッダーを定義
var HEADERS = {
  "Content-Type": "application/json",
  Authorization: "Bearer " + ACCESS_TOKEN
};

function pushTemplate(message) {
  var props = PROP.getProperties();
  for (var prop in props) {
    if (prop !== "ACCESS_TOKEN") {
      var postData = {
        to: props[prop],
        messages: message
      };

      var options = {
        method: "post",
        headers: HEADERS,
        payload: JSON.stringify(postData)
      };
      var response = UrlFetchApp.fetch(URL_PUSH, options);
    }
  }
}
```

#4.アプリケーションを公開して定期トリガーを設定
　次は、WebhookURLを設定し、LINEbotとGASを紐付ける作業です。
- GASの画面で[公開] -> [ウェブアプリケーションとして導入]
- 現在のウェブアプリケーションのURLをコピー
- LINEbotのWebhook設定にペーストして検証

　以上でアプリケーションは完成です。一度正常に動作するかテストしてみましょう。
1. GASコード上部の「関数を選択」と書いてある部分をクリック
2. プルダウンが現れるので、main関数を指定
3. プルダウンの左側の▶︎ボタンを押して、関数を実行。

　うまくいけば、LINEbotからスクレイピングしたニュースが届いたはずです。

　あとは、定期的に作動するようにトリガーを設定しましょう。
GASコードのメニューバーの「編集」→「現在のプロジェクトのトリガー」」をクリック
開いた画面を以下のように設定します。

![スクリーンショット 2020-10-15 11.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774875/50e54c3f-7393-cd9d-d71f-9549548749ab.png)

時間などは、お好みで調整してください。