WordPressサイトを複数運営していると、Search Consoleを毎回ひとつずつ開いて確認するのが地味に面倒です。「全サイトのクリック数を1画面で見たい」という動機だけでPythonツールを作ったら、思いのほかちゃんと動いたので実装内容を公開します。Google Search Console APIの認証まわりでつまずいた箇所も含めて全部書きます。
作った動機:毎朝の確認作業が地味につらい
サイトが増えるにつれて、毎朝のルーティンがこうなっていました。
1サイトあたり2〜3分かかるので、サイトが増えるほど確認作業だけで時間が溶けていきます。しかもGoogleのUIは毎回ログイン確認が入ったりして、地味にストレスです。
「APIで取ってきてまとめて表示すればいいだけでは」と思い立って作り始めました。
完成したもの
起動して「データを更新」を押すだけで、登録した全サイトのデータが一覧表示されます。
※ 上記はデモデータです
技術構成
つまずいたところ
Google Cloud ConsoleでAPIを有効化するだけでなく、OAuth同意画面の設定も必要です。「外部」を選択して、アプリ名とメールアドレスを入れるだけで先に進めます。スコープ・テストユーザーの画面は何も触らずスルーでOKでした。
初回認証時に警告が出ます。「詳細」→「安全でないページに移動」をクリックすれば通過できます。自分用ツールなので問題なし。
Search ConsoleにはURLを https://example.com/ のように末尾スラッシュ付きで登録していることが多いです。APIに渡すURLもSearch Consoleの登録URLと完全一致させないとデータが返ってきません。
コードの要点
データ取得部分のコアはこれだけです。
def fetch_site_data(service, site_url, days=28): end_date = datetime.today().strftime("%Y-%m-%d") start_date = (datetime.today() - timedelta(days=days)).strftime("%Y-%m-%d") response = service.searchanalytics().query( siteUrl=site_url, body={ "startDate": start_date, "endDate": end_date, "dimensions": ["date"], "rowLimit": 500, } ).execute() rows = response.get("rows", []) total_clicks = sum(r["clicks"] for r in rows) total_impressions = sum(r["impressions"] for r in rows) avg_position = sum(r["position"] for r in rows) / len(rows) return { "clicks": int(total_clicks), "impressions": int(total_impressions), "ctr": round(total_clicks / total_impressions * 100, 2), "position": round(avg_position, 1), }
dimensions: ["date"] で日別データを取得して合計・平均を計算しています。rowLimit: 500 にしておけば90日分でも十分カバーできます。
まとめ
Search Console APIは最初の認証設定だけ少し手間ですが、一度通してしまえば以降は完全自動です。サイトが増えるほど時短効果が大きくなります。
同じ仕組みを使えば「特定キーワードの順位だけ抽出する」「順位が落ちたら通知する」といった応用もできます。Search Console APIは思ったより使いやすかったので、今後も活用していく予定です。
