Explainers

Cara reCAPTCHA Mendeteksi Otomasi dan Cara Kerja API Solver

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

Komentar dinonaktifkan untuk artikel ini.