2
4

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.

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

Last updated at Posted at 2020-10-16

#はじめに
 TWICEファン歴2年ほど。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のページにアクセスし、取得したいトピックスで検索します。
 TWICEで検索すると、関連するニュースが出てきます。この検索画面のページのURLをコピーしてください。スクレイピングする際に必要になります。
###Googleスプレッドシートにスクレイピング
 GoogleSpreadSheetを使用します。まずは、新規のGoogleスプレッドシートを作成し、ここにスクレイピングしていきます。
 一番左端A1セルに先ほどコピーした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

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

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

  • ニュースフィードを取得
  • 前回の取得以降に配信されたニュースかチェック
  • 最新のニュースフィードのみ配列に追加
  • 配列をLINE Botにpush
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) {
  // 1週間前の日時を取得
  var pastDate = new Date();
  pastDate.setDate(pastDate.getDate() - 7);

  // 最終更新日を取得。更新日のセルが未入力だった場合は1週間前の日時を入れる
  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

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?