Meta広告レポートをPythonで自動化する実装手順
広告運用者にとって、毎朝のレポート更新は避けて通れない。Meta広告マネージャを開き、数字をコピーし、スプレッドシートに貼る。この作業を複数アカウントで回すと、それだけで1時間が消える。だが Meta の Marketing API と Python を組み合わせれば、この定型作業は数分に縮む。実際に3アカウントの日次レポートを自動化したところ、毎朝の手作業がほぼゼロになった。ここでは、アクセストークンの取得から Insights API の呼び出し、現場でハマった罠までを、そのまま動くコードとあわせて解説する。
なぜMeta広告レポートはPython自動化に向くのか
GAS やスプレッドシートのアドオンでも自動化はできる。ただ、複数媒体を横断し、独自の集計軸で並べたい運用者には Python が向く。理由は3つある。第一に、pandas で自由に集計・結合できる。第二に、Meta・Google・Yahoo の各 API を同じ言語でまとめられる。第三に、cron や launchd で完全に無人化できる。実測では、3アカウントの日次集計を手作業で回すと毎朝およそ50分かかっていた。Python 化した後は、朝には集計済みの CSV が出来上がっている。この差は月20営業日でおよそ16時間になる。この集計ロジックの完全版は note の実践ガイドにまとめている。
事前準備 アクセストークンとアカウントIDを用意する
Insights API を叩くには、事前に2つの値がいる。アクセストークンと広告アカウントIDだ。手順はこうなる。(1)Meta for Developers でアプリを作り、ads_read の権限を付ける。(2)短期トークンは数時間で失効するため、ビジネス設定からシステムユーザーの長期トークンを発行する。(3)広告アカウントIDはビジネスマネージャで確認し、必ず先頭に act_ を付けた形(例 act_1234567890)で使う。ここを普通の数字だけで渡すと、API はエラーを返す。最初の詰まりどころなので、まず1件だけ手元で叩いて疎通を確かめるとよい。
PythonでInsights APIから広告データを取得する
取得のエンドポイントは GET /v21.0/{act_アカウントID}/insights になる。主要なパラメータは fields、level、date_preset、access_token の4つだ。fields には spend(消化額)、impressions、clicks、ctr、cpc、actions(コンバージョン)を指定する。level を campaign にすればキャンペーン単位、ad にすれば広告単位で返る。date_preset に yesterday を渡せば前日分だけが取れる。まずは短い骨格をブックマークして、自分の環境に合わせて書き換えて使ってほしい。
import requests; params={"fields":"campaign_name,spend,impressions,clicks,ctr,cpc,actions","level":"campaign","date_preset":"yesterday","access_token":TOKEN}; r=requests.get("https://graph.facebook.com/v21.0/"+ACCOUNT_ID+"/insights", params=params); data=r.json()["data"]
返ってきた data はレコードの配列だ。あとは pandas.DataFrame に渡せば、そのまま集計・CSV出力に進める。公式のフィールド仕様は Meta for Developers の Insights API ドキュメントで確認できる。
実装でハマった5つの罠と回避策
ここが自作の山場になる。実際に運用して踏んだ罠を、回避策とあわせて残す。第一に、コンバージョン数は actions という配列でネストして返る。単純な数値ではないため、action_type(例 lead や offsite_conversion)を指定して該当要素だけを抜き出す必要がある。第二に、spend や ctr は数値ではなく文字列で返る。集計前に float へ変換しないと、足し算が文字連結になって壊れる。第三に、date_preset はアカウントのタイムゾーン基準で切られる。管理画面の数字と合わないときは、まずタイムゾーンを疑う。第四に、1回のレスポンスは件数上限があり、paging.next の URL を辿らないとデータが欠ける。件数が多いアカウントほど気づきにくい。第五に、短時間に叩きすぎるとレート制限に当たる。レスポンスの X-Business-Use-Case-Usage ヘッダで消費率を監視し、しきい値を超えたら待つ処理を入れる。
- アクセストークンはシステムユーザーの長期トークンを使う
- アカウントIDは先頭に act_ を付ける
- spend や ctr は文字列なので float に変換する
- CV は actions 配列から action_type 指定で抽出する
- paging.next を辿って全ページ取得する
3媒体横断レポートへ拡張する設計
Meta 単体で動いたら、次は横断だ。設計の肝は、媒体ごとの取得関数を分けたうえで、出力を共通スキーマに正規化することにある。たとえば date・media・campaign・cost・imp・clicks・cv の7列にそろえる。Meta は spend、Yahoo は cost と、媒体ごとに項目名が違うため、取得直後にこのスキーマへ寄せておくと後段が楽になる。あとは pandas.concat で縦に結合し、Looker Studio か CSV に流すだけだ。Yahoo 側の実装で踏む罠は Yahoo広告APIをPythonで自動化して詰まった5つの罠 にまとめてある。取得したデータから日予算の自動調整まで踏み込むなら 広告の日予算を自動計算するPython実装 が次の一歩になる。
作った横断レポートをそのまま提案資料やスライドに落とすなら、以下のツールが手早い:
まとめ
Meta広告レポートの自動化は、トークン取得・Insights API 呼び出し・罠の回避、の3段で組める。まずは前日分1アカウントを取るところから始め、動いたら媒体を足し、最後に共通スキーマで束ねる。この順で進めれば、毎朝の手集計は着実に消えていく。今日はアクセストークンの発行と、骨格コードの疎通確認まで進めてみてほしい。
実務でそのまま使いたい人へ
本記事の手法の完全版(実際のコード・テンプレート・つまずき対処つき)は、運営者のnote(note.com/ryo_ai_hack)で公開している。実データに基づく実践ガイドをまとめて読める。

コメント
コメントを投稿