LINE Ads APIでスプレッドシートに広告レポートを作成する。
今回は、不動産とは全然関係ないのですが、最近LINE Ads APIを利用することがあり、関連する記事がなかなか見つからなかったので、備忘も兼ねてLINE広告のデータをLINE Ads APIを使ってスプレッドシートに転記する方法についてまとめたいと思います。(コピペして使えるコードも貼っておきます)
LINE Ads APIについて
私はマーケターなので、Google広告やMeta広告などの広告データをスプレッドシートに引っ張ってきて、複数媒体をまとめてKPI管理する広告運用レポートを作ることが多いのですが、LINE広告のデータを引っ張ってくるのは初でしたので、まずはその違いや準備が必要な環境から書いていきます。
まず、LINE Ads APIは、権限申請をしないと使えません。権限を付与するグループIDを指定して、権限申請して10営業日前後待ちます。
次に、ほとんどの広告アカウントのデータはJavaScript(Google App Script)でデータ取得ができるのですが、LINE Ads APIはPythonでの記述が必要になります。(Google App Scriptを使う場合は、PythonのコードをGoogle App Scriptに変換する必要があります。後で変換したコードも紹介しています)
今回は、Pythonを使用する環境が必要なのですが、私はエンジニアではないため、スプレッドシートとの相性も考慮して環境構築が必要ないGoogle Colabを使用しました。Google Colabは面倒な認証に関するコード記述がほとんどなくスプレッドシートを簡単に動かせます。
PythonでOnlineReportsのコードを記述する
LINE Ads APIは、各APIで何ができるのかさらっとしか記述されておらず、サンプルコードもほとんどないので、最初だいぶ苦戦しました。
今回使用するOnlineReportsは、This API enables to access reports in json format.とだけ書いてありますが、LINE広告のデータを直接取得することができるので、今回はこちらを使用します。
from google.colab import auth
import google.auth
import gspread
# Google認証を行います
auth.authenticate_user()
# google.authから認証情報を取得
credentials, project = google.auth.default()
# gspreadでの認証
gc = gspread.authorize(credentials)
# スプレッドシートを開きます
spreadsheet_id = 'スプレッドシートのIDを入力してください'
worksheet = gc.open_by_key(spreadsheet_id).sheet1
from datetime import datetime as dt, timedelta
import base64
import hashlib
import hmac
import json
import urllib.request
def calc_sha256_digest(content: str) -> str:
sha256 = hashlib.new('sha256')
sha256.update(content.encode())
return sha256.hexdigest()
def encode_with_base64(value: bytes) -> str:
return base64.urlsafe_b64encode(value).decode()
if __name__ == '__main__':
# Setting parameters for your request
access_key = "LINE Ads APIのアクセスキーを入力してください"
secret_key = "LINE Ads APIのシークレットキーを入力してください"
#content_type = 'application/json'
method = "GET"
accountId="LINE広告のアカウントID(Aではじまる)を入力してください"
yesterday = (dt.today() - timedelta(1)).strftime('%Y-%m-%d')
canonical_url = f"/api/v3/adaccounts/{accountId}/reports/online/campaign"
url_parameters = f"?since={yesterday}&until={yesterday}"
request_body_json = ""
endpoint = 'https://ads.line.me' + canonical_url + url_parameters
print('エンドポイントのURL確認', endpoint)
jws_header = encode_with_base64(
json.dumps({
"alg": "HS256",
"kid": access_key,
"typ": "text/plain",
}).encode()
)
#hex_digest = calc_sha256_digest(request_body_json)
hex_digest = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" # リクエストボディが存在しない場合の固定値
content_type = "" # Content-Type is not specified
payload_date = dt.utcnow().strftime('%Y%m%d')
payload = "%s\n%s\n%s\n%s" % (hex_digest, content_type, payload_date, canonical_url)
jws_payload = encode_with_base64(payload.encode())
signing_input = "%s.%s" % (jws_header, jws_payload)
signature = hmac.new(
secret_key.encode(),
signing_input.encode(),
hashlib.sha256
).digest()
encoded_signature = encode_with_base64(signature)
token = "%s.%s.%s" % (jws_header, jws_payload, encoded_signature)
http_headers = {
"Date": dt.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'),
"Authorization": "Bearer %s" % token
}
req = urllib.request.Request(endpoint, headers=http_headers, method=method)
with urllib.request.urlopen(req) as res:
body = json.loads(res.read())
body_datas = body['datas']
# 各キャンペーンのKPIを取得する
for data in body_datas:
print('----------------------------------------------------------------')
print(data['campaign']["name"])
print(f"広告費:{data['statistics']['cost']}")
print(f"IMP:{data['statistics']['imp']}")
print(f"CLs:{data['statistics']['click']}")
print(f"CTR:{data['statistics']['ctr']}")
print(f"CPC:{data['statistics']['cpc']}")
print(f"CPM:{data['statistics']['cpm']}")
# 取得したデータをスプレッドシートに書き込みます
for data in body_datas:
row = [
yesterday, # A列に前日の日付
data['campaign']["name"], # B列にキャンペーン名
data['statistics']['cost'], # C列に広告費
data['statistics']['imp'], # D列にIMP
data['statistics']['click'], # E列にCLs
data['statistics']['ctr'], # F列にCTR
data['statistics']['cpc'], # G列にCPC
data['statistics']['cpm'], # H列にCPM
]
worksheet.append_row(row) # スプレッドシートに1行追加します
今回は、キャンペーンごとに前日の広告費、インプレッション、クリック、CTR、CPC、CPMの数値を取得して、スプレットシートのA列に日付、B列以降に取得した各数値が入るようなコードを作成しています。スプレッドシートの最終行に追加するようにしているので、1日1回動かせば、前日のデータを追加してくれます。
ちなみに、各項目の名称は下記を参照してください。
PythonをGoogle App Scriptに変換する
Google Colabは、時間をトリガーにして自動でプログラムを起動することができないため、さきほど作成したコードを都度手動で起動する必要があります。Pythonを定期的に動かそうとすると、Google Cloud Functions または AWS Lambdaないしサーバーが必要になるのですが、LINE広告のデータを取得するだけでそこまで大袈裟なことはしたくないので、Pythonで作成したコードをGoogle App Scriptに変換してGoogle App Scriptの時間トリガーで毎日起動するようにしたいと思います。
function getLineAdsDataAndAppendToSheet() {
const access_key = "LINE Ads APIのアクセスキーを入力してください";
const secret_key = "LINE Ads APIのシークレットキーを入力してください";
const accountId = "LINE広告のアカウントIDを入力してください";
const now = new Date();
const yesterday = new Date(now);
yesterday.setDate(now.getDate() - 1);
const yyyyMMdd = Utilities.formatDate(yesterday, 'JST', 'yyyy-MM-dd');
const canonical_url = `/api/v3/adaccounts/${accountId}/reports/online/campaign`;
const url_parameters = `?since=${yyyyMMdd}&until=${yyyyMMdd}`;
const endpoint = 'https://ads.line.me' + canonical_url + url_parameters;
const headerJson = {
"alg": "HS256",
"kid": access_key,
"typ": "text/plain"
};
const jws_header = Utilities.base64EncodeWebSafe(JSON.stringify(headerJson));
const hex_digest = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
const payload_date = Utilities.formatDate(new Date(), 'UTC', 'yyyyMMdd');
const payload = `${hex_digest}\n\n${payload_date}\n${canonical_url}`;
const jws_payload = Utilities.base64EncodeWebSafe(payload);
const signing_input = `${jws_header}.${jws_payload}`;
const signature = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, signing_input, secret_key);
const encoded_signature = Utilities.base64EncodeWebSafe(signature);
const token = `${jws_header}.${jws_payload}.${encoded_signature}`;
const http_headers = {
"Date": Utilities.formatDate(new Date(), 'GMT', 'EEE, dd MMM yyyy HH:mm:ss z'),
"Authorization": "Bearer " + token
};
const options = {
'method': 'get',
'headers': http_headers
};
const response = UrlFetchApp.fetch(endpoint, options);
const body = JSON.parse(response.getContentText());
const body_datas = body.datas;
const spreadsheet = SpreadsheetApp.openById('スプレッドシートのIDを入力してください');
const worksheet = spreadsheet.getSheetByName('シート1'); // Assume the name is 'Sheet1'
for(let data of body_datas) {
const row = [
yyyyMMdd,
data.campaign.name,
data.statistics.cost,
data.statistics.imp,
data.statistics.click,
data.statistics.ctr,
data.statistics.cpc,
data.statistics.cpm
];
worksheet.appendRow(row);
}
}
LINE Ads APIに関する情報は少ないので、この記事が少しでも参考になれば、幸いです。