#はじめに
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件取得する。
あとは、日時を取得するように設定します。
- C1セルに=TODAY()を記入して現在日時を取得する。
- B1セルに=A1&"%d="&C1と記入。URL末尾に日付がくっつく。
- IMPORTFEED関数の第一引数、フィードURLにB1セルを指定する
これで最新ニュースが以下のようにスクレイピングされるはずです。
#3.LINEbotで通知するようにGASでコーディング
TWICEの最新ニュースを取得できるようになったので、これをLINE Botに通知するよう実装しましょう。
先ほど作成したスプレッドシートに紐づいたGAS上にコーディングしていきます。
まずは、スプレッドシート上で「ツール」タブをクリック→「スクリプトエディタ」をクリック
- ニュースフィードを取得
- 前回の取得以降に配信されたニュースかチェック
- 最新のニュースフィードのみ配列に追加
- 配列をLINE Botにpush
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設定にペーストして検証
以上でアプリケーションは完成です。一度正常に動作するかテストしてみましょう。
- GASコード上部の「関数を選択」と書いてある部分をクリック
- プルダウンが現れるので、main関数を指定
- プルダウンの左側の▶︎ボタンを押して、関数を実行。
うまくいけば、LINEbotからスクレイピングしたニュースが届いたはずです。
あとは、定期的に作動するようにトリガーを設定しましょう。
GASコードのメニューバーの「編集」→「現在のプロジェクトのトリガー」」をクリック
開いた画面を以下のように設定します。
時間などは、お好みで調整してください。