API Tutorials

Cara Solve reCAPTCHA v2 dengan API

Empat panggilan API saja: submit sitekey dan pageurl ke in.php, polling res.php sampai statusnya 1, lalu inject token ke form. Itulah seluruh alurnya lewat CaptchaAI reCAPTCHA v2 solver.

Panduan ini untuk tim yang butuh integrasi jalan hari ini — termasuk job otomasi dari ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta), pola umum di tim scraping Indonesia.

Belum yakin ini reCAPTCHA v2, bukan v3 atau Enterprise? Cek dulu cara membedakan versi reCAPTCHA.


Apa yang perlu disiapkan sebelum mulai

Kebutuhan Detail
API key CaptchaAI Dari captchaai.com/api.php — string 32 karakter.
URL halaman lengkap Alamat tempat widget dimuat, termasuk skema https://.
sitekey Kunci publik widget — cara ekstraknya di Langkah 1.
HTTP client requests, axios/fetch, atau curl — bebas pilih.
Thread aktif Setiap solve butuh satu thread bebas; BASIC ($15/bulan, 5 thread) cukup untuk uji coba.

Langkah 1: ekstrak sitekey dan pageurl reCAPTCHA v2

pageurl adalah alamat lengkap halaman tempat widget tampil, termasuk skema https://. Tiga cara menemukan sitekey:

1. Dari HTML — atribut data-sitekey pada container widget:

<div class="g-recaptcha" data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>

2. Dari URL iframe — parameter k= di https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&... adalah sitekey-nya.

3. Dari traffic jaringan — DevTools → Network, filter recaptcha, cari parameter k.


Langkah 2: submit task reCAPTCHA v2 ke in.php

Kirim sitekey, pageurl, dan method=userrecaptcha; respons sukses berisi task ID untuk polling.

import requests

API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://staging.example.com/qa-login"

submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": SITEKEY,
    "pageurl": PAGEURL,
    "json": 1,
}).json()

assert submit["status"] == 1, submit
task_id = submit["request"]
print("task id:", task_id)

Node.js — payload dan endpoint sama persis:

const r = await fetch("https://ocr.captchaai.com/in.php", {
  method: "POST",
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({
    key: API_KEY,
    method: "userrecaptcha",
    googlekey: SITEKEY,
    pageurl: PAGEURL,
    json: "1",
  }),
});
const { status, request: taskId } = await r.json();
if (status !== 1) throw new Error(taskId);

Widget-nya invisible? Tambahkan invisible=1 ke payload submit. Detail di cara kerja reCAPTCHA invisible.


Langkah 3: polling res.php sampai token siap

Solve reCAPTCHA v2 biasanya rampung di bawah 60 detik dengan tingkat keberhasilan tinggi pada tipe yang didukung. Tunggu 20 detik sebelum polling pertama, lalu cek tiap 5 detik.

import time

time.sleep(20)
while True:
    res = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id,
        "json": 1,
    }).json()

    if res.get("request") == "CAPCHA_NOT_READY":
        time.sleep(5)
        continue

    if res.get("status") == 1:
        token = res["request"]
        print("token:", token[:60], "…")
        break

    raise RuntimeError(res)

CAPCHA_NOT_READY bukan error — solve masih berjalan. Token biasanya diawali 03AGdBq25....


Langkah 4: inject token reCAPTCHA v2 ke form

Cara injeksi tergantung situs target. Paling umum: isi textarea g-recaptcha-response lewat JavaScript, lalu submit form.

document.querySelector('textarea[name="g-recaptcha-response"]').value = token;
document.querySelector("form").submit();

Selenium:

driver.execute_script(
    "document.querySelector('[name=\"g-recaptcha-response\"]').value = arguments[0];",
    token,
)
driver.find_element(By.CSS_SELECTOR, "form").submit()

Playwright:

await page.evaluate((t) => {
  document.querySelector('[name="g-recaptcha-response"]').value = t;
}, token);
await page.click('button[type="submit"]');

Jika widget punya atribut data-callback, panggil juga fungsi callback-nya — sebagian situs memvalidasi lewat callback, bukan textarea:

const callback = document.querySelector(".g-recaptcha").dataset.callback;
if (callback && window[callback]) window[callback](token);

