見出し画像

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回動かせば、前日のデータを追加してくれます。

ちなみに、各項目の名称は下記を参照してください。

reportonlinestatistics

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に関する情報は少ないので、この記事が少しでも参考になれば、幸いです。

いいなと思ったら応援しよう!

片山 幹健 |Social Bank
SmartApproachのテスト利用に付き合ってもいいよ(無料です)という企業さんや、事業立ち上げ手伝ってもいいよ(今6人ですが、ほぼ副業メンバーです)という方がいらっしゃいましたら、ご連絡いただけますと嬉しいです。よろしくお願いいたします。