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=1ke 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-Agentsaat token diminta dan dipakai harus sama; sertakanproxy/proxytypejika 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.