個人ブログのGA4とSearch Console分析用にユーザーOAuthをセットアップする手順

公開日:
更新日:
目次

GA4 と Search Console のデータをスクリプトから取得したい場合、サービスアカウント認証が定番として紹介されます。ただ、サービスアカウントを GA4 や Search Console に「ユーザー」として追加する UI が *.iam.gserviceaccount.com 形式を弾くケースがあり、そこで詰まると先に進めません[1]。個人ブログのように 自分自身が GA4 と Search Console のオーナー であるなら、サービスアカウントを使わず 自分の Gmail のOAuth認証 に切り替えるほうが楽です。この記事では Google Cloud で OAuth クライアントIDを発行し、Python でリフレッシュトークンを取得して、GA4 と Search Console を叩くまでの手順を、新UIに合わせてまとめます。

ユーザーOAuthとサービスアカウントの違い

両者の使い分けを最初に整理しておきます。

サービスアカウント ユーザーOAuth
認証主体 プログラム専用アカウント 自分のGmail
GA4/SCの「ユーザー追加」UI 必要(弾かれることがある) 不要(自分はオーナーなので)
認証情報 JSONキー OAuthクライアント + リフレッシュトークン
期限 無期限 6ヶ月使わないと失効、1ユーザー100トークンまで[2]
想定用途 サーバー間連携、CI/CD 個人スクリプト、ローカル分析

個人ブログの定期分析であれば、ユーザーOAuthのほうが詰まりにくく、しかも「自分のGmailは既にオーナーとして認識されている」ので追加作業が要りません。

Google Auth Platform を開く

設定の入り口は Google Auth Platform という新しいメニューです[3]。以前は「APIとサービス」配下に「OAuth同意画面」があったのですが、2025年あたりから専用のメニューに切り出されました。記事や入門書では旧UIで解説されているケースも多いので、混乱しないよう注意してください。

Google Cloud Console で対象プロジェクトを開き、左メニューから「Google Auth Platform」を探します。中身は以下の4タブで構成されています。

  • Branding(ブランディング)— アプリ名やサポートメールなどの基本情報
  • Audience(対象)— 公開状態、テストユーザー、ユーザータイプ
  • Data Access(データアクセス)— スコープ
  • Clients(クライアント)— OAuthクライアントIDの発行

順に設定していきます。

Branding タブで基本情報を入れる

まず「Branding」タブを開いて、アプリの「名前」と「メール連絡先」を登録します。これが OAuth 認証時にユーザーに表示される情報になります。

