Skrip Selenium atau Puppeteer Anda mengisi form, menekan tombol submit, lalu berhenti begitu saja — tidak ada pesan error, tapi form juga tidak pernah benar-benar terkirim. Ini gejala paling umum saat berhadapan dengan reCAPTCHA invisible: tidak ada checkbox untuk diklik atau widget yang terlihat jelas di halaman, tapi ada callback function di balik layar yang harus Anda panggil sendiri begitu token siap. Solve-nya lewat CaptchaAI sebenarnya mirip reCAPTCHA v2 checkbox biasa di level API — bedanya cuma satu parameter, invisible=1 — tapi bagian sesudahnya, cara menyuntikkan token ke halaman, sering menjebak developer yang baru pertama kali menanganinya. Panduan ini mengikuti alur empat langkah yang sama seperti tipe CAPTCHA lain di CaptchaAI — kirim task, simpan task ID, polling sampai token siap, lalu pakai token — hanya saja langkah terakhirnya butuh perhatian ekstra karena melibatkan fungsi JavaScript di halaman target, bukan sekadar mengisi satu field tersembunyi.
Sebelum mulai, siapkan empat hal: API key CaptchaAI dari captchaai.com/api.php, sitekey yang diambil dari atribut data-sitekey pada widget atau tombol, URL lengkap halaman tempat widget dimuat, dan Selenium atau Puppeteer untuk mengeksekusi callback nanti. Kalau Anda belum yakin widget yang dihadapi benar-benar invisible dan bukan v2 checkbox standar, cek dulu ciri-ciri pembedanya sebelum lanjut — salah menandai keduanya adalah penyebab paling umum token yang ditolak. Satu hal yang sering luput dari tim automation dan scraping freelance di Indonesia (banyak mengerjakan proyek lewat Upwork atau Fastwork): kalau server tempat script Anda berjalan ada di region Asia Tenggara — AWS ap-southeast-1 (Singapura), AWS ap-southeast-3, atau GCP asia-southeast2 (Jakarta) — latensi ke endpoint CaptchaAI maupun ke situs target tetap perlu diperhitungkan dalam interval polling; kondisi jaringan yang lebih mobile-first di sebagian infrastruktur lokal membuat batas waktu yang longgar lebih aman daripada meniru mentah-mentah contoh 5 detik dari tutorial luar negeri. Untuk tim yang baru menguji-coba, thread trial biasanya cukup untuk menjalankan seluruh alur ini dari ujung ke ujung sebelum berlangganan plan berbayar.
Langkah 1: Kenali Ciri reCAPTCHA Invisible
reCAPTCHA invisible tidak menampilkan checkbox "Saya bukan robot" di mana pun pada halaman. Cek tiga pola berikut di HTML: div dengan data-size="invisible", tombol dengan atribut data-sitekey tanpa checkbox terpisah, atau pemanggilan grecaptcha.execute() tanpa container widget sama sekali. Kalau salah satu pola ini muncul, Anda memang berhadapan dengan varian invisible, bukan v2 checkbox biasa. Ketiganya sering tercampur di satu halaman yang sama, jadi periksa urutan pattern-matching-nya dari yang paling spesifik (data-size) ke yang paling umum (grecaptcha.execute tanpa container):
<!-- Option 1: div with data-size="invisible" -->
<div class="g-recaptcha" data-sitekey="6LdKlZEU..." data-size="invisible" data-callback="onSubmit"></div>
<!-- Option 2: button with data-sitekey (invisible by default) -->
<button data-sitekey="6LdKlZEU..." data-callback="onSubmit">Submit</button>
<!-- Option 3: programmatic execution -->
<script>
grecaptcha.execute('6LdKlZEU...', {action: 'submit'});
</script>
Langkah 2: Kirim Task ke CaptchaAI
import requests
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "6LdKlZEUAAAAAPoxm...",
"pageurl": "https://example.com/signup",
"invisible": 1,
"json": 1
})
task_id = response.json()["request"]
const params = new URLSearchParams({
key: "YOUR_API_KEY", method: "userrecaptcha",
googlekey: "6LdKlZEUAAAAAPoxm...",
pageurl: "https://example.com/signup",
invisible: 1, json: 1,
});
const res = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
const { request: taskId } = await res.json();
Langkah 3: Polling Sampai Token Siap
import time
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Error: {result['request']}")
Langkah 4: Suntikkan Token Lewat Callback
Ini bagian yang paling sering bikin developer bingung pertama kali mencoba invisible. Berbeda dari v2 checkbox yang cukup mengisi field tersembunyi, kebanyakan implementasi invisible memanggil fungsi callback yang didaftarkan lewat atribut data-callback — Anda perlu menemukan nama fungsi itu di DOM lalu mengeksekusinya secara manual dengan token sebagai argumen. Kalau callback-nya scoped di luar window global (umum kalau front-end target memakai bundler seperti Webpack), window['namaCallback'] tidak akan menemukannya; pada kasus begitu, fallback mengisi field tersembunyi g-recaptcha-response lalu memicu submit form secara langsung biasanya masih berfungsi. Kode di bawah menunjukkan kedua pendekatan sekaligus — cari nama callback dulu, baru jatuh ke fallback field tersembunyi kalau tidak ditemukan:
# Selenium example
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com/signup")
# Find the callback name
callback = driver.execute_script("""
var el = document.querySelector('[data-callback]');
if (el) return el.getAttribute('data-callback');
var btn = document.querySelector('[data-sitekey]');
if (btn) return btn.getAttribute('data-callback');
return null;
""")
# Execute the callback with the token
if callback:
driver.execute_script(f"window['{callback}']('{token}');")
else:
# Fallback: fill hidden field and submit
driver.execute_script(f"""
document.getElementById('g-recaptcha-response').innerHTML = '{token}';
document.querySelector('form').submit();
""")
// Puppeteer example
await page.evaluate((token) => {
const el = document.querySelector('[data-callback]') || document.querySelector('[data-sitekey]');
const callbackName = el?.getAttribute('data-callback');
if (callbackName && window[callbackName]) {
window[callbackName](token);
} else {
document.getElementById('g-recaptcha-response').innerHTML = token;
document.querySelector('form').submit();
}
}, token);
Fungsi Siap Pakai
Gabungan Langkah 2 dan 3 di atas jadi satu fungsi utuh yang bisa langsung dipanggil dari kode automation Anda — tinggal tambahkan bagian injeksi callback dari Langkah 4 sesuai struktur halaman target:
import requests
import time
def solve_invisible_recaptcha(api_key, sitekey, page_url):
submit = requests.get("https://ocr.captchaai.com/in.php", params={
"key": api_key, "method": "userrecaptcha", "googlekey": sitekey,
"pageurl": page_url, "invisible": 1, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
for _ in range(40):
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:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result.get('request')}")
raise TimeoutError("Timed out")
token = solve_invisible_recaptcha("YOUR_API_KEY", "6LdKlZEU...", "https://example.com/signup")
Butuh proyek kerja penuh di luar potongan kode di atas — lengkap dengan environment setup, retry logic, dan penanganan error? Lihat contoh proyek lengkap di GitHub →. Satu catatan penting: status CAPCHA_NOT_READY yang muncul berulang selama polling itu normal, bukan tanda kegagalan — baru hentikan loop kalau result["request"] benar-benar berisi pesan error lain, dan pastikan googlekey yang Anda kirim sama persis dengan sitekey yang benar-benar dirender di halaman (sitekey staging tertukar dengan production adalah penyebab token ditolak yang paling sering luput diperiksa). Simpan fungsi ini di modul terpisah kalau Anda menangani banyak tipe CAPTCHA sekaligus, supaya logika submit-dan-polling tidak terduplikasi di setiap script automation.
Pertanyaan Umum
Berapa lama biasanya reCAPTCHA invisible selesai diproses?
Invisible reCAPTCHA v2 biasanya selesai di bawah 30 detik dengan tingkat keberhasilan tinggi pada tipe yang didukung — lebih cepat dari reCAPTCHA v2 checkbox standar (di bawah 60 detik) karena tidak ada interaksi pengguna yang perlu ditunggu sebelum proses solve dimulai. Untuk alur automation yang mengejar throughput, selisih ini cukup terasa saat Anda menjalankan ratusan task paralel dalam satu batch.
Paket CaptchaAI mana yang cocok untuk volume reCAPTCHA invisible yang tinggi?
Ini soal jumlah task paralel, bukan jumlah solve per bulan — semua paket CaptchaAI, dari BASIC ($15/bulan, 5 thread) sampai ENTERPRISE ($300/bulan, 200 thread), sudah termasuk solve tanpa batas per thread. Tim scraping dengan trafik tinggi biasanya mulai dari ADVANCE ($90/bulan, 50 thread) lalu naik sesuai concurrency yang benar-benar dibutuhkan, dan baru pindah ke tier VIP kalau concurrency ratusan task jadi kebutuhan harian.
Apakah scraping situs yang menggunakan reCAPTCHA invisible aman secara hukum?
Menyelesaikan reCAPTCHA invisible sendiri adalah bagian sah dari alur automation dan testing — bukan celah keamanan yang dieksploitasi. Yang perlu Anda jaga adalah data yang diambil setelahnya: scrape hanya data yang memang berwenang Anda proses, hindari data pribadi, dan perhatikan UU Pelindungan Data Pribadi (UU 27/2022) serta UU ITE kalau target Anda menyimpan data pengguna. Ini bukan nasihat hukum — untuk kasus spesifik yang menyangkut data pihak lain, konsultasikan dengan tim legal Anda sebelum menjalankan automation dalam skala besar.
Panduan Terkait
- Error reCAPTCHA Invisible yang Paling Sering Muncul
- reCAPTCHA v2 vs Invisible: cara membedakannya
- Cara Solve reCAPTCHA v2 Callback Menggunakan API