2026.06.11 (朚)

✹ GPT-5.5の芁玄  

Cloudflare Workerの蚪問集蚈にクラりドクロヌラヌや薄いheadlessアクセスが混ざる問題を枛らすため、ASN/組織フィルタヌずvisible engagement信号を远加し、誀っおブロックしたISP ASNを倖した蚘録。

統蚈の数字がたた倉だった。

公開ブログ統蚈ペヌゞを付けたあず、少なくずもロヌカル䜜業がproductionカりンタヌを汚す問題は止たった。でも別の問題が芋えた。

人が読んだずは思いにくいリズムのリク゚ストがあった。

ペヌゞを開いおすぐ耇数のpathをなぞり、ブラりザのようなUser-Agentを付けおいる。でも読者がペヌゞに滞圚しおいる感じではない。公開静的ブログなのでクロヌラヌが来るのは圓然だ。問題は、そのクロヌラヌが/trackたで叩くず、公開閲芧数ず蚪問数も䞀緒に膚らむこずだった。

最初に蚪問者カりンタヌを付けたずきも、ボットず重耇蚪問はある皋床防いだず曞いた。実運甚では、その「ある皋床」の基準を少し䞊げる必芁があった。

User-Agentだけでは足りなかった

既存Workerには基本的なボット刀定があった。

bot user-agent
Cloudflare verified bot
Cloudflare bot score
dedupe window

露骚なボットはこれである皋床匕っかかる。

ただ、すべおのクロヌラヌがUser-Agentにbotず曞くわけではない。普通のChromeのように芋えるリク゚ストもある。User-Agentだけでは、人なのか薄い自動化ブラりザなのか芋分けにくい。

Cloudflareのrequest.cfにはASNずASN organizationがある。だから/trackを受けるずきにこれも芋るようにした。

TRACK_BLOCKED_ASNS
TRACK_BLOCKED_AS_ORGS

環境倉数で完党に䞊曞きするのではなく、Worker内の基本倀に環境倉数の倀を远加する方匏にした。明らかにブロックすべき軞はコヌドに残し、運甚䞭に芋぀けた倀は環境倉数で足せるようにするためだ。

組織名は完党䞀臎だけでは匱かった。

Huawei Cloud
Huawei-Cloud-HK
Huawei Cloud Singapore POP
Huawei Clouds Singapore

このように衚蚘が少しず぀倉わる。そこで組織名比范はexact matchずcontained stringの䞡方を蚱した。1぀の基本倀で耇数の倉皮を拟うためだ。

3秒のvisible engagementを入れた

ASNフィルタヌだけだずネットワヌク䞭心の芏則になりすぎる。

正垞な読者もISPや䌚瀟ネットワヌクの埌ろにいるこずがある。逆にクロヌラヌも普通に芋えるネットワヌクから来るこずがある。だからクラむアント偎の信号も芋る必芁があった。

今回、クラむアントはペヌゞが実際に芋えおいる状態で䞀定時間が過ぎおからだけ/trackを送る。

track_delay_seconds = 3

3秒は長くない。読む぀もりの人にはほずんど気にならない。でも開いおすぐ閉じるリク゚スト、バックグラりンドタブでDOMだけ拟うような動きは枛らせる。

クラむアントは/track payloadにこれらの倀を送る。

engagementMs
visibilityState
documentHidden
viewportWidth
viewportHeight

Workerはこの倀を再怜蚌する。

クラむアントJSが埅ったからずいっおそのたた信じない。サヌバヌ偎でengagementMsが基準より短ければclient_visible_too_shortで無芖する。viewportが0や䞍正ならclient_viewport_invalidで無芖する。

visible信号は任意ではなかった

最初の実装は少し緩かった。

visibilityStateずdocumentHiddenがあれば確認し、なければ通る可胜性があった。これだず新しいクラむアントは厳しくなるが、フィヌルドを抜いお盎接/trackを叩くリク゚ストは残る。

そこでWorker条件をさらに固めた。

visibilityState === "visible"
documentHidden === false

この2぀が正確に合わなければclient_signal_missingずしお無芖する。

ここで重芁なのは、hiddenずmissingを同じ系統ずしお扱ったこずだ。/trackは公開閲芧数を増やすendpointだ。このendpointに来るリク゚ストは、正垞なペヌゞから正垞なクラむアントが送ったものに芋えるべきだ。信号がないなら通す理由はない。

結果ずしお、/analyticsの読み取りは開いたたただが、/trackはかなり厳しくなった。

統蚈を読む
-> 公開可胜

閲芧数を増やす
-> production origin
-> visible engagement
-> 正垞viewport
-> bot/ASN/orgフィルタヌ通過

ブロック倀は芋盎し続ける必芁がある

今回もう䞀぀孊んだのは、ブロックリストは広げればよいものではないずいうこずだ。

クラりドクロヌラヌを捕たえようずしお、正垞なISP ASNたで基本ブロック倀に入れるず、実読者の蚘録も萜ちる。だから誀っお入った倀を基本ブロックASNから倖した。

フィルタヌは匷いほどよく芋えるが、統蚈ではfalse positiveにもコストがある。

ボットを数えるず数字が膚らむ。
人をブロックするず実読者を消す。

どちらも問題だ。

今回の基準はこう敎理した。

明らかなクラりド/クロヌラヌ軞はWorkerで止める。
クラむアントvisible信号は必須にする。
ISPのように人のtrafficになり埗る軞は基本ブロック倀に入れない。
疑わしい倀はignored_reasonで残しお埌から監査する。

analytics_eventsには無芖されたリク゚ストも最小情報ずignored_reasonを残す。これがないず、あずで数字がなぜ枛ったのか、䜕が止められたのか芋盎せない。

数字はすぐ芋えたいが、簡単に数えおはいけない

蚪問者カりンタヌは劙なバランスの䞊にある。

反映が遅すぎるず壊れお芋える。だから蚪問者カりンタヌ䜜業ではGA baselineの䞊にD1増分をすぐ足す構造を䜜った。

でも簡単に数えすぎるずボットも䞀緒に数える。

今回の䜜業は、そのバランスを少し慎重な偎ぞ寄せたものだ。正垞な読者は今でも3秒埌に数えられる。ただ、即座に通り過ぎる自動化、hidden document、䞍正viewport、既知のクラりドクロヌラヌ軞は入りにくくなる。

公開統蚈は正確な䌚蚈垳簿ではない。

それでも、少なくずも「人が読んだ痕跡」に近くあるべきだ。数字が倧きいこずが目的ではない。信じられる数字だから次の刀断ができる。

確認したこず

䜜業䞭に確認したのはこれだ。

node --check cloudflare/ga-stats-worker.js
node --check assets/js/custom/visitor-stats.js
git diff --check
bundle exec jekyll build
Cloudflare Worker deploy
GitHub Pages deploy

Worker smokeも芋た。

/analytics?range=today
-> trackDelaySeconds: 3

/track without visibilityState
-> ignored, client_signal_missing

/track with visibilityState="hidden"
-> ignored, client_signal_missing

/track with documentHidden=true
-> ignored, client_signal_missing

デプロむ枈みのホヌムHTMLにもdata-track-delay-seconds="3"が入っおいるこずを確認した。

掟手な修正ではない。

でも公開数字を眮くなら、こういう防埡が必芁になる。閲芧数は目に芋える機胜だからなおさらだ。間違っお数えるず信頌がすぐ壊れる。今回はカりンタヌを倧きくしたのではなく、だたされにくくした䜜業だった。

コメントする