reCAPTCHA v2 masih jadi salah satu rintangan paling umum di alur login, registrasi, checkout, dan submit form. Jika otomasi Anda menabrak checkbox atau image challenge reCAPTCHA v2, Anda bisa solve-nya via API dalam empat langkah: ekstrak sitekey dan pageurl dari halaman, kirim ke CaptchaAI reCAPTCHA v2 solver, tunggu hasilnya, lalu inject token ke alur yang dilindungi.
Panduan ini ditujukan untuk developer yang butuh integrasi yang jalan, bukan tinjauan teori.
Belum yakin versi reCAPTCHA-nya? Baca dulu Cara Mengenali Versi reCAPTCHA.
Yang dibutuhkan sebelum mulai
| Kebutuhan | Detail |
|---|---|
| API key CaptchaAI | Ambil dari captchaai.com/api.php. 32 karakter. |
| URL halaman lengkap | URL persis tempat widget reCAPTCHA v2 dimuat. |
| sitekey | Kunci publik widget di halaman tersebut. |
| HTTP client | requests, axios, fetch, curl — bebas. |
| Thread aktif | Akun harus punya thread tersedia. |
Langkah 1: ekstrak sitekey dan pageurl
pageurl adalah URL lengkap halaman tempat reCAPTCHA muncul. Selalu sertakan https://.
Tiga cara dapat sitekey:
1. Dari HTML — cari <div class="g-recaptcha" data-sitekey="...">:
<div class="g-recaptcha" data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>
2. Dari URL iframe — https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&... — parameter k= adalah sitekey.
3. Dari traffic jaringan — DevTools → Network, filter recaptcha, parameter k muncul di request mana pun.
Langkah 2: kirim task
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)
Versi Node.js:
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);
reCAPTCHA invisible? Tambah
invisible=1. Detail di Cara Kerja reCAPTCHA Invisible.
Langkah 3: polling hasil
reCAPTCHA v2 biasanya butuh 15–60 detik. Tunggu 20 detik, lalu polling 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)
Token yang dikembalikan adalah string panjang, biasanya diawali 03AGdBq25....
Langkah 4: injeksikan token ke halaman
Cara tergantung situs. Yang paling umum: textarea g-recaptcha-response:
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 data-callback, panggil juga fungsinya:
const callback = document.querySelector(".g-recaptcha").dataset.callback;
if (callback && window[callback]) window[callback](token);
Contoh lengkap (Python)
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 umum dan solusinya
| Error | Penyebab | Tindakan |
|---|---|---|
ERROR_GOOGLEKEY |
sitekey kosong/salah | Ekstrak ulang sitekey dari halaman saat ini |
ERROR_PAGEURL |
pageurl hilang |
Kirim URL lengkap dengan skema |
ERROR_ZERO_BALANCE |
Tidak ada thread | Top up atau tunggu thread bebas |
ERROR_CAPTCHA_UNSOLVABLE |
Situs memperketat tantangan | Coba lagi setelah beberapa detik; lihat error umum saat memecahkan reCAPTCHA v2 |
| Situs menolak token | Token kedaluwarsa | Pakai dalam ~110 detik setelah diterima |
Saat tidak ada yang jalan
- Token sudah ada, situs tetap memblokir — form punya handler sendiri. Cari callback dan panggil, jangan hanya isi textarea.
- Wajib pertahankan sinyal browser sama — kirim cookie dan
User-Agentyang sama saat token diminta. - reCAPTCHA bergantung proxy — tambahkan
proxydanproxytypedi submit agar solver pakai pool IP Anda.
Langkah selanjutnya
- CaptchaAI Quickstart: Pemecahan CAPTCHA Pertama Anda dalam 5 Menit
- How To Identify Recaptcha Version
- Cara Menyelesaikan Cloudflare Turnstile dengan API
- Kesalahan dan Perbaikan Umum Penyelesaian reCAPTCHA v2