[๐ ] Mengurangi hitungan bot di statistik blog
โจ Ringkasan GPT-5.5 ใ
Catatan tentang mengurangi crawler cloud dan akses headless ringan dalam hitungan kunjungan Cloudflare Worker, dengan filter ASN/organisasi, sinyal visible engagement, dan membuka kembali ASN ISP yang sempat salah diblokir.
Angka analytics kembali terasa aneh.
Setelah menambahkan halaman statistik publik blog, pekerjaan lokal tidak lagi mengotori counter production. Tetapi masalah lain muncul.
Sebagian request tidak terasa seperti pembacaan manusia.
Mereka membuka banyak path dengan cepat, memakai User-Agent yang terlihat seperti browser, tetapi tidak berperilaku seperti pembaca yang tinggal di halaman. Crawler memang wajar di blog statis publik. Masalahnya, jika crawler juga memukul /track, tayangan dan kunjungan publik ikut membengkak.
Saat pertama menambahkan counter, saya menulis bahwa bot dan kunjungan duplikat sudah cukup diblokir. Dalam operasi nyata, standar โcukupโ itu perlu dinaikkan sedikit.
User-Agent saja tidak cukup
Worker sudah punya pemeriksaan dasar.
bot user-agent
Cloudflare verified bot
Cloudflare bot score
dedupe window
Ini menangkap bot yang jelas.
Tetapi tidak semua crawler menulis bot di User-Agent. Beberapa request terlihat seperti Chrome biasa. User-Agent saja sulit membedakan orang dari browser otomatis yang tipis.
Data request.cf dari Cloudflare berisi ASN dan ASN organization. Jadi /track saya buat memeriksa itu juga.
TRACK_BLOCKED_ASNS
TRACK_BLOCKED_AS_ORGS
Variabel environment tidak sepenuhnya mengganti default. Nilainya ditambahkan ke default Worker. Dengan begitu, sumbu yang jelas perlu diblokir tetap ada di kode, dan temuan operasional bisa ditambahkan lewat environment.
Pencocokan nama organisasi secara exact saja terlalu lemah.
Huawei Cloud
Huawei-Cloud-HK
Huawei Cloud Singapore POP
Huawei Clouds Singapore
Nama bisa berubah seperti ini. Jadi pemeriksaan organisasi menerima exact match dan contained string. Satu default bisa menangkap beberapa variasi.
Menambahkan 3 detik visible engagement
Filter ASN saja terlalu berpusat pada jaringan.
Pembaca normal bisa berada di balik ISP atau jaringan kantor. Crawler juga bisa datang dari jaringan yang terlihat biasa. Jadi sinyal client perlu ikut diperiksa.
Sekarang client hanya mengirim /track setelah halaman terlihat selama waktu singkat.
track_delay_seconds = 3
Tiga detik tidak lama. Pembaca sungguhan hampir tidak merasakannya. Tetapi ini membantu menyaring preview instan, scraping di tab tersembunyi, dan load yang hilang segera.
Client mengirim nilai ini dalam payload.
engagementMs
visibilityState
documentHidden
viewportWidth
viewportHeight
Worker memvalidasinya lagi.
Tidak cukup percaya bahwa JS sudah menunggu. Jika engagementMs lebih pendek dari batas, request diabaikan sebagai client_visible_too_short. Jika viewport nol atau tidak valid, diabaikan sebagai client_viewport_invalid.
Sinyal visible bukan opsional
Implementasi pertama masih longgar.
Ia memeriksa visibilityState dan documentHidden jika ada, tetapi request tanpa field itu masih bisa lewat. Ini membuat client baru lebih ketat, tetapi request manual ke /track tanpa field masih bisa tersisa.
Jadi kondisi Worker dibuat ketat.
visibilityState === "visible"
documentHidden === false
Jika keduanya tidak tepat, request diabaikan sebagai client_signal_missing.
Intinya, hidden dan missing diperlakukan sebagai keluarga masalah yang sama. /track adalah endpoint yang menaikkan counter publik. Request ke endpoint ini harus terlihat seperti dikirim oleh halaman normal dan client normal. Jika sinyalnya tidak ada, ia tidak layak lewat.
/analytics tetap bisa dibaca publik, tetapi /track menjadi lebih menuntut.
Membaca statistik
-> publik
Menaikkan tayangan
-> production origin
-> visible engagement
-> viewport valid
-> lolos filter bot/ASN/org
Nilai blokir harus terus ditinjau
Pekerjaan ini juga menunjukkan bahwa blocklist tidak otomatis membaik hanya karena makin lebar.
Saat mencoba menangkap crawler cloud, bisa saja ASN ISP nyata ikut terblokir. Itu akan menghapus catatan pembaca sungguhan. Jadi saya menghapus ASN yang salah ditambahkan dari blokir bawaan.
Filter yang kuat terlihat bagus, tetapi false positive juga punya biaya.
Menghitung bot membuat angka membengkak.
Memblokir orang menghapus pembaca nyata.
Keduanya buruk.
Maka kriterianya menjadi seperti ini.
Blokir sumbu yang jelas cloud/crawler di Worker.
Wajibkan sinyal visible dari client.
Jangan masukkan traffic seperti ISP manusia ke blokir bawaan.
Simpan nilai mencurigakan dengan ignored_reason untuk audit.
analytics_events menyimpan baris minimal dengan ignored_reason bahkan untuk request yang diabaikan. Tanpa itu, sulit menjelaskan nanti kenapa angka turun atau apa yang diblokir.
Angka harus cepat muncul, tetapi tidak terlalu mudah dihitung
Counter kunjungan berada di keseimbangan yang tidak nyaman.
Jika terlalu lambat, terlihat rusak. Karena itu pekerjaan counter memakai baseline GA plus increment D1 yang langsung terasa.
Tetapi jika terlalu mudah dihitung, bot juga ikut dihitung.
Perubahan ini menggeser keseimbangan sedikit ke arah hati-hati. Pembaca normal tetap dihitung setelah 3 detik. Tetapi otomatisasi instan, dokumen tersembunyi, viewport invalid, dan sumbu cloud yang dikenal menjadi lebih sulit masuk counter.
Statistik publik bukan buku akuntansi.
Tetapi setidaknya harus mendekati tanda bahwa seseorang membaca. Angka besar bukan tujuannya. Angka yang bisa dipercaya membuat keputusan berikutnya mungkin.
Yang saya cek
Saya mengecek ini selama pekerjaan.
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
Saya juga melakukan smoke test Worker.
/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
Saya juga memastikan HTML home yang sudah deploy berisi data-track-delay-seconds="3".
Ini bukan perubahan yang mencolok.
Tetapi angka publik membutuhkan pertahanan seperti ini. Tayangan terlihat oleh pembaca, jadi hitungan yang salah cepat merusak kepercayaan. Pekerjaan ini bukan membuat counter lebih besar. Ini membuat counter lebih sulit ditipu.
Tinggalkan komentar