reCAPTCHA invisible diaktifkan saat pengguna mengklik tombol atau submit form — tidak ada checkbox yang terlihat. Challenge terjadi di background, dan halaman dilanjutkan hanya setelah token diverifikasi. Solve-nya via CaptchaAI mirip dengan v2 standar, dengan satu tambahan utama: Anda harus meneruskan invisible=1 dalam API request.
Perbedaan terbesar dalam integrasi adalah cara inject token. Kebanyakan implementasi invisible menggunakan callback function, bukan field tersembunyi g-recaptcha-response. Anda perlu menemukan dan memanggil callback tersebut.
Tidak yakin invisible atau v2 standar? Baca reCAPTCHA v2 vs Invisible untuk tips deteksi.
Prasyarat
| Item | Detail |
|---|---|
| API key CaptchaAI | captchaai.com/api.php |
| Sitekey | Dari data-sitekey pada widget atau tombol |
| URL halaman | URL lengkap tempat invisible CAPTCHA berjalan |
| Browser tool | Selenium/Puppeteer untuk menjalankan callback |
Langkah 1: Deteksi reCAPTCHA Invisible
Cari pola berikut di HTML halaman:
<!-- 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>
Jika Anda melihat data-size="invisible", tombol dengan data-sitekey, atau grecaptcha.execute() tanpa container, maka itu adalah reCAPTCHA invisible.
Langkah 2: Kirim 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: Poll Hasil
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: Inject Token via Callback
Ini adalah langkah krusial. reCAPTCHA invisible mengharapkan callback function, bukan hanya nilai field tersembunyi:
# 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 kerja lengkap
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")
Contoh lengkap yang dapat dijalankan
Butuh proyek kerja lengkap dengan pengaturan lingkungan, polling, percobaan ulang, dan penanganan kesalahan?
Lihat contoh lengkap yang dapat dijalankan di GitHub →
Pertanyaan Umum
Bagaimana tahu jika reCAPTCHA invisible?
Cari data-size="invisible" pada div widget atau tombol dengan data-sitekey. Jika tidak ada checkbox yang terlihat, kemungkinan besar itu invisible.
Apakah perlu invisible=1 untuk reCAPTCHA invisible?
Ya. Tanpanya, CaptchaAI memperlakukan task sebagai v2 standar dan token mungkin ditolak.
Bagaimana jika tidak bisa menemukan callback function?
Coba isi field tersembunyi g-recaptcha-response dan submit form. Beberapa implementasi invisible fallback ke metode ini. Jika gagal, cari JavaScript halaman untuk fungsi yang menangani respons reCAPTCHA.
Bisakah reCAPTCHA invisible menggunakan Enterprise?
Ya. Tambahkan invisible=1 dan enterprise=1 ke request Anda.
Mengapa halaman tidak merespons setelah callback dieksekusi?
Nama callback mungkin salah, atau halaman membutuhkan form field tambahan. Verifikasi nama callback yang tepat dan pastikan semua field form yang diperlukan sudah terisi sebelum callback dipicu.
Panduan Terkait
- Error reCAPTCHA Invisible yang Umum
- reCAPTCHA v2 vs Invisible
- Cara Solve reCAPTCHA v2 Callback Menggunakan API