Contoh lengkap: solve reCAPTCHA v2 di Python

Versi siap pakai: submit, polling, dan safety limit dalam satu fungsi:

import time
import requests

API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://staging.example.com/qa-login"

def solve_recaptcha_v2():
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": SITEKEY, "pageurl": PAGEURL, "json": 1,
    }).json()
    if submit["status"] != 1:
        raise RuntimeError(submit)
    task_id = submit["request"]

    time.sleep(20)
    for _ in range(40):
        res = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id, "json": 1,
        }).json()
        if res.get("request") == "CAPCHA_NOT_READY":
            time.sleep(5)
            continue
        if res.get("status") == 1:
            return res["request"]
        raise RuntimeError(res)
    raise TimeoutError("solve timed out")

if __name__ == "__main__":
    token = solve_recaptcha_v2()
    print("token:", token[:80])

Error yang paling sering muncul saat solve reCAPTCHA v2

Error Penyebab Tindakan
ERROR_GOOGLEKEY sitekey kosong/salah salin Ekstrak ulang dari halaman aktif
ERROR_PAGEURL pageurl tidak dikirim Sertakan URL lengkap dengan skema https://
ERROR_ZERO_BALANCE Tidak ada thread bebas Top up plan atau tunggu thread selesai
ERROR_CAPTCHA_UNSOLVABLE Situs memperketat tantangan Coba lagi; lihat error umum reCAPTCHA v2
Token ditolak meski status 1 Token kedaluwarsa Pakai dalam ~110 detik setelah diterima

Kalau token sudah ada tapi form tetap menolak

  • Situs punya handler sendiri — cari callback pada widget, jangan andalkan textarea saja.
  • Sinyal browser harus konsisten — cookie dan User-Agent saat token diminta dan dipakai harus sama; sertakan proxy/proxytype jika reCAPTCHA menilai reputasi IP.

Estimasi kebutuhan thread untuk tim scraping Indonesia

Satu thread hanya menangani satu solve reCAPTCHA v2 yang sedang berjalan, jadi kebutuhan thread kira-kira sama dengan jumlah job paralel yang dijalankan tim Anda dari ap-southeast-1 maupun ap-southeast-3:

Skenario tim Job paralel Plan yang cukup
Freelancer atau tim kecil, uji coba awal 1–5 BASIC ($15/bulan, 5 thread)
Startup data atau price-monitoring 6–15 STANDARD ($30/bulan, 15 thread)
Volume tinggi, banyak worker paralel 16–50 ADVANCE ($90/bulan, 50 thread)

Mulai dari BASIC untuk uji coba, lalu naik tier begitu jumlah job paralel bertambah — endpoint dan parameter yang dipakai tetap sama persis di semua tier, jadi tidak ada migrasi kode saat upgrade.


Pertanyaan seputar solve reCAPTCHA v2 via API

Berapa lama proses solve reCAPTCHA v2 lewat API CaptchaAI?

Biasanya di bawah 60 detik dengan tingkat keberhasilan tinggi pada tipe yang didukung. Jangan polling di bawah interval 5 detik.

Bisa solve reCAPTCHA v2 tanpa browser, hanya lewat HTTP request?

Bisa untuk submit dan polling — keduanya HTTP murni. Browser baru perlu di langkah inject, kecuali target menerima token langsung di body POST.

Apakah lokasi server tim (Jakarta atau Singapura) memengaruhi kecepatan solve?

Tidak signifikan. in.php dan res.php adalah HTTP API biasa, jadi job dari ap-southeast-1 maupun ap-southeast-3 sama-sama bisa jalan lancar; yang menentukan waktu solve adalah kompleksitas tantangan dan antrean thread, bukan region tempat job Anda berjalan.

Apakah scraping dengan alur ini perlu memperhatikan UU PDP?

Ya. UU Pelindungan Data Pribadi (UU 27/2022) dan UU ITE tetap berlaku untuk data yang Anda kumpulkan saat scraping — CaptchaAI hanya menangani penyelesaian CAPTCHA-nya; kepatuhan atas data yang diambil tetap tanggung jawab tim Anda.


Langkah berikutnya

Komentar dinonaktifkan untuk artikel ini.