Mayoritas laporan "skor v3 saya anjlok" selesai di dua pemeriksaan pertama: nilai action yang tidak cocok dan token yang sudah lewat 2 menit saat dikirim. Keduanya gratis diperbaiki — kerjakan dulu sebelum mengganti jaringan atau menulis ulang worker.
Keduanya sering luput karena skor v3 tidak pernah muncul sebagai pesan error. Backend situs menerima token, membandingkannya dengan ambang batasnya sendiri, lalu menolak diam-diam — status HTTP tetap 200. Gejalanya terasa seperti bug aplikasi, padahal masalahnya di lapisan penilaian. Artikel ini menyusun penyebabnya menjadi tiga lapis triase — konfigurasi, sesi, lalu infrastruktur — dari yang termurah ke yang termahal.
Kasus nyata: skrip yang jalan di laptop, mati di worker
Pola ini berulang di tim data lokal. Skrip pemantauan harga jalan mulus di laptop developer, lalu tingkat keberhasilannya jatuh begitu di-deploy ke worker AWS ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta) — tanpa satu baris kode berubah. Tiga hal berubah sekaligus:
- Laptop memakai IP ISP rumahan; instance cloud memakai IP pusat data yang dibagi ribuan tenant.
- Chrome di laptop punya profil lama dengan cookie Google; container memakai profil kosong tiap run.
- Penjadwal cloud menembakkan seluruh batch sekaligus.
Perbaikan termurah bukan mengganti jaringan: beri jeda antar permintaan dan pakai token segera setelah dibuat. Catatan kepatuhan, bukan nasihat hukum: UU Pelindungan Data Pribadi (UU 27/2022) menjadikan "ambil hanya data yang boleh Anda proses" bukan sekadar etika.
Lapis 1: kesalahan konfigurasi yang bisa diperbaiki hari ini
Tiga penyebab berikut tidak menuntut perubahan arsitektur.
Nilai action tidak cocok dengan yang diverifikasi situs
Setiap panggilan grecaptcha.execute() membawa satu string action yang tertanam di dalam token. Kalau Anda mengirim login sementara halaman memakai submit_form, backend menolak token itu meski skornya wajar.
Penanganan: di source halaman atau tab Network DevTools, cari grecaptcha.execute() dan salin nilai action persis apa adanya — termasuk huruf besar-kecil dan garis bawah.
Token dipakai setelah masa berlakunya habis
Token reCAPTCHA v3 hanya berlaku 2 menit. Alur yang mengambil token saat halaman dimuat, lalu mengisi form panjang atau menunggu antrean, sering baru mengirimnya di menit ketiga.
Penanganan: pindahkan pemanggilan solver tepat sebelum submit. Kalau ada antrean, ambil token setelah worker menarik job.
sitekey yang diambil ternyata milik v2
Banyak halaman memuat dua sitekey: v3 untuk penilaian diam-diam, v2 sebagai fallback. Mengirim sitekey v2 ke method v3 menghasilkan token yang tidak pernah cocok.
Penanganan: ambil sitekey dari argumen grecaptcha.execute(), bukan dari data-sitekey pada widget g-recaptcha.
Lapis 2: pola sesi dan sinyal browser
Kalau lapis 1 bersih dan skornya masih rendah, periksa bagaimana sesi Anda terlihat dari Google.
Permintaan menumpuk dari satu sesi
Panggilan grecaptcha.execute() berulang dan berdekatan dari sesi yang sama menurunkan skor pada tiap panggilan berikutnya. Pola burst paling cepat dikenali. Beri jeda 15–30 detik antar permintaan, rotasi sesi dan profil browser, dan sebarkan beban ke beberapa thread paralel — bukan ke satu sesi.
Sinyal browser terlalu tipis
Browser headless dengan konfigurasi bawaan mengirim sinyal minim: tanpa gerakan mouse, tanpa riwayat scroll, tanpa cookie. Tidak ada sinyal yang menjatuhkan skor sendirian, tetapi kombinasinya menekan hasil secara konsisten.
- Pakai
puppeteer-extrakonfigurasi standar atau Playwright dengan konteks persisten - Simulasikan gerakan mouse dan scroll sebelum action dipicu
- Tetapkan viewport dan User-Agent realistis, konsisten antar run
Tidak ada cookie Google sama sekali
Sesi yang membawa cookie akun Google (NID, SID, HSID) cenderung mendapat skor lebih tinggi karena ada riwayat yang bisa dinilai.
Penanganan: muat profil yang sudah menyimpan cookie Google, atau kunjungi satu layanan Google sebelum masuk ke halaman target.
Lapis 3: jaringan dan reputasi IP
Ini lapis termahal dan paling lambat berubah, jadi tangani terakhir. Google menyimpan reputasi per rentang IP: IP pusat data yang dipakai ramai-ramai — termasuk IP VPN publik — konsisten mendapat skor lebih rendah dibanding IP residensial, dan rentang tercemar tidak pulih dalam sehari.
Penanganan: gunakan egress jaringan yang diotorisasi, rotasi alamat IP antar permintaan, dan pisahkan trafik pengujian dari produksi.
Menyelesaikan reCAPTCHA v3 lewat API CaptchaAI
CaptchaAI menyelesaikan reCAPTCHA v3 di lingkungan browser nyata dan mengembalikan token yang umumnya bernilai 0.3 — cukup untuk sebagian besar halaman, tetapi tidak untuk alur berambang di atas 0.3 seperti pembayaran. Alurnya empat langkah: kirim task ke in.php, simpan task ID, polling ke res.php, pakai token g-recaptcha-response sebelum kedaluwarsa. Perhatikan action sebagai parameter tersendiri — penyebab nomor satu di lapis 1.
import requests
import time
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"googlekey": "SITE_KEY",
"action": "login",
"pageurl": "https://staging.example.com/qa-login",
"json": 1
})
task_id = response.json()["request"]
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
print(f"Token received: {token[:50]}...")
break
const axios = require('axios');
async function solveV3(sitekey, pageurl, action) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: 'YOUR_API_KEY', method: 'userrecaptcha', version: 'v3',
googlekey: sitekey, action, pageurl, json: 1
}
});
const taskId = data.request;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const res = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (res.data.status === 1) return res.data.request;
}
throw new Error('Timeout');
}
Model tagihannya berbasis thread, bukan per solve: BASIC ($15/bulan, 5 thread) sampai VIP-3 ($7,500/bulan, 5000 thread) — biaya tetap yang lebih mudah dianggarkan untuk volume naik-turun. Kalau situs menampilkan fallback v2 saat skor v3 di bawah ambang, menyelesaikan v2 sering lebih stabil karena hasilnya biner.
Daftar periksa cepat
| Yang diperiksa | Tindakan | Lapis |
|---|---|---|
| Nilai action cocok? | Bandingkan dengan grecaptcha.execute() di source halaman |
1 |
| Token masih segar? | Pakai dalam 2 menit sejak dibuat | 1 |
| sitekey benar? | Pastikan v3, bukan kunci v2 dari widget fallback | 1 |
| Laju permintaan? | Beri jeda 15–30 detik antar penyelesaian | 2 |
| Profil browser? | Konteks persisten dengan cookie Google | 2 |
| Jenis IP? | Egress yang diotorisasi, rotasi antar permintaan | 3 |
Kerjakan dari atas ke bawah dan ukur ulang setelah tiap perubahan — mengubah lima hal sekaligus membuat Anda tidak tahu mana yang berhasil.
Pertanyaan Umum
Bagaimana cara tahu skor yang sebenarnya saya dapat?
Tidak dari sisi klien. Skor hanya terlihat di respons siteverify milik backend situs. Kalau situsnya milik Anda, aktifkan logging di endpoint verifikasi; kalau bukan, Anda hanya bisa menyimpulkan dari pola diterima atau ditolak.
Apakah CaptchaAI mendukung reCAPTCHA v3 Enterprise?
Ya, dan memakai method userrecaptcha yang sama. Untuk hCaptcha dan FunCaptcha (Arkose Labs) jawabannya belum — keduanya tidak didukung saat ini.
Kenapa skor turun bertahap padahal tidak ada yang saya ubah?
Justru karena tidak ada yang diubah. Google belajar dari pola berulang: IP, sinyal browser, dan ritme permintaan yang identik setiap hari lama-lama terbaca sebagai otomatisasi.