Yahoo広告APIをPythonで自動化して詰まった5つの罠
Yahoo!広告のデータをPythonで自動取得しようとして、公式リファレンスの前で手が止まった経験はないだろうか。検索で出てくるのはPHPやGoogle Apps Scriptの記事ばかりで、Pythonの実装例は驚くほど少ない。実際に動かすと、Google広告APIとは作法がまるで違う。とくにレポート取得は「すぐ取れない」独特な仕様で、初見だと必ずつまずく。ここでは、月数千万円規模の運用でレポート自動化を組んだとき実際に踏み抜いた5つの罠と、その回避策を実装目線でまとめる。読み終えれば、非同期レポートの待ち受け処理まで自力で書けるようになる。
Yahoo広告APIをPythonで叩く全体像
まず処理の流れをつかむ。Yahoo!広告APIでレポートを取るまでは、大きく3ステップだ。1つ目がOAuth 2.0でのアクセストークン取得、2つ目がレポート定義の登録、3つ目が生成完了を待ってのダウンロードである。Google広告APIのように「クエリを投げたら即データが返る」設計ではない点が最大の違いだ。
通信はすべてHTTPSのPOSTで、リクエストもレスポンスもJSONで扱える。だからPythonならrequestsライブラリ1つで完結する。公式SDKに頼る必要はない。認証まわりの仕様はLINEヤフー広告 API v19のリファレンスが一次情報になる。現行はv19で、URLのバージョン部分を間違えると404で弾かれる。
罠1・罠2:レポートは即取得できない「非同期ジョブ」
最初の関門がこれだ。Yahoo!広告は、事前にReportDefinitionServiceへレポート定義を登録しないとデータが一切出力できない。アカウントID・レポート種別・期間・欲しいフィールドを指定して登録すると、レポートIDが返る。ここでCSVが返ると思い込むのが罠1である。
返ってくるのはIDだけで、サーバー側は裏でCSVを生成し始める。生成には数十秒から、行数が多いと数分かかる。登録直後にダウンロードを叩くと「生成中」ステータスが返り、空振りする。これが罠2だ。
対策はポーリングだ。getReportJobで状態を数秒おきに確認し、COMPLETEDになってから初めてダウンロードURLへアクセスする。Pythonなら「10秒sleep→状態確認→未完なら再試行、最大12回で打ち切り」といったループを噛ませる。この待ち受け処理を書けるかどうかが、PHP/GAS記事のコピペで止まる人との分岐点になる。定義の詳細はReportDefinitionServiceの公式ページで確認できる。
罠3・罠4:トークン期限とアカウント階層
罠3はアクセストークンの寿命だ。Yahoo!広告のアクセストークンは有効期限が短く、日次バッチを回すとすぐ失効する。だからスクリプト冒頭で毎回リフレッシュトークンから取り直すのが定石だ。「昨日は動いたのに今朝401」の9割はこれが原因である。トークンはハードコードせず、環境変数か認証情報ファイルに逃がす。
罠4はアカウントIDの取り違えだ。Yahoo!広告はMCC(管理アカウント)配下に複数の広告アカウントがぶら下がる。レポート定義に渡すのは個別の広告アカウントIDで、MCC側のIDを渡すと空か権限エラーになる。複数アカウントを回すときは、IDをリスト化してループで1件ずつ登録する設計にしておくと後が楽だ。この一括処理のコードはClaude Codeに書かせると速い。手順はClaude Codeの使い方ガイドにまとめている。
罠5:検索広告とディスプレイ広告でフィールド名が違う
最後の罠が地味に効く。Yahoo!広告APIは検索広告(YSA)とディスプレイ広告(YDA)でエンドポイントもフィールド仕様も別物だ。同じ「コスト」でもフィールド名や粒度が異なり、片方で動いたコードをそのまま流用すると欠損やエラーになる。
実運用では、媒体ごとにフィールド定義を辞書で分けて持つのが安全だ。検索広告用とディスプレイ広告用の設定を別々に持ち、共通の取得関数へ渡す形にする。この設計にしてから、媒体追加のたびにコードを書き直す手間が消えた。手作業で毎朝スプレッドシートへ転記していた15分が、cron実行でゼロになったのが一番の変化だ。
自動化を運用に乗せる
スクリプトが動いたら、macOSならlaunchd、Linuxならcronで早朝に実行し、結果をSlackへ通知する形まで組むと運用が回る。取得したCSVはそのままでは読みにくいので、集計後にクライアント提出用の資料へ整える工程が残る。
この最後の資料化を効率化するツールも押さえておくと便利だ。
自動取得したデータをそのまま提案スライドへ流し込めば、レポート業務全体が短縮できる。
まとめ
Yahoo!広告APIのPython実装でつまずくのは、ほぼ「非同期レポート」「トークン失効」「アカウント階層」「媒体差」の4系統に集約される。逆に言えば、この5つの罠さえ先回りすれば、公式リファレンスとrequestsだけで日次自動化は十分に組める。まずは1アカウント・1媒体のレポート取得から動かし、ポーリングとトークン再取得を確実にすることから始めたい。
実務でそのまま使いたい人へ
本記事の手法の完全版(実際のポーリングコード・認証情報の管理方法・つまずき対処つき)は、運営者のnote(note.com/ryo_ai_hack)で公開している。実データに基づく実践ガイドをまとめて読める。

コメント
コメントを投稿