最低限の入力項目はこの3つです。

  • アプリ名: 任意(例: blog-analytics
  • ユーザーサポートメール: 自分のGmail
  • デベロッパー連絡先: 自分のGmail

それ以外(アプリのロゴ、ホームページのリンク、プライバシーポリシー、利用規約)は 空欄でOK です。Google による検証申請に出さない個人用途なら、これらは要りません。

入力後「保存」を押すと、概要画面に戻されます。次のタブに進みます。

Audience タブでテストユーザー追加と公開ステータスの本番化

「Audience」タブを開いて、ユーザータイプ・テストユーザー・公開ステータスの3点を設定します。

ユーザータイプ

外部」を選びます。「内部」は Google Workspace 組織が必要なので、個人 Gmail では使えません。

テストユーザー

「テストユーザー」セクションで「+ ユーザーを追加」を押し、自分の Gmail アドレスを必ず追加 します。これをしないと、自分自身でログインしようとしても拒否されます。

公開ステータスを本番環境に切り替える

ここが一番つまずきやすい部分です。Audience タブの最上部に「公開ステータス: テスト中」と表示されており、そのすぐ下に「アプリを公開」ボタン があります。

このボタンを押すと、次のような確認ダイアログが出ます。

Google アカウントを持つすべてのユーザーがアプリを使用できるようにします。
アプリの構成で 10 を超えるドメインやロゴが使用されている場合、または機密性の高いスコープや制限付きスコープが必要な場合は、検証のための送信が必要になります。

確認」を押せば本番環境に切り替わります。「検証のための送信が必要」と表示されますが、これは「Googleストアに公開して全世界の人に使ってもらう場合」の話で、自分しか使わないなら 検証申請しなくても動き続けます

なぜ本番化が必要かというと、テストモードのままだと リフレッシュトークンが7日で失効 するという制約があるためです[4]。月1の自動分析をする想定なら、本番化しておかないと毎週ブラウザ認証を取り直す羽目になります。

切り替え後、初回ログイン時には「Googleはこのアプリを確認していません」という警告画面が出ます。「詳細」→「(アプリ名)に移動(安全ではないページ)」と進めば認証できます。

Data Access タブはスキップしてよい

「Data Access」タブはスコープを事前登録するための画面ですが、何も追加せず通過して構いません。スコープはコード側で実行時に明示するため、ここでの事前登録は不要です。

気になるなら、後述するスクリプトで指定する2つだけ追加してもよいです。

  • https://www.googleapis.com/auth/analytics.readonly
  • https://www.googleapis.com/auth/webmasters.readonly

Clients タブで OAuth クライアントID を発行する

最後に「Clients」タブで、認証に使う鍵となるクライアントIDを作ります。

+ クライアントを作成」を押し、以下を入力します。

  • アプリケーションの種類: デスクトップアプリ
  • 名前: blog-analytics-cli(任意)

「作成」を押すとダイアログが出るので、「JSONをダウンロード」をクリックします。ダウンロードされた client_secret_xxx.json を、Gitリポジトリに含めない場所に置きます。

mkdir -p ~/.config/gcp
mv ~/Downloads/client_secret_*.json ~/.config/gcp/oauth-client.json
chmod 600 ~/.config/gcp/oauth-client.json

Pythonで初回認証してリフレッシュトークンを取得する

ダウンロードした oauth-client.json はあくまで「アプリの身分証」のようなもので、これだけでは API を叩けません。初回だけブラウザでログインして「ユーザーが許可した証拠」のリフレッシュトークンを取得 し、それをファイルに保存しておく必要があります。

仮想環境を作って必要なライブラリを入れます。

python3 -m venv ~/.venvs/blog-analytics
source ~/.venvs/blog-analytics/bin/activate
pip install google-auth-oauthlib google-analytics-data google-api-python-client

初回認証用のスクリプトを auth_setup.py として保存します。

# auth_setup.py
from google_auth_oauthlib.flow import InstalledAppFlow
from pathlib import Path

CLIENT = Path("~/.config/gcp/oauth-client.json").expanduser()
TOKEN  = Path("~/.config/gcp/oauth-token.json").expanduser()

SCOPES = [
    "https://www.googleapis.com/auth/analytics.readonly",
    "https://www.googleapis.com/auth/webmasters.readonly",
]

flow = InstalledAppFlow.from_client_secrets_file(str(CLIENT), SCOPES)
creds = flow.run_local_server(port=0)

TOKEN.write_text(creds.to_json())
TOKEN.chmod(0o600)
print("token saved:", TOKEN)

実行すると、ブラウザが自動で開いて Google ログイン画面が表示されます。テストユーザーとして登録した自分のGmailでログインし、許可します。

python auth_setup.py

成功すると ~/.config/gcp/oauth-token.json にリフレッシュトークン入りの認証情報が保存されます。このファイルは絶対に Git に入れない よう注意してください。

取得したトークンで GA4 と Search Console を叩く

リフレッシュトークンが手元にあれば、以降はブラウザを開かずに自動で認証できます[5]。GA4 と Search Console を1つのスクリプトで叩く例です。

# check.py
from google.oauth2.credentials import Credentials
from pathlib import Path

TOKEN = Path("~/.config/gcp/oauth-token.json").expanduser()

SCOPES = [
    "https://www.googleapis.com/auth/analytics.readonly",
    "https://www.googleapis.com/auth/webmasters.readonly",
]

creds = Credentials.from_authorized_user_file(str(TOKEN), SCOPES)

# --- GA4 ---
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import RunReportRequest, DateRange, Dimension, Metric

PROPERTY_ID = "413714906"  # 自分のGA4プロパティID

ga = BetaAnalyticsDataClient(credentials=creds)
res = ga.run_report(RunReportRequest(
    property=f"properties/{PROPERTY_ID}",
    dimensions=[Dimension(name="pagePath")],
    metrics=[Metric(name="screenPageViews")],
    date_ranges=[DateRange(start_date="30daysAgo", end_date="today")],
    limit=5,
))
print("== GA4 ==")
for row in res.rows:
    print(row.metric_values[0].value, row.dimension_values[0].value)

# --- Search Console ---
from googleapiclient.discovery import build

SITE_URL = "sc-domain:example.com"  # 自分のSearch Console プロパティ

sc = build("searchconsole", "v1", credentials=creds)
res = sc.searchanalytics().query(
    siteUrl=SITE_URL,
    body={
        "startDate": "2026-04-10",
        "endDate":   "2026-05-10",
        "dimensions": ["page"],
        "rowLimit": 5,
    },
).execute()
print("== Search Console ==")
for row in res.get("rows", []):
    print(f"{row['clicks']:>4} clicks pos={row['position']:.1f} {row['keys'][0]}")

実行して GA4 と Search Console 両方のデータが返ってくれば、認証は完成です。

よくあるエラー

セットアップでつまずきやすい代表的なエラーへの対処です。

Token has been expired or revoked.

公開ステータスが「テスト中」のままだとリフレッシュトークンが7日で失効します[4:1]。Google Auth Platform の Audience タブで「アプリを公開」を押して本番環境に切り替えてから、auth_setup.py を再実行してトークンを取り直します。

Error 403: access_denied

テストユーザーに自分のGmailが追加されていないケース。Audience タブのテストユーザー欄に追加してから再試行します。「アプリを公開」済みであればこの設定は不要です。

Scope has changed の警告

スクリプトで指定するスコープと、oauth-token.json が持っているスコープが食い違うと出ます。スコープを変更したら、oauth-token.json を削除して auth_setup.py を再実行します。

Audience タブで「アプリを公開」ボタンが見当たらない

UI が狭いと「公開ステータス」セクション内のボタンが切れていることがあります。ブラウザのウィンドウを最大化してページを再読み込みすると、「公開ステータス: テスト中」のすぐ下にボタンが現れます。

まとめ

ユーザーOAuthへの切り替えは「Google Auth Platform で Branding → Audience(公開ステータスを本番化)→ Clients で OAuth クライアント発行 → Python で初回認証」の流れです。一度通せば、以降はブラウザを開かずに oauth-token.json だけで自動認証できます。サービスアカウントを GA4 や Search Console に追加する UI で詰まる問題からは完全に解放されるので、自分自身がオーナーである個人ブログの分析用途には特に向いています。

参考文献

脚注
  1. GA4『このメールアドレスはGoogleアカウントと一致しません』でサービスアカウントが追加できない時の対処 ↩︎

  2. Using OAuth 2.0 to Access Google APIs - Google for Developers (2026-05-10 アクセス) ↩︎

  3. Get started with the Google Auth Platform - Google Cloud Console Help (2026-05-10 アクセス) ↩︎

  4. Manage App Audience - Google Cloud Console Help (2026-05-10 アクセス) ↩︎ ↩︎

  5. google_auth_oauthlib.flow module documentation (2026-05-10 アクセス) ↩︎