Untuk integrasi otomatisasi, satu-satunya perbedaan yang mengubah kode Anda adalah satu parameter: enterprise=1. Sisanya — kode alasan, ambang batas per action, account defender — berjalan di sisi pemilik situs dan tidak muncul di respons yang Anda terima.
Masalahnya, salah menebak versi berarti token ditolak tanpa pesan error yang jelas. Keduanya invisible, tanpa gambar untuk diklik, dan mengembalikan skor risiko 0.0 (bot) sampai 1.0 (manusia) — perbedaannya tidak terlihat dari tampilan halaman.
Cara mendeteksi versi reCAPTCHA v3 dari HTML
Jangan hardcode versinya: situs bisa pindah ke Enterprise kapan saja. Tandanya ada di tag <script>:
- Standar memuat
recaptcha/api.js?render=KEYdan memanggilgrecaptcha.execute(). - Enterprise memuat
enterprise.js?render=KEYdan memanggilgrecaptcha.enterprise.execute().
Sitekey v3 juga datang dari parameter render=, bukan dari data-sitekey seperti pada v2 — penyebab paling umum error ERROR_WRONG_GOOGLEKEY.
Fungsi berikut mengambil versi, sitekey, dan action sekaligus:
import requests
import re
def detect_v3_version(url):
html = requests.get(url).text
if "enterprise.js" in html:
version = "enterprise"
elif "recaptcha/api.js" in html and "render=" in html:
version = "standard"
else:
return None
# Extract sitekey
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
action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
action = action_match.group(1) if action_match else None
return {"version": version, "sitekey": sitekey, "action": action}
Versi Node.js dengan Axios, untuk worker berbasis JavaScript:
const axios = require("axios");
async function detectV3Version(url) {
const { data: html } = await axios.get(url);
const version = html.includes("enterprise.js")
? "enterprise"
: html.includes("recaptcha/api.js") && html.includes("render=")
? "standard"
: 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],
action: actionMatch?.[1],
};
}
Mengirim task: standar dan Enterprise
Alur kerjanya identik untuk kedua versi, sama seperti tipe CAPTCHA lain: kirim ke in.php, simpan task ID, polling res.php, pakai token.
Solve reCAPTCHA v3 standar
import requests
import time
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]
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
Solve reCAPTCHA v3 Enterprise
Perbedaannya hanya satu baris — "enterprise": 1:
import requests
import time
# Only difference: enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"enterprise": 1,
"googlekey": sitekey,
"action": "login",
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
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 yang mendeteksi versi sendiri
Karena situs bisa berpindah versi, gabungkan deteksi dan pengiriman task dalam satu class:
class V3AutoSolver:
def __init__(self, api_key):
self.api_key = api_key
def solve(self, page_url, action=None):
import re
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")
if not action:
act_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
action = act_match.group(1) if act_match else "verify"
params = {
"key": self.api_key,
"method": "userrecaptcha",
"version": "v3",
"googlekey": key_match.group(1),
"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 error: {result.text}")
raise Exception("Timed out")
Apa yang berubah pada penilaian skor
Standar v3 memakai satu model penilaian global milik Google. Enterprise menambahkan lapisan di atasnya, dan tiga di antaranya berdampak langsung ke otomatisasi:
- Ambang batas per action. Pada standar biasanya berlaku satu ambang batas untuk semua action. Pada Enterprise,
loginbisa lolos di 0.7 sementaracheckoutmenuntut 0.9 — nilaiactionharus persis sama dengan yang dipanggil halaman. - Pembelajaran adaptif. Enterprise membangun model dari pola trafik situs itu sendiri, bukan hanya model global, sehingga pola permintaan yang seragam lebih cepat menonjol.
- Analisis kode alasan. Positif palsu ditangani otomatis lewat kode alasan, bukan penyetelan ambang batas manual.
Rentang skornya tidak berubah: tetap 0.0–1.0 dengan dua desimal. Yang berubah adalah seberapa ketat angka itu dibaca.
Untuk pengguna CaptchaAI: kualitas token sama untuk kedua versi. Ketepatan parameter action yang menentukan hasil akhirnya.
Kode alasan Enterprise dan artinya
Kode alasan dikirim ke backend pemilik situs saat verifikasi token, bukan ke respons CaptchaAI. Tetap berguna dipahami: kode inilah yang menjelaskan mengapa token ditolak padahal solve-nya sukses.
| Kode | Artinya | Dampak pada otomatisasi |
|---|---|---|
AUTOMATION |
Perilaku otomatis terdeteksi | Gunakan sinyal browser yang konsisten |
UNEXPECTED_ENVIRONMENT |
Lingkungan browser tidak biasa | Periksa konfigurasi browser headless |
TOO_MUCH_TRAFFIC |
Volume permintaan tinggi dari satu sumber | Terapkan pembatasan laju permintaan (rate limiting) |
UNEXPECTED_USAGE_PATTERNS |
Pola interaksi tidak wajar | Tambahkan jeda realistis antar tindakan |
LOW_CONFIDENCE_SCORE |
Data tidak cukup untuk penilaian | Kirim lebih banyak sinyal perilaku |
SUSPECTED_CARDING |
Pola penipuan kartu kredit | Tidak relevan untuk mayoritas otomatisasi |
SUSPECTED_CHARGEBACK |
Pola penipuan tagihan balik | Sama, tidak relevan |
Ringkasan perbedaan fitur
| Fitur | Standar v3 | Enterprise v3 |
|---|---|---|
| Operasi invisible | Ya | Ya |
| Skor (0.0–1.0) | Ya | Ya |
| Parameter action | Wajib | Wajib |
| Kode alasan | Tidak | Ya |
| Ambang batas khusus per action | Tidak | Ya (via Cloud Console) |
| Deteksi kebocoran kata sandi | Tidak | Ya |
| Account defender | Tidak | Ya |
| Label pencegahan penipuan | Tidak | Ya |
| Integrasi autentikasi multi-faktor | Tidak | Ya |
| Endpoint verifikasi | siteverify (gratis) |
recaptchaenterprise.googleapis.com |
| Kuota bulanan | 1 juta penilaian gratis | Bayar per penilaian |
| File JS | api.js?render=KEY |
enterprise.js?render=KEY |
| Parameter CaptchaAI | version=v3 |
version=v3 + enterprise=1 |
Baris kuota di atas adalah biaya pemilik situs ke Google, bukan biaya Anda sebagai pemanggil API.
Skenario: satu worker, dua versi sekaligus
Kasus yang sering muncul di pekerjaan kontrak otomatisasi dan tim data startup: satu worker memantau belasan halaman form milik beberapa klien. Sebagian masih v3 standar, sebagian sudah pindah ke Enterprise, tanpa pemberitahuan.
Kalau versinya di-hardcode, kegagalan muncul sebagai token yang ditolak di sisi situs — bukan error dari API — sehingga log Anda terlihat bersih padahal submit-nya gagal. Deteksi per permintaan seperti V3AutoSolver di atas karena itu bukan sekadar kerapian kode.
Sisi biayanya relevan untuk pasar yang sensitif harga seperti Indonesia. CaptchaAI menagih per thread bersamaan, bukan per solve, dengan solve tanpa batas selama bulan berjalan. Satu thread berarti satu CAPTCHA yang sedang diproses; begitu selesai, thread itu langsung dipakai task berikutnya. Paket BASIC ($15/bulan, 5 thread) memadai untuk pekerjaan freelance kecil, sementara ADVANCE ($90/bulan, 50 thread) menampung antrean pemantauan yang jauh lebih padat — dan tarifnya tidak berubah hanya karena situs targetnya memakai Enterprise.
Soal latensi, polling pada contoh kode berjalan tiap 5 detik. Baik dari ap-southeast-1 (Singapura) maupun ap-southeast-3 (Jakarta), jeda jaringan tidak mengubah pola ini secara berarti — penentunya tetap waktu penyelesaian di sisi solver.
Masalah umum dan perbaikannya
| Masalah | Kemungkinan penyebab | Perbaikan |
|---|---|---|
| Token ditolak di situs Enterprise | enterprise=1 tidak dikirim |
Cek keberadaan enterprise.js, lalu tambahkan parameternya |
| Skor rendah khusus di Enterprise | Nilai action tidak cocok |
Ambil action persis dari pemanggilan grecaptcha.enterprise.execute() |
| Lolos saat pengujian, gagal di produksi | Pembelajaran adaptif menandai pola Anda | Variasikan jeda, hindari trafik seragam |
ERROR_WRONG_GOOGLEKEY |
Sitekey diambil dari data-sitekey |
Cari render=KEY di URL skrip |
CAPCHA_NOT_READY terus berulang |
Task memang belum siap | Pertahankan jeda 5 detik, batasi percobaan ulang |
Pertanyaan Umum
Perlukah saya mengubah kode kalau situs target pindah ke Enterprise?
Hanya satu parameter. Tambahkan "enterprise": 1 pada permintaan ke in.php; pengiriman, polling, dan pemakaian token tetap sama persis. Lebih aman lagi, pakai deteksi otomatis agar perpindahan versi tidak perlu diurus manual.
Bagaimana membedakan reCAPTCHA v3 Enterprise dan v2 di halaman yang sama?
v3 tidak punya kotak centang maupun tantangan gambar, dan sitekey-nya muncul di parameter render=. Kalau Anda menemukan atribut data-sitekey pada sebuah div, itu v2.
Apakah CaptchaAI mendukung reCAPTCHA v3 Enterprise?
Ya, lewat method userrecaptcha dengan parameter enterprise=1. Yang belum didukung adalah hCaptcha dan FunCaptcha (Arkose Labs); GeeTest v4 berstatus segera hadir.
Nilai action apa yang harus dikirim kalau halaman tidak menampilkannya?
Cari string action di JavaScript halaman sebelum menebak. Kalau tidak ditemukan, verify adalah cadangan yang wajar — tetapi di situs Enterprise dengan ambang batas per action, nilai yang salah adalah penyebab skor rendah yang paling sering terlewat.
Panduan terkait
- Perbandingan praktis standar dan Enterprise untuk reCAPTCHA v3
- reCAPTCHA Enterprise vs standar lintas versi — mencakup v2 sekaligus v3
- Tutorial solve reCAPTCHA v3 standar via API
- Tutorial solve reCAPTCHA v3 Enterprise via API
- Cara kerja penilaian risiko reCAPTCHA v3 Enterprise — pembahasan skor lebih dalam