Python

【Python】LineAdsAPIを使ってLINE広告キャンペーン指標を取得する

この記事は約12分で読めます。

 

業務で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系のパラメータはここに記載されています

LINE Ads API documentation

 

 

参考:https://teratail.com/questions/mrhx9a8g368uat

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

タイトルとURLをコピーしました