Kalau script Selenium atau Puppeteer Anda selalu mentok di reCAPTCHA, penyebabnya jarang soal checkbox. reCAPTCHA menilai sesi Anda jauh sebelum itu: sejak halaman dimuat, ia menjalankan puluhan pemeriksaan diam-diam atas browser, perilaku, dan jaringan Anda, lalu memberi skor risiko.
Deteksi itu bekerja dalam lima lapisan. Berikut ringkasannya, lalu kenapa API solver seperti CaptchaAI bisa menanganinya.
| Lapisan | Yang diperiksa | Contoh sinyal bot |
|---|---|---|
| 1. JavaScript | API browser, sinyal browser otomatis |
Mode headless, API Chrome hilang |
| 2. Canvas & WebGL | Render grafis perangkat | SwiftShader, canvas seragam |
| 3. Perilaku | Mouse, keyboard, tempo | Gerak lurus, input instan |
| 4. Jaringan & IP | Reputasi IP, TLS, header | IP pusat data, JA3 tak cocok |
| 5. Lintas sesi | Pola antar sesi/situs | Solve konsisten, tanpa cookie |
Lapisan 1: pemeriksaan lingkungan JavaScript
reCAPTCHA menjalankan probe JavaScript untuk membongkar headless browser dan automation framework sejak awal.
Sinyal browser otomatis langsung ketahuan
Indikator otomasi paling gampang dibaca:
// Selenium/Puppeteer set this automatically
sinyal browser otomatis === true // → Automation detected
// Real browser
sinyal browser otomatis === undefined // or false → Normal browser
Begitu sinyal browser otomatis bernilai true, reCAPTCHA langsung menandai sesi sebagai otomasi; skor biasanya jatuh ke 0,1.
API browser yang hilang di mode headless
reCAPTCHA memeriksa API yang absen atau beda di headless browser:
// Probes reCAPTCHA performs (simplified)
const checks = {
// Chrome-specific object
hasChrome: !!window.chrome,
hasChromeRuntime: !!(window.chrome && window.chrome.runtime),
// Plugin and MIME type arrays
pluginCount: navigator.plugins.length,
mimeTypeCount: navigator.mimeTypes.length,
// Notification permission
notificationPermission: Notification.permission,
// Speech synthesis voices
speechVoices: window.speechSynthesis.getVoices().length,
// Performance observer
hasPerformanceObserver: typeof PerformanceObserver !== "undefined",
};
| Probe | Diharapkan (Chrome asli) | Chrome headless | Deteksi |
|---|---|---|---|
window.chrome |
Object | undefined atau minimal | Otomasi |
navigator.plugins |
2-5 plugin | Array kosong | Otomasi |
navigator.permissions |
Object dengan query() | Mungkin throw atau hilang | Otomasi |
Notification.permission |
"default" | Mungkin throw | Otomasi |
window.speechSynthesis |
Object dengan voices | Kosong atau hilang | Otomasi |
Manipulasi prototype chain
Alat otomasi canggih menimpa API browser untuk menyembunyikan jejak. reCAPTCHA justru menguji apakah fungsi bawaan sudah diutak-atik:
// reCAPTCHA may check if native functions were modified
const nativeToString = Function.prototype.toString;
const pluginsToString = navigator.plugins.toString();
// Overridden functions have different toString output:
// Native: "function get plugins() { [native code] }"
// Overridden: "function () { return [...fakePlugins] }"
Lapisan 2: sinyal browser canvas dan WebGL
Lapisan kedua membaca cara perangkat menggambar grafis — jauh lebih sulit dipalsukan daripada User-Agent.
Sinyal browser canvas
reCAPTCHA merender elemen tersembunyi ke canvas dan membaca data pikselnya. Hasilnya berbeda tergantung OS, GPU, perender font, dan anti-aliasing:
// Simplified canvas sinyal browser
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
ctx.textBaseline = "alphabetic";
ctx.font = "14px Arial";
ctx.fillStyle = "#f60";
ctx.fillRect(125, 1, 62, 20);
ctx.fillStyle = "#069";
ctx.fillText("CaptchaTest,!", 2, 15);
const sinyal browser = canvas.toDataURL();
// Unique per browser/OS/GPU combination
Hasilnya dibaca sebagai anomali: sinyal identik di banyak OS/browser berarti spoofing, canvas seragam atau blank berarti headless, dan sinyal yang cocok pola Chrome headless langsung ditandai otomasi.
Sinyal browser WebGL
const gl = document.createElement("canvas").getContext("webgl");
const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
// Real browser: "ANGLE (NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0)"
// Headless Chrome: "Google Inc. (Google SwiftShader)" ← Strong bot signal
SwiftShader adalah software GPU renderer Google saat GPU hardware tak tersedia — penanda terang lingkungan headless.
Lapisan 3: analisis perilaku
Inilah lapisan terkuat reCAPTCHA — memantau perilaku pengguna sejak page load sampai form submission.
Pola pergerakan mouse
reCAPTCHA merekam koordinat mouse ~60fps, lalu membandingkan pola manusia dan bot:
reCAPTCHA records:
├─ Mouse coordinates at ~60fps intervals
├─ Velocity and acceleration at each point
├─ Trajectories between clickable elements
├─ Hover patterns over links and buttons
├─ Micro-movements while "stationary"
└─ Natural overshoot when targeting elements
Human pattern:
- Curved paths with variable speed
- Natural acceleration/deceleration (Fitts's Law)
- Random micro-jitter during hovering
- Occasional overshoot and correction
Bot pattern:
- Zero mouse events (no mouse simulation)
- Straight lines at constant speed
- Perfect targeting (no overshoot)
- Identical patterns across sessions
Pola pengetikan keyboard
Ritme mengetik juga dicatat detail:
reCAPTCHA records:
├─ Inter-key interval for each key pair
├─ Key hold duration (keydown to keyup)
├─ Error rate (backspace frequency)
├─ Typing rhythm consistency
└─ Input method (keyboard vs paste vs JavaScript)
Human pattern:
- Variable intervals (80-300ms typical)
- Faster for common character pairs
- Occasional errors and corrections
- keydown → keypress → keyup sequence
Bot pattern:
- Constant intervals or instant input
- No keypress events (value set via JS)
- Zero errors
- All characters appear simultaneously
Urutan waktu dan interaksi
Urutan dan tempo interaksi juga memberi banyak petunjuk:
reCAPTCHA records:
├─ Time from page load to first interaction
├─ Time from CAPTCHA rendering to click
├─ Scroll events and depths
├─ Focus/blur events on form fields
└─ Tab between fields vs click between fields
Suspicious patterns:
- First interaction < 1 second after page load
- CAPTCHA clicked immediately after rendering
- No scroll events before interacting with below-fold content
- All form fields filled in <500ms
Lapisan 4: analisis jaringan dan reputasi IP
Browser boleh mulus, tapi asal koneksi Anda tetap bercerita banyak.
Database reputasi IP
Google memelihara intelijen IP yang luas:
| Sinyal IP | Contoh |
|---|---|
| Rentang datacenter | AWS (52.x/54.x), GCP, Azure, DigitalOcean |
| Proxy/VPN dikenal | NordVPN, ExpressVPN, proxy komersial |
| Tor exit node | Daftar publik, diperbarui berkala |
| Riwayat penyalahgunaan | IP bekas spam, scraping, CAPTCHA farming |
| Pola geografis | Perpindahan lokasi cepat (VPN hopping) |
Contoh nyata di Indonesia: developer scraping freelance kerap men-deploy skrip dari region terdekat — AWS ap-southeast-1/ap-southeast-3 atau GCP asia-southeast2 (Jakarta). Semua itu IP pusat data yang dikenal Google, jadi request dari sana kerap dianggap berisiko tinggi.
Sinyal browser TLS (JA3/JA4)
Setiap HTTP client menghasilkan sinyal browser TLS handshake yang khas (JA3/JA4):
Chrome 120: JA3 = 771,4865-4866-4867-49195-49199-49196..
Python/requests: JA3 = 771,4866-4867-4865-49196-49200..
curl/libcurl: JA3 = 771,49196-49200-159-52393-52392..
reCAPTCHA memastikan sinyal TLS cocok dengan User-Agent yang diklaim; User-Agent Chrome dengan sinyal TLS Python langsung berbunyi otomasi.
Analisis HTTP header
Header request dibandingkan dengan pola Chrome asli:
Real Chrome headers:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,...
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
Sec-CH-UA: "Not_A Brand";v="8", "Chromium";v="120"
Sec-CH-UA-Platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Automation headers (missing or different):
- Missing Sec-CH-UA headers
- Missing Accept-Language
- Non-standard Accept header
- Missing Sec-Fetch-* headers
Lapisan 5: intelijen lintas sesi
Deteksi tidak berhenti di satu kunjungan. reCAPTCHA menghubungkan pola lintas sesi dan lintas situs:
| Sinyal lintas sesi | Yang dilihat reCAPTCHA |
|---|---|
| Korelasi sinyal sesi | Profil sama, request beruntun di banyak situs |
| Pola solve | Waktu jawaban terlalu konsisten |
| Korelasi challenge | Banyak sesi tuntas dalam hitungan detik |
| Timeline cookie | Sesi baru dari IP sama tanpa cookie |
Perilaku buruk di satu situs pun bisa menurunkan skor Anda di situs lain dengan profil browser sama.
Cara API solver menangani deteksi berlapis ini
API solver seperti CaptchaAI melewati kelima lapisan deteksi reCAPTCHA dengan menyelesaikan challenge di lingkungan yang terpisah dari otomasi Anda:
Your automation:
Extracts sitekey + pageurl from target page
↓
Sends to CaptchaAI API (HTTPS request to ocr.captchaai.com)
↓
CaptchaAI's solver environment:
├─ Real browser with genuine sinyal browser (not headless)
├─ Human-like behavioral patterns
├─ Clean residential IP
├─ Valid cookies and session history
├─ Matching sinyal TLS/header
└─ Solves the challenge with human-like behavior
↓
Returns valid g-recaptcha-response token
↓
Your automation:
Submits token to target website
↓
Target website validates token with Google
→ Google sees a legitimate solve from a trusted environment
→ Token validated: success = true
Poin utamanya: otomasi Anda tidak pernah menyentuh reCAPTCHA. Solver menangani sinyal browser, perilaku, dan penyelesaian challenge; kode Anda cukup mengirim tokennya ke form target.
Model CaptchaAI berbasis thread: Anda membayar thread konkuren, bukan per solve. Paket BASIC ($15/bulan, 5 thread) cukup untuk beban kecil, lalu naik tier saat konkurensi bertambah. reCAPTCHA v2 umumnya rampung di bawah 60 detik dengan tingkat keberhasilan tinggi pada tipe yang didukung.
Contoh Python
Ekstrak sitekey dan pageurl, kirim, lalu polling sampai token siap:
import requests
import time
API_KEY = "YOUR_API_KEY"
# Your automation only needs sitekey and pageurl
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6LcR_RsTAAAAAN_r0GEkGBfq3L7KmU5JbPHJtwNp",
"pageurl": "https://staging.example.com/qa-login",
"json": 1,
})
task_id = submit.json()["request"]
# Poll for token
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if result.get("status") == 1:
token = result["request"]
# Submit this token to the target site's form
print("Token received — submit to target form")
break
Contoh Node.js
Pola sama dalam Node.js dengan Axios:
const axios = require("axios");
async function solveRecaptcha(sitekey, pageurl) {
const API_KEY = "YOUR_API_KEY";
const { data: submit } = await axios.post(
"https://ocr.captchaai.com/in.php",
new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: pageurl,
json: 1,
})
);
const taskId = submit.request;
for (let i = 0; i < 60; i++) {
await new Promise(r => setTimeout(r, 5000));
const { data: result } = await axios.get(
"https://ocr.captchaai.com/res.php",
{ params: { key: API_KEY, action: "get", id: taskId, json: 1 } }
);
if (result.status === 1) return result.request;
}
throw new Error("Timeout");
}
Pola empat langkah CaptchaAI tetap: kirim, simpan task ID, polling, lalu suntikkan token g-recaptcha-response.
Pertanyaan Umum
Kenapa reCAPTCHA memberi skor rendah padahal script saya belum mengklik apa pun?
Karena penilaian berjalan sebelum ada interaksi. Saat halaman dimuat, reCAPTCHA menjalankan probe JavaScript, membaca sinyal canvas/WebGL, dan mencocokkan reputasi IP serta sinyal TLS. Mode headless plus IP pusat data saja sudah cukup menjatuhkan skor ke 0,1.
Apakah cukup mengganti user-agent agar terlihat seperti Chrome asli?
Tidak. User-Agent gampang dipalsukan; reCAPTCHA mencocokkannya dengan banyak sinyal lain:
- sinyal browser TLS (JA3/JA4)
- header Sec-CH-UA dan Sec-Fetch-*
- daftar plugin dan hasil render WebGL
User-Agent Chrome dengan sinyal TLS Python justru menjadi penanda otomasi yang jelas.
Apakah undetected-chromedriver menjamin lolos dari deteksi reCAPTCHA?
Tidak. undetected-chromedriver dan konfigurasi serupa bisa menutup sebagian sinyal, tetapi lapisan perilaku dan reputasi IP tetap sulit ditiru dari satu mesin. API solver menghindarinya sama sekali karena challenge tidak pernah diselesaikan di browser Anda.
Berapa lama CaptchaAI mengembalikan token reCAPTCHA v2?
reCAPTCHA v2 umumnya rampung di bawah 60 detik dengan tingkat keberhasilan tinggi. Alurnya sama seperti contoh kode di atas.
Ringkasan
Lima lapisan itu — lingkungan JavaScript, canvas/WebGL, perilaku, reputasi IP, dan intelijen lintas sesi — bekerja bersamaan. API solver seperti CaptchaAI menangani semuanya di lingkungan terpisah lalu mengembalikan token valid, sehingga kode Anda tak pernah berhadapan langsung dengan reCAPTCHA.
Artikel Terkait
- Menyelesaikan callback reCAPTCHA v2 lewat API
- reCAPTCHA v2 dan Turnstile di situs yang sama
- Menyelami Assessment API reCAPTCHA Enterprise