Buka source halaman target dan cari satu hal: skrip yang dimuat itu enterprise.js atau api.js?render=. Kalau enterprise.js, tambahkan enterprise=1 pada task CaptchaAI Anda; kalau bukan, jangan. Di luar parameter itu, alurnya sama persis: kirim ke in.php, simpan task ID, polling res.php, pakai token.
Yang merepotkan bukan API-nya, melainkan fakta bahwa kedua varian sama-sama tidak terlihat: tidak ada checkbox atau puzzle gambar yang bisa dipakai menebak. Deteksi harus dibaca dari JavaScript halaman, dan tebakan yang meleset membuat token ditolak backend tanpa pesan error yang jelas.
Mendeteksi varian langsung dari kode halaman
Karena keduanya tidak terlihat, deteksi bergantung pada skrip yang dimuat halaman. Tiga cara berikut memberi hasil sama; pilih yang cocok dengan stack Anda.
Deteksi dengan Python:
import requests
import re
def detect_v3_type(url):
resp = requests.get(url)
html = resp.text
# Check for enterprise.js
if "enterprise.js" in html:
version = "enterprise_v3"
execute_fn = "grecaptcha.enterprise.execute"
elif "recaptcha/api.js" in html and "render=" in html:
version = "standard_v3"
execute_fn = "grecaptcha.execute"
else:
return None
# Extract sitekey from render parameter
key_match = re.search(r'render[=:]\s*["\']?([A-Za-z0-9_-]{40})', html)
sitekey = key_match.group(1) if key_match else None
# Extract action parameter
action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
action = action_match.group(1) if action_match else "unknown"
return {
"version": version,
"sitekey": sitekey,
"action": action,
"execute_fn": execute_fn
}
info = detect_v3_type("https://staging.example.com/qa-login")
print(info)
Deteksi dengan Node.js:
const axios = require("axios");
async function detectV3Type(url) {
const { data: html } = await axios.get(url);
let version, executeFn;
if (html.includes("enterprise.js")) {
version = "enterprise_v3";
executeFn = "grecaptcha.enterprise.execute";
} else if (html.includes("recaptcha/api.js") && html.includes("render=")) {
version = "standard_v3";
executeFn = "grecaptcha.execute";
} else {
return null;
}
const keyMatch = html.match(/render[=:]\s*['"]?([A-Za-z0-9_-]{40})/);
const actionMatch = html.match(/action['"]?\s*[:=]\s*['"](\w+)/);
return {
version,
sitekey: keyMatch?.[1] || null,
action: actionMatch?.[1] || "unknown",
executeFn,
};
}
Cek cepat lewat konsol DevTools:
// Paste in DevTools console
if (document.querySelector('script[src*="enterprise.js"]')) {
console.log("Enterprise v3");
console.log("Execute:", typeof grecaptcha?.enterprise?.execute);
} else if (document.querySelector('script[src*="api.js"][src*="render="]')) {
console.log("Standard v3");
console.log("Execute:", typeof grecaptcha?.execute);
}
Jalankan deteksi ini setiap kali halaman dimuat, bukan sekali saat menulis kode: situs bisa pindah ke Enterprise tanpa pengumuman.
Perbedaan yang benar-benar berpengaruh saat solve
Enterprise menambah banyak hal di sisi Google Cloud, tetapi yang benar-benar Anda sentuh hanya tiga baris: file JS, fungsi execute, dan parameter CaptchaAI.
| Fitur | Standard v3 | Enterprise v3 |
|---|---|---|
| Operasi tak terlihat | Ya | Ya |
| Skor (0.0–1.0) | Ya | Ya |
| Parameter action | Wajib | Wajib |
| File JS | api.js?render=KEY |
enterprise.js?render=KEY |
| Fungsi execute | grecaptcha.execute() |
grecaptcha.enterprise.execute() |
| Reason code | Tidak | Ya (AUTOMATION, TOO_MUCH_TRAFFIC, dll.) |
| Ambang batas khusus per action | Tidak | Ya (lewat Cloud Console) |
| Deteksi kebocoran password | Tidak | Ya |
| Account Defender | Tidak | Ya |
| Endpoint verifikasi | siteverify (gratis) |
recaptchaenterprise.googleapis.com (berbayar) |
| Parameter CaptchaAI | version=v3 |
version=v3 + enterprise=1 |
| Waktu penyelesaian umum | 10–20 detik | 10–20 detik |
Mengirim task ke CaptchaAI
v3 standard
import requests
import time
# Submit
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"googlekey": sitekey,
"action": "login",
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# Poll
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
v3 Enterprise
Satu-satunya tambahan adalah enterprise: 1; bagian polling tidak berubah.
import requests
import time
# Submit — add enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"enterprise": 1, # Required for Enterprise
"googlekey": sitekey,
"action": "login",
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# Polling is identical to standard
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
Solver universal dengan deteksi otomatis
Daripada memelihara dua jalur kode, satukan deteksi dan pengiriman task dalam satu kelas — pola inilah yang layak masuk ke worker produksi.
import requests
import time
import re
class RecaptchaV3Solver:
def __init__(self, api_key):
self.api_key = api_key
def detect_and_solve(self, page_url, action=None):
"""Auto-detect standard vs enterprise and solve."""
html = requests.get(page_url).text
is_enterprise = "enterprise.js" in html
key_match = re.search(r'render[=:]\s*["\']?([A-Za-z0-9_-]{40})', html)
if not key_match:
raise Exception("No v3 sitekey found")
sitekey = key_match.group(1)
if not action:
action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
action = action_match.group(1) if action_match else "verify"
params = {
"key": self.api_key,
"method": "userrecaptcha",
"version": "v3",
"googlekey": sitekey,
"action": action,
"pageurl": page_url
}
if is_enterprise:
params["enterprise"] = 1
resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key, "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
return result.text.split("|")[1]
if result.text != "CAPCHA_NOT_READY":
raise Exception(f"Solve failed: {result.text}")
raise Exception("Timed out")
solver = RecaptchaV3Solver("YOUR_API_KEY")
token = solver.detect_and_solve("https://staging.example.com/qa-login", action="login")
print(f"Token: {token[:40]}...")
Parameter action: penyebab skor rendah nomor satu
Google mencocokkan action yang menyertai token dengan action yang dikonfigurasi situs. Kalau tidak cocok, skor turun dan token bisa ditolak meski proses solve berhasil. Ambil nilainya dari JavaScript halaman, jangan menebak.
import re
def find_v3_actions(html):
"""Extract all action parameters from page JavaScript."""
# Look for grecaptcha.execute(key, {action: '...'})
pattern = r"(?:grecaptcha\.(?:enterprise\.)?execute|action)\s*[(:]\s*['\"](\w+)"
actions = re.findall(pattern, html)
return list(set(actions))
# Common actions: "login", "submit", "register", "checkout", "homepage"
Kalau regex tidak menemukan apa pun, cari string execute( lewat DevTools. Nilai yang lazim: login, submit, register, checkout, homepage.
Menyisipkan token ke form
Cara menyisipkan token sama untuk kedua varian — nama field g-recaptcha-response tidak berubah di Enterprise.
# For browser-based workflows (Selenium)
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# For pure HTTP workflows
requests.post(page_url, data={
"g-recaptcha-response": token,
"username": "user",
"password": "pass"
})
// Puppeteer
await page.evaluate((tok) => {
document.getElementById("g-recaptcha-response").value = tok;
}, token);
// Pure HTTP (axios)
await axios.post(pageUrl, new URLSearchParams({
"g-recaptcha-response": token,
username: "user",
password: "pass",
}));
Kesalahan yang paling sering terjadi
| Kesalahan | Akibat | Perbaikan |
|---|---|---|
enterprise=1 pada v3 standard |
Token bisa ditolak saat verifikasi | Cek enterprise.js dulu |
Lupa enterprise=1 di Enterprise v3 |
Token ditolak backend | Tambahkan saat enterprise.js ada |
Nilai action salah |
Skor rendah, token ditolak | Ambil action persis dari JavaScript halaman |
Lupa version=v3 |
Task diperlakukan sebagai v2 | Sertakan version=v3 untuk reCAPTCHA berbasis skor |
| Sitekey v2 dipakai untuk task v3 | ERROR_WRONG_GOOGLEKEY |
sitekey v3 ada di parameter render=KEY |
| Versi di-hardcode | Gagal senyap setelah situs migrasi | Deteksi ulang tiap halaman dimuat |
Catatan untuk tim automation di Indonesia
Biaya. Pekerjaan automation di sini banyak berupa kontrak freelance atau agensi price-monitoring dengan margin tipis, jadi pertanyaan pertamanya soal harga. Enterprise v3 tidak menambah biaya di CaptchaAI: penagihan berbasis thread, bukan per solve. Paket BASIC ($15/bulan, 5 thread) sampai VIP-3 ($7,500/bulan, 5.000 thread) menghitung solve yang berjalan bersamaan, bukan varian yang Anda kirim.
Batas waktu. Worker di AWS ap-southeast-3 (Jakarta) atau ap-southeast-1 (Singapura) tetap menunggu hasil solve secara asinkron: beri ruang minimal 60 detik untuk siklus polling, interval polling jangan di bawah 5 detik. Uji juga hanya halaman yang Anda berwenang menguji — UU Pelindungan Data Pribadi (UU 27/2022) membuat data pribadi pihak lain berisiko diproses.
Pertanyaan yang sering muncul
Apakah saya perlu akun Google Cloud untuk solve Enterprise v3?
Tidak. Itu urusan pemilik situs. Anda hanya perlu sitekey, action yang benar, dan parameter enterprise=1.
Apakah Enterprise v3 dikenai biaya berbeda di CaptchaAI?
Tidak. Semua paket ditagih per thread bersamaan dengan solve tanpa batas per thread, tanpa tarif tambahan per tipe CAPTCHA.
Bagaimana cara mengecek varian dari dalam skrip Selenium?
Baca page_source lalu cari penanda enterprise.js:
page_source = driver.page_source
is_enterprise = "enterprise.js" in page_source
Token saya valid tetapi skor tetap rendah — apa yang salah?
Biasanya action tidak cocok atau reputasi IP pengirim buruk. Skor v3 menilai perilaku sesi, bukan hanya token.
Bagaimana kalau situs yang sama memakai hCaptcha di halaman lain?
hCaptcha belum didukung CaptchaAI, jadi halaman itu butuh layanan lain. Keluarga reCAPTCHA — v2, v2 Invisible, v2 Enterprise, v3, v3 Enterprise — semuanya lewat method userrecaptcha yang sama.