業務でPythonでLine広告の提供しているAPIを使ってLINE広告キャンペーンの指標(IMP/click/CTR/CPC/CPM)などを取得する方法を検証したので、それについてメモを残しておきます
前準備
公式ドキュメントは下記にあります。
https://ads.line.me/public-docs/pages/v3/3.9.6/data-general-partner/#_reportonlineresponse
認証周りについて
これは公式ドキュメントに記載されているコードです
このコードでは「”/api/v3/groups/<YOUR_GROUP_ID>/children”」でグループにある各広告キャンペーンを取得する処理になっています。
認証情報はアクセスキーとアクセストークンシークレットの2つが必要です。
access_key = "<YOUR_ACCESS_KEY>" secret_key = "<YOUR_SECRET_KEY>"
あと基本情報としてグループIDとグループ名が必要になります
import base64 import datetime 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 = "<YOUR_ACCESS_KEY>" secret_key = "<YOUR_SECRET_KEY>" method = "POST" canonical_url = "/api/v3/groups/<YOUR_GROUP_ID>/children" url_parameters = "" request_body = {"name": "<YOUR_NEW_GROUP_NAME>"} has_request_body = request_body is not None endpoint = 'https://ads.line.me' + canonical_url + url_parameters request_body_json = json.dumps(request_body) if has_request_body else "" content_type = 'application/json' if has_request_body else "" jws_header = encode_with_base64( json.dumps({ "alg": "HS256", "kid": access_key, "typ": "text/plain", }).encode() ) hex_digest = calc_sha256_digest(request_body_json) payload_date = datetime.datetime.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": datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'), "Authorization": "Bearer %s" % token } if has_request_body: http_headers["Content-Type"] = content_type req = urllib.request.Request(endpoint, data=request_body_json.encode(), headers=http_headers, method=method) else: req = urllib.request.Request(endpoint, headers=http_headers, method=method) with urllib.request.urlopen(req) as res: resp = res.read() print(resp.decode())
各キャンペーンの指標(IMP/CPCなど)を取得する
5章まではよくあるAPIドキュメントで認証周りもサンプルコードがありますし、機能の大半はGETでPOSTで文字列をエンコードして~みたいな部分もないので、ある程度APIを触ったことがある人であれば実装は別に難しくないと思うのですが6章のKPIの部分がちょっとわかりにくかったので、この記事でメモしています。
以下がPythonでLine広告の提供しているAPIを使ってLINE広告キャンペーンの指標(IMP/click/CTR/CPC/CPM)などを取得するサンプルコードになります。
from datetime import datetime as dt # 日付ライブラリを追加 from datetime import timedelta ~~~~~~~~~~~~~ ~~~~~~~~~~~~~ ~~~~~~~~~~~~~ if __name__ == '__main__': # Setting parameters for your request access_key = "<YOUR_ACCESS_KEY>" secret_key = "<YOUR_SECRET_KEY>" method = "POST" accountId="XXXXXX" reportLevel ="campaigns" yesterday = (dt.today() - timedelta(1)).strftime('%Y-%m-%d') print(yesterday) #canonical_url = "/api/v3/adaccounts/"+accountId+"/reports/online/adgroup" canonical_url = "/api/v3/adaccounts/"+accountId+"/reports/online/campaign" url_parameters = "?since="+yesterday+"&until="+yesterday #request_body = {"name": "<グループ名>"} request_body = "" has_request_body = request_body is not None endpoint = 'https://ads.line.me' + canonical_url + url_parameters print('叩いているURLの確認', endpoint) request_body_json = json.dumps(request_body) if has_request_body else "" content_type = 'application/json' if has_request_body else "" jws_header = encode_with_base64( json.dumps({ "alg": "HS256", "kid": access_key, "typ": "text/plain", }).encode() ) hex_digest = calc_sha256_digest(request_body_json) payload_date = datetime.datetime.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": datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'), "Authorization": "Bearer %s" % token } if has_request_body: http_headers["Content-Type"] = content_type req = urllib.request.Request(endpoint, data=request_body_json.encode(), headers=http_headers, method=method) else: 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 i in range(len(body_datas)): print('----------------------------------------------------------------') print(body_datas[i]['campaign']["name"]) print(f"広告費:{body_datas[i]['statistics']['cost']}") print(f"IMP:{body_datas[i]['statistics']['imp']}") print(f"CLs:{body_datas[i]['statistics']['click']}") print(f"CTR:{body_datas[i]['statistics']['ctr']}") print(f"CPC:{body_datas[i]['statistics']['cpc']}") print(f"CPM:{body_datas[i]['statistics']['cpm']}")
APIのURLパラメータについて
上記のコードでは1ページ目までしか取得できないので2ページ目以降を取得する場合は以下のようにしてあげると良いかなと思います
<イメージ例>
url_parameters = "?since="+yesterday+"&until="+yesterday ↓ url_parameters = "?since="+yesterday+"&until="+yesterday+'&page=2'
またそもそもレスポンスのページサイズ(デフォルトは20)を変更することも可能です
<イメージ例>
url_parameters = "?since="+yesterday+"&until="+yesterday ↓ url_parameters = "?since="+yesterday+"&until="+yesterday+'&size=50'
paging系のパラメータはここに記載されています
参考:https://teratail.com/questions/mrhx9a8g368uat
コメント