サイトのアクセス解析を確認するたびに GA4 や Search Console の管理画面にログインするのが面倒で、データをローカルに蓄積してサイト改善に活用したくなりました。そこで Google Analytics Data API と Search Console API でデータを取得する Python スクリプトを作り、launchd で日次自動実行する形にしました。手動で実行しなくても日次でデータが溜まるので、必要なときに参照するだけで済みます。
全体の流れ
取得から保存までの流れは次のとおりです。
[launchd 日次実行]
↓
[uv run python -m src.main --days 5]
↓
[GA4 API] → data/ga4/YYYY-MM-DD.md
[Search Console API] → data/search-console/YYYY-MM-DD.md
当初は GitHub Actions の cron で定期実行する案も検討しました。ただ、credentials などの秘密情報を Actions の Secrets に置く必要があり、データの永続化にも Artifact や別リポジトリへの push が必要になります。ローカルで launchd を使えば、秘密情報はマシン内に留められ、data/ にそのまま蓄積できます。また、Markdown 形式にしたのは、Cursor などの AI が @data/ga4/xxx.md で参照してサイト改善の判断材料にしやすいためです。
取得スクリプト
GA4 は BetaAnalyticsDataClient.from_service_account_file、Search Console は googleapiclient.discovery.build でサービスアカウント認証。日別サマリー、ページ別 PV、参照元、デバイス(GA4)、クエリ別・ページ別の検索パフォーマンス(Search Console)を取得して Markdown を生成しています。
def fetch_one_day(target_date: date) -> None:
date_str = target_date.strftime("%Y-%m-%d")
ga4_md = fetch_ga4(date_str)
save_ga4(date_str, ga4_md)
sc_md = fetch_search_console(date_str)
save_search_console(date_str, sc_md)
# --days N で前日から N 日分を遡って取得
parser.add_argument("--days", type=int, default=1, help="取得する日数")
Search Console は GA4 と異なり 2〜3 日遅れでデータが反映されるため、日次実行では --days 5 で毎日 5 日分を再取得する運用にしました。同じ日付は上書きされるので、遅れて反映された分も取り込めます。
定期実行(launchd)
plist の StartCalendarInterval で実行時刻(Hour, Minute)を指定。launchd では .env が読まれないため、plist の EnvironmentVariables で必要な環境変数を渡しています。
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
登録用の install-launchd.sh で plist を生成し、~/Library/LaunchAgents/ に配置。対話で有効化を確認して launchctl load します。
# plist を生成して LaunchAgents に配置
sed -e "s|PROJECT_DIR|$PROJECT_DIR|g" plist.example > "$DEST"
mkdir -p "$PROJECT_DIR/logs"
read -p "今すぐ有効化しますか? [y/N] " -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]; then
launchctl load "$DEST"
echo "有効化しました。指定した時刻に日次実行されます。"
fi
出力先は data/ga4/YYYY-MM-DD.md と data/search-console/YYYY-MM-DD.md。取得したデータを AI に参照させて、メタ情報の最適化や人気記事の把握に活用しています。