Token Anda kembali normal dari solver, tetapi form di situs target tetap menolaknya? Pada reCAPTCHA v2, penyebab paling sering bukan kualitas solve, melainkan satu parameter yang terlewat: enterprise=1. Standard v2 dan Enterprise v2 memakai kotak centang "Saya bukan robot" dan grid gambar 3×3 atau 4×4 yang sama persis, sehingga Anda tidak punya petunjuk visual apa pun untuk membedakannya.
Perbedaannya ada di backend Google — kode alasan, aturan kustom, dan pengelolaan lewat Google Cloud — dan satu-satunya jejaknya di halaman adalah file JavaScript yang dimuat. Karena itu urutan kerja yang benar dimulai dari halaman target, bukan dari kode solver: baca dulu script tag-nya, baru tentukan parameter request ke CaptchaAI.
Ringkasan perbedaan dalam empat poin
- Tampilan widget dan mekanisme tantangan: identik pada kedua versi.
- Penanda versi:
api.jsuntuk Standard v2,enterprise.jsuntuk Enterprise v2. - Perubahan di sisi integrasi Anda: hanya satu parameter,
enterprise=1. - Bentuk token dan cara menyisipkannya ke halaman: sama untuk keduanya.
Cara mengetahui halaman memakai Enterprise v2
Penanda paling andal adalah file JavaScript yang dimuat halaman. Buka source HTML dan cari tag script reCAPTCHA:
<!-- Standard v2 -->
<script src="https://www.google.com/recaptcha/api.js"></script>
<!-- Enterprise v2 -->
<script src="https://www.google.com/recaptcha/enterprise.js"></script>
Untuk pipeline yang berjalan otomatis, jadikan deteksi ini langkah pertama sebelum task dikirim. Versi Python-nya memakai BeautifulSoup dan sekaligus mengambil sitekey:
import requests
from bs4 import BeautifulSoup
def detect_recaptcha_version(url):
resp = requests.get(url)
soup = BeautifulSoup(resp.text, "html.parser")
enterprise_script = soup.find("script", src=lambda s: s and "enterprise.js" in s)
standard_script = soup.find("script", src=lambda s: s and "recaptcha/api.js" in s)
widget = soup.find(class_="g-recaptcha")
sitekey = widget["data-sitekey"] if widget else None
if enterprise_script:
return {"version": "enterprise_v2", "sitekey": sitekey}
elif standard_script:
return {"version": "standard_v2", "sitekey": sitekey}
return None
info = detect_recaptcha_version("https://staging.example.com/qa-login")
print(info)
Logika yang sama di Node.js dengan Axios dan Cheerio:
const axios = require("axios");
const cheerio = require("cheerio");
async function detectRecaptchaVersion(url) {
const { data } = await axios.get(url);
const $ = cheerio.load(data);
const hasEnterprise = $('script[src*="enterprise.js"]').length > 0;
const hasStandard = $('script[src*="recaptcha/api.js"]').length > 0;
const sitekey = $(".g-recaptcha").attr("data-sitekey");
if (hasEnterprise) return { version: "enterprise_v2", sitekey };
if (hasStandard) return { version: "standard_v2", sitekey };
return null;
}
Untuk memeriksa satu halaman secara manual, tempel potongan kode berikut di DevTools:
// Quick check in DevTools
if (document.querySelector('script[src*="enterprise.js"]')) {
console.log("Enterprise v2");
} else if (document.querySelector('script[src*="recaptcha/api.js"]')) {
console.log("Standard v2");
}
Tabel perbedaan Standard v2 dan Enterprise v2
| Aspek | Standard v2 | Enterprise v2 |
|---|---|---|
| Widget kotak centang | Ya — tampilan identik | Ya — tampilan identik |
| Tantangan gambar | Grid 3×3 atau 4×4 | Grid 3×3 atau 4×4 |
| File JS | api.js |
enterprise.js |
| Fungsi eksekusi | grecaptcha.execute() |
grecaptcha.enterprise.execute() |
| API verifikasi | siteverify (gratis) |
recaptchaenterprise.googleapis.com (berbayar) |
| Kode alasan | Tidak ada | Ada (AUTOMATION, TOO_MUCH_TRAFFIC, dll.) |
| Aturan kustom | Tidak ada | Ada (ambang batas per action) |
| Google Cloud Console | Tidak dipakai | Dipakai (pengelolaan berbasis project) |
| Deteksi kebocoran password | Tidak ada | Ada |
| Format token | Struktur sama | Struktur sama |
| Parameter CaptchaAI | — | enterprise=1 |
| Waktu penyelesaian umum | 10–30 detik | 10–30 detik |
Perhatikan baris terakhir: karena tantangan yang dikerjakan sama, waktu penyelesaian kedua versi berada di rentang yang sama. Enterprise tidak membuat tantangan lebih berat bagi solver, hanya lebih kaya datanya bagi pemilik situs.
Empat kesalahan yang paling sering terjadi
| Kesalahan | Akibatnya | Perbaikan |
|---|---|---|
Mengirim enterprise=1 ke situs Standard v2 |
Token yang dikembalikan bisa tidak valid | Pastikan enterprise.js ada sebelum menambahkan parameter |
Lupa enterprise=1 di situs Enterprise v2 |
Token berpotensi ditolak backend situs | Selalu tambahkan enterprise=1 saat enterprise.js terdeteksi |
| Salah mengambil sitekey | Muncul ERROR_WRONG_GOOGLEKEY |
Ambil dari atribut data-sitekey pada elemen .g-recaptcha |
| Menyamakan v2 Enterprise dengan v3 Enterprise | Parameter solve keliru | v2 punya kotak centang; v3 tidak terlihat dan berbasis skor |
Tiga dari empat kesalahan di atas berasal dari asumsi, bukan dari kode yang keliru — jadi tetapkan versi secara hardcode hanya bila Anda memang mengendalikan halaman targetnya.
Menyelesaikan kedua versi lewat API CaptchaAI
Alurnya sama untuk Standard maupun Enterprise, dan hanya terdiri dari empat langkah:
- Kirim task ke
in.phpbesertagooglekeydanpageurl. - Simpan task ID dari respons.
- Lakukan polling ke
res.phpsampai statusnya bukanCAPCHA_NOT_READY. - Sisipkan token ke halaman sebelum form dikirim.
Standard v2: request dasar
Kirim task ke in.php, simpan task ID, lalu polling ke res.php sampai token siap.
import requests
import time
# Submit task
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# Poll for token
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
Enterprise v2: tambahkan satu parameter
Bandingkan dengan blok sebelumnya — method, endpoint, dan loop polling tidak berubah sama sekali:
import requests
import time
# Submit task — only difference is enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"enterprise": 1 # Required for Enterprise
})
task_id = resp.text.split("|")[1]
# Polling is identical
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
Satu solver yang menentukan versinya sendiri
Untuk pekerjaan yang menangani banyak domain klien sekaligus, gabungkan deteksi dan solve dalam satu class agar tidak ada konfigurasi manual per situs:
import requests
import time
from bs4 import BeautifulSoup
class RecaptchaV2Solver:
def __init__(self, api_key):
self.api_key = api_key
def detect_and_solve(self, page_url, page_html=None):
if not page_html:
page_html = requests.get(page_url).text
soup = BeautifulSoup(page_html, "html.parser")
is_enterprise = bool(soup.find("script", src=lambda s: s and "enterprise.js" in s))
widget = soup.find(class_="g-recaptcha")
sitekey = widget["data-sitekey"] if widget else None
if not sitekey:
raise Exception("No reCAPTCHA sitekey found on page")
params = {
"key": self.api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"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 {
"token": result.text.split("|")[1],
"is_enterprise": is_enterprise,
"sitekey": sitekey
}
if result.text != "CAPCHA_NOT_READY":
raise Exception(f"Solve failed: {result.text}")
raise Exception("Solve timed out")
solver = RecaptchaV2Solver("YOUR_API_KEY")
result = solver.detect_and_solve("https://staging.example.com/qa-login")
print(f"Enterprise: {result['is_enterprise']}, Token: {result['token'][:40]}...")
Loop di atas melakukan polling tiap 5 detik hingga 60 kali, jadi batas waktunya sekitar lima menit — cukup longgar untuk koneksi yang tidak stabil.
Menyisipkan token ke halaman
Langkah terakhir ini identik untuk kedua versi: token masuk ke field g-recaptcha-response, dan jika widget punya data-callback, panggil callback itu agar form tahu verifikasi sudah selesai.
# Selenium injection — works for both standard and enterprise
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# If the page uses a callback function
callback = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-callback")
if callback:
driver.execute_script(f'{callback}("{token}");')
// Puppeteer injection — works for both
await page.evaluate((token) => {
document.getElementById("g-recaptcha-response").value = token;
// Find and call callback if present
const widget = document.querySelector(".g-recaptcha");
const cb = widget?.getAttribute("data-callback");
if (cb && typeof window[cb] === "function") {
window[cb](token);
}
}, token);
Biaya dan kapasitas dari sudut pandang tim kecil
Di komunitas otomasi Indonesia, pekerjaan scraping dan QA form sering ditagih per proyek — agensi price-monitoring, freelancer di Upwork atau Fastwork, dan tim data startup. Pertanyaan pertama biasanya bukan teknis, tetapi biaya: apakah menghadapi situs Enterprise membuat tagihan naik?
Tidak. CaptchaAI menagih berdasarkan jumlah thread — CAPTCHA yang diproses bersamaan — bukan per solve, dan tidak ada biaya tambahan berdasarkan tipe CAPTCHA di dalam satu paket. Yang menentukan pilihan paket adalah puncak concurrency, bukan total volume harian. Satu worker yang memeriksa 40 halaman login staging milik klien dari region AWS ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta) hampir tidak pernah menjalankan 40 solve pada detik yang sama. Paket BASIC ($15 per bulan, 5 thread) sudah menutupi satu pipeline kecil, sedangkan ADVANCE ($90 per bulan, 50 thread) memberi ruang untuk beberapa job paralel. Daftar paket terbaru ada di halaman harga CaptchaAI.
Satu catatan kepatuhan yang relevan di sini: UU Pelindungan Data Pribadi (UU 27/2022) membuat prinsip "hanya proses data yang memang boleh Anda akses" bukan sekadar soal etika. Jaga pengujian tetap berada di halaman staging milik sendiri atau milik klien yang memberi izin tertulis.
Pertanyaan yang sering muncul
Apakah format sitekey Enterprise berbeda dari Standard?
Tidak. Keduanya berupa string yang sama-sama diambil dari atribut data-sitekey, dan panjang maupun bentuknya tidak menunjukkan versi apa pun. Jangan menebak versi dari sitekey — periksa script tag-nya.
Apa bedanya v2 Enterprise dan v3 Enterprise?
Keduanya produk Enterprise, tetapi jenis tantangannya berbeda. v2 Enterprise menampilkan kotak centang dan grid gambar; v3 Enterprise berjalan tanpa interaksi dan mengembalikan skor. Parameter solve-nya pun berbeda, jadi pastikan Anda tahu versi mana yang dipakai halaman sebelum mengirim task.
Berapa lama waktu penyelesaian reCAPTCHA v2 Enterprise?
Umumnya 10–30 detik, sama seperti Standard v2, dengan batas layanan <60 detik untuk kedua versi. Interval polling 5 detik seperti pada contoh sudah memadai; memperkecil interval tidak mempercepat hasil dan hanya menambah request ke res.php.
Apakah solve Enterprise dikenai biaya lebih tinggi?
Tidak ada biaya tambahan berdasarkan tipe CAPTCHA di dalam satu paket, karena penagihan mengikuti jumlah thread. Yang perlu Anda rencanakan adalah kapasitas concurrency, bukan selisih harga antarversi reCAPTCHA.
Bisakah versi dideteksi tanpa menjalankan browser?
Bisa, selama widget sudah ada di HTML awal — satu request HTTP dan parser HTML seperti contoh Python di atas sudah cukup. Anda baru memerlukan Selenium atau Puppeteer bila widget dirender oleh JavaScript setelah halaman selesai dimuat.
Panduan terkait
- Perbandingan lengkap reCAPTCHA Enterprise dan Standard — pembahasan lintas semua versi
- Cara menyelesaikan reCAPTCHA v2 lewat API — tutorial untuk versi standard
- Cara menyelesaikan reCAPTCHA v2 Enterprise lewat API — langkah lengkap versi Enterprise
- Cara mengenali implementasi reCAPTCHA Enterprise — pendalaman soal deteksi