LINE公式アカウントの友だち数やブロック数を自動取得する
業務効率化公開日:2024年3月29日 更新日:2024年4月1日
LINE公式アカウントを運用する上で、友だち数やブロック数などの指標は、アカウントの健全性とリーチの効果を測定する上で重要なデータです。
これらの数値はLINEの管理画面からも確認可能ですが、日々の変動をトラッキングし、時系列データを分析することは、効果的な施策の発見や改善につながります。
そしてこれらのデータを関係者に定期的に報告・共有することは、チーム内での透明性の担保や、投資配分・人員配置の意思決定の補助となります。
しかしながら、毎日のデータをぽちぽち集計するのは時間がかかる上、ミスが発生してしまうおそれがあります。
この記事では、LINE公式アカウントの友だち数やブロック数をGoogle Apps Scriptを用いて自動で取得し、スプレッドシートに集計する方法を解説します。
目次
LINEデータの自動連携の下準備
チャネルアクセストークンの取得
まずはLINE Developersコンソールでチャネルアクセストークンを取得します。
チャネルアクセストークンとは、LINEプラットフォームが提供しているMessaging APIなどの機能にアクセスするためのものです。
チャネルアクセストークンを取得するために、まずLINE Developers コンソールにログインしましょう。
ログイン後、まずプロバイダーを選択します。
プロバイダーに移動したら、次にチャネルの設定を行います。
友だち数やブロック数を取得は、後ほど詳細に解説しますが「Messaging API」を通じておこなうため、Messaging APIを選択します。
もしまだMessaging APIのチャネルが作成されていなかったら作成をしましょう。
Messaging APIの画面に移動したら、タブメニューの中にある「Messaging API設定」を選択します。
最後に、このMessaging APIの画面下にある、「チャネルアクセストークン(長期)」に移動します。
もしチャネルアクセストークンがまだ設定されていない場合、「発行」ボタンを押すことで長期のチャネルアクセストークンを取得することができます。
チャネルアクセストークンには4つの種類があります。
- チャネルアクセストークンv2.1
- ステートレスチャネルアクセストークン
- 短期のチャネルアクセストークン
- 長期のチャネルアクセストークン
長期のチャネルアクセストークン以外は全て有効期限があり、レポート等の定期更新にはむいていません。
Google Apps Scriptの設定
続いてGoogle Apps Scriptの設定をおこなっていきます。
まず新しいスプレッドシートを作成し、「拡張機能」から「Apps Script」を選択します。
次に、チャネルアクセストークンを直接コードに書くことは避けたいので、Apps Scriptのスクリプトプロパティを設定していきます。
Apps Scriptの左側の歯車マーク「プロジェクトの設定」から、スクリプトプロパティを設定していきます。
今回はプロパティ名を「ACCESS_TOKEN」という名前にしました。
この値の部分に先ほどLINE Developers コンソールで取得した長期のチャネルアクセストークンを貼り付けます。
これで下準備は完了です。
Apps ScriptでLINEデータを取得するコード
スプレッドシートとの連携
まずはApps Scriptで取得したデータをスプレッドシートに反映させるために、反映先のスプレッドシートの情報を用意します。
function getFriendData() {
const wb = '*********************************************';
const ws = '***********';
const sheet = SpreadsheetApp.openById(wb).getSheetByName(ws);
const wb にはスプレッドシートのIDを挿入します。
スプレッドシートのIDは、スプレッドシートのURLにおける
https://docs.google.com/spreadsheets/d/********ココ********/edit#gid=0
この部分です。
const ws には、スプレッドシートのシート名を入力します。(シート1など)
Messaging APIでデータを取得する
次にMessaging APIからデータを取得します。
公式ドキュメントによると、リクエストヘッダーにチャネルアクセストークンを、クエリパラメータとして日付を指定できます。
しかしながら日付のFromやToなどは指定できないため、クエリパラメータで選択する日付を工夫しなければなりません。
今回は過去7日間の推移を取得するために、forでループさせます。
そして取得したデータを、const dataに格納し、appendRowで指定したスプレッドシート貼り付けていきます。
// 過去7日間の日付を取得
for (let i = 0; i < 7; i++) {
const date = Utilities.formatDate(new Date(new Date().getTime() - i * 24 * 60 * 60 * 1000), Session.getScriptTimeZone(), 'yyyy/MM/dd');
// APIエンドポイントの設定
const url = `https://api.line.me/v2/bot/insight/followers?date=${date.replace(/\//g, '')}`;
const accessToken = PropertiesService.getScriptProperties().getProperty('ACCESS_TOKEN')
// APIリクエストのオプション設定
const options = {
"method": "get",
"headers": {
"Authorization": `Bearer ${accessToken}`,
},
"muteHttpExceptions": true
};
// APIリクエストの実行
const response = UrlFetchApp.fetch(url, options);
const statusCode = response.getResponseCode();
const responseBody = response.getContentText();
if (statusCode === 200) {
// レスポンスからデータを抽出
const result = JSON.parse(responseBody);
// スプレッドシートに書き込むデータを配列に格納
const data = [
date, // 日付
result.followers, // 友だち数
result.targetedReaches, // 到達数
result.blocks // ブロック数
];
// スプレッドシートの最後の行にデータを追加
sheet.appendRow(data);
} else {
// エラーハンドリング
Logger.log(`Error: ${statusCode} - ${responseBody}`);
}
}
}
先ほどスクリプトプロパティで定義したチャネルアクセストークンは、以下の部分で取得しています。
const accessToken = PropertiesService.getScriptProperties().getProperty('ACCESS_TOKEN')
セキュリティ的な観点で、このように直接アクセストークンをコード上には記載しないようにしましょう。
注意点としては、Messaging APIにはリクエストの制限があることです。
Messaging APIにおける友だち数の取得の制限は「60リクエスト/時間」です。
紹介した処理方法だと、日付をループさせ、計7回リクエストをおこなっていることになります。
つまり、一度の実行では最大60日分しか取得できないので注意しましょう。
重複データを削除する
この方法だけだと、毎日過去7日間のデータが取得されるため、データの重複が発生してしまいます。
そのため、日付をキーに重複データを見つけ、削除する処理も用意する必要があります。
まずは新しい関数を用意して、同様にスプレッドシートを取得する処理を記述します。
function removeDuplicates() {
const wb = '*********************************************';
const ws = '***********';
const sheet = SpreadsheetApp.openById(wb).getSheetByName(ws);
// 全データの取得
const range = sheet.getDataRange();
const values = range.getValues();
続いて、取得したデータから重複した日付を見つけ出し、重複を削除します。
その後、一度シート全体を削除し、重複が削除されたデータを全体に貼り付ける処理をおこないます。
// 重複のないデータのみを新しい配列に格納
const newData = [];
for (const date in uniqueData) {
newData.push(uniqueData[date]);
}
// スプレッドシートの内容をクリア
sheet.clear();
// 新しいデータをスプレッドシートに設定
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
これで重複処理も完了です。
データ取得・重複削除を処理する関数
最後に、データ取得・重複削除を処理する関数を実行する関数を用意します。
以下のように記述して、データ取得後、重複処理をおこなうようにします。
function updateLineData() {
getFriendData();
removeDuplicates();
}
Apps Scriptのトリガー設定
コードの記述が完了したらApps Scriptの機能として用意されている「トリガー」を設定します。
トリガーを設定することで、これらのコードを毎日決まった時間に実行してくれます。
トリガーの設定は「GA4のデータを自動的にスプレッドシートに連携するスクリプト」でも紹介しているので、今回は割愛します。
注意点として、実行する関数はupdateLineDataを選択することです。
getFriendDataやremoveDuplicatesだけでは処理として十分ではありません。
コードの全文
最後に今回解説したコードの全文を紹介します。
みなさんの業務の効率化に役立ててください。
function getFriendData() {
// シートの読み込み
const wb = '***************************************';
const ws = '**********';
const sheet = SpreadsheetApp.openById(wb).getSheetByName(ws);
// 過去7日間の日付を取得
for (let i = 0; i < 6; i++) {
const date = Utilities.formatDate(new Date(new Date().getTime() - i * 24 * 60 * 60 * 1000), Session.getScriptTimeZone(), 'yyyy/MM/dd');
// APIエンドポイントの設定
const url = `https://api.line.me/v2/bot/insight/followers?date=${date.replace(/\//g, '')}`;
const accessToken = PropertiesService.getScriptProperties().getProperty('ACCESS_TOKEN')
// APIリクエストのオプション設定
const options = {
"method": "get",
"headers": {
"Authorization": `Bearer ${accessToken}`,
},
"muteHttpExceptions": true
};
// APIリクエストの実行
const response = UrlFetchApp.fetch(url, options);
const statusCode = response.getResponseCode();
const responseBody = response.getContentText();
if (statusCode === 200) {
// レスポンスからデータを抽出
const result = JSON.parse(responseBody);
// スプレッドシートに書き込むデータを配列に格納
const data = [
date, // 日付
result.followers, // 友だち数
result.targetedReaches, // 到達数
result.blocks // ブロック数
];
// スプレッドシートの最後の行にデータを追加
sheet.appendRow(data);
} else {
// エラーハンドリング
Logger.log(`Error: ${statusCode} - ${responseBody}`);
}
}
}
function removeDuplicates() {
// シートの読み込み
const wb = '***************************************';
const ws = '**********';
const sheet = SpreadsheetApp.openById(wb).getSheetByName(ws);
// 全データの取得
const range = sheet.getDataRange();
const values = range.getValues();
const uniqueData = {};
values.forEach(row => {
const date = row[0];
uniqueData[date] = row;
});
// 重複のないデータのみを新しい配列に格納
const newData = [];
for (const date in uniqueData) {
newData.push(uniqueData[date]);
}
// スプレッドシートの内容をクリア
sheet.clear();
// 新しいデータをスプレッドシートに設定
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
function updateLineData() {
getFriendData();
removeDuplicates();
}