Comparisons

reCAPTCHA v3 Standard vs Enterprise — Panduan Solve

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.


Panduan terkait

Komentar dinonaktifkan untuk artikel ini.