0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GA4に頼らない、Cookieなし解析ツールを自作した話

0
Posted at

※ この記事はZennに投稿したものの転載です。
https://zenn.dev/daichi1208/articles/d107b77a758757

なぜ作ったか

個人サイトにGA4を入れていたんですが、ずっとモヤモヤしていました。

  • Cookieの同意バナーを出さないといけない
  • IPアドレスや行動履歴がGoogleに送られる
  • 日本の個人情報保護法的にグレーな運用になりがち
  • ダッシュボードが複雑すぎて見たい数字がすぐ出てこない

海外には PlausibleFathom という
Cookieなしのプライバシーファースト解析ツールがあります。
でも日本語UIがなく、月額$9〜と個人には少し高い。

「日本語で、無料で、Cookieなしで使えるやつを自作すればいいのでは」

そう思って作ったのが Keiro Analytics です。


技術スタック

レイヤー 技術
バックエンド FastAPI (Python)
データベース PostgreSQL (Railway)
フロントエンド Next.js 14 + Tailwind CSS
認証 Clerk
ホスティング Railway(API) + Vercel(フロント)

シンプルに動くものを最速で出すことを優先しました。


Cookieなしでどうやってユニーク訪問者を識別するか

ここが一番の肝です。

GA4はCookieにユーザーIDを保存して追跡します。
Keiro AnalyticsはCookieを一切使いません。
代わりに以下の情報を組み合わせてSHA256ハッシュを生成します。

def hash_visitor(ip: str, site_id: str, user_agent: str) -> str:
    today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
    return hashlib.sha256(
        f"{ip}{user_agent}{site_id}{today}".encode()
    ).hexdigest()[:16]

ポイントは 日付を含める こと。
同じ人が翌日アクセスしても別のハッシュになるので、
日をまたいだ追跡が設計上できません。
IPアドレス自体はDBに保存しません。

これはPlausibleやFathomと同じアプローチです。


計測タグの仕組み

たった1行貼るだけで計測が始まります。

<script defer src="https://keiro-analytics.vercel.app/k.js"
  data-token="YOUR_TOKEN"
  data-api="https://your-api.railway.app">
</script>

k.jsの中身はシンプルで、1×1の透明GIF画像リクエストでデータを送っています。

new Image().src = api + '/api/collect?t=' + token
  + '&u=' + encodeURIComponent(location.href)
  + '&r=' + encodeURIComponent(document.referrer)
  + '&s=' + screen.width + 'x' + screen.height;

XHRやfetchではなくimgタグを使う理由はCORS制約を回避するためです。
どのドメインからでも追加設定なしで計測できます。

SPAにも対応していて、history.pushState をフックしてページ遷移も拾います。


デプロイ構成

ユーザーのサイト
    ↓ k.js(Vercelから配信)
    ↓ 計測データ送信
Railway(FastAPI + PostgreSQL)
    ↑ ダッシュボードAPIリクエスト
Vercel(Next.js)
    ↑ ブラウザ

RailwayはPythonアプリのデプロイが簡単で、PostgreSQLも同じプロジェクト内で立てられます。
フロントはVercelに任せてNext.jsをそのままデプロイ。


実装してよかったこと・ハマったこと

よかった点

  • FastAPI + SQLAlchemyの組み合わせはシンプルで速い
  • VercelとRailwayの組み合わせは無料枠でそこそこ動く
  • Cookieなし設計はむしろ実装がシンプルになる

ハマった点

  • RailwayのリバースプロキシでIPが X-Forwarded-For に入っていてハマった
  • Clerk v7とNext.js 14のpeer dependency競合(.npmrclegacy-peer-deps=true
  • Railway無料プランのプロジェクト数制限(1つしか作れない)

今後やること

  • Stripe決済でProプランを作る
  • カスタムドメイン対応でClerk本番モードへ
  • CSVエクスポート機能

使ってみたい方へ

現在無料で使えます。
自分のブログや個人サイトに入れてみたい方はぜひ。

フィードバックは X(@daichi_1208)まで。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?