So Sánh

So sánh reCAPTCHA v3 Enterprise và Standard

Câu trả lời ngắn cho người đang viết script: về phía tích hợp, Enterprise chỉ khác Standard đúng một tham số — thêm enterprise=1 khi gửi task cho CaptchaAI. Mọi thứ còn lại (method=userrecaptcha, version=v3, googlekey, action, pageurl) giữ nguyên.

Khác biệt thật sự nằm ở phía chủ website: Enterprise cho họ reason code, ngưỡng riêng theo action và các tính năng chống gian lận. Bạn không thấy chúng trong response, nhưng chúng quyết định token của bạn được chấp nhận hay bị từ chối. Bài này đi theo thứ tự bạn gặp trong thực tế: nhận biết phiên bản, giải, hiểu vì sao điểm thấp, rồi xử lý lỗi.


Nhận biết trang đang dùng bản nào

Cả hai bản đều chạy ẩn, không widget, không ô tick — nhìn bằng mắt không phân biệt được. Dấu hiệu nằm trong HTML:

  • Standard v3 nạp api.js?render=KEY và gọi grecaptcha.execute().
  • Enterprise v3 nạp enterprise.js?render=KEY và gọi grecaptcha.enterprise.execute().

Sitekey của v3 nằm trong tham số render= của URL script, không phải data-sitekey như v2 — nguyên nhân phổ biến nhất của lỗi ERROR_WRONG_GOOGLEKEY. Đoạn Python dưới đây bóc cả ba thứ bạn cần trong một lần request.

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}

Cùng logic đó viết bằng Node.js cho pipeline scraping chạy trên axios.

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],
  };
}

Đừng hard-code kết quả nhận diện: một trang có thể chuyển sang Enterprise bất kỳ lúc nào mà không đổi giao diện, nên hãy để bước kiểm tra này chạy trong mỗi phiên.


Giải v3 qua API CaptchaAI

Luồng giống mọi loại CAPTCHA khác trên CaptchaAI: gửi task tới in.php, nhận ID task, polling res.php, rồi đặt token vào biểu mẫu.

Với Standard v3, request tối thiểu chỉ cần googlekey, actionpageurl.

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

Bản Enterprise dùng đúng đoạn code trên, chỉ thêm dòng enterprise: 1. Không có endpoint riêng, cũng không có method riêng.

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

Trong dự án thật, gộp nhận diện và giải vào một 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")

Token trả về là chuỗi g-recaptcha-response thông thường, dùng được cho cả hai bản.


Bảng đối chiếu tính năng

Bảng dưới là những gì Google cung cấp cho chủ website; phần ảnh hưởng tới script của bạn nằm ở hai dòng cuối.

Tính năng Standard v3 Enterprise v3
Hoạt động ẩn
Điểm (0,0–1,0)
Tham số action Bắt buộc Bắt buộc
Reason code Không
Ngưỡng riêng cho từng action Không Có (qua Cloud Console)
Phát hiện rò rỉ mật khẩu Không
Account Defender Không
Nhãn chống gian lận Không
Tích hợp xác thực đa yếu tố Không
Endpoint xác minh siteverify (miễn phí) recaptchaenterprise.googleapis.com
Hạn mức hàng tháng 1 triệu lượt đánh giá miễn phí Trả tiền theo lượt đánh giá
File JS api.js?render=KEY enterprise.js?render=KEY
Tham số CaptchaAI version=v3 version=v3 + enterprise=1

Lưu ý về chi phí: dòng "hạn mức" là giá Google thu của chủ website, không liên quan tới hóa đơn của bạn. CaptchaAI tính tiền theo thread (luồng giải đồng thời) — BASIC ($15/tháng, 5 thread), STANDARD ($30/tháng, 15 thread), ADVANCE ($90/tháng, 50 thread) — với số lượt giải không giới hạn trong tháng và không có phụ phí cho biến thể Enterprise.


Vì sao điểm chênh lệch giữa hai bản

Standard v3 chấm điểm bằng một mô hình toàn cầu duy nhất của Google; Enterprise chồng thêm vài lớp lên trên.

Khía cạnh chấm điểm Standard Enterprise
Mô hình nền Mô hình toàn cầu của Google Mô hình toàn cầu + tín hiệu riêng của site
Ngưỡng Một ngưỡng dùng chung Ngưỡng riêng theo action (login=0,7, checkout=0,9)
Học thích ứng Cơ bản Học từ chính lưu lượng của site đó
Độ mịn của điểm 0,0–1,0 (hai chữ số thập phân) Cùng thang, nhiều tín hiệu hơn
Xử lý dương tính giả Chỉnh ngưỡng thủ công Dựa trên phân tích reason code

Hệ quả thực tế: cùng một token, site Standard có thể cho qua nhưng site Enterprise lại chặn vì action đó đặt ngưỡng cao hơn. Tham số action vì thế phải khớp chính xác chuỗi trong lời gọi grecaptcha.enterprise.execute() — sai action là sai ngưỡng.

Ví dụ: nhóm QA thương mại điện tử tại TP.HCM

Một team QA của công ty outsourcing chạy kiểm thử hồi quy hằng đêm trên hai môi trường staging: cổng đăng nhập dùng v3 Standard, còn luồng thanh toán vừa được nâng lên Enterprise sau đợt rà soát bảo mật.

Sau khi nâng cấp, các case checkout fail hàng loạt trong khi case đăng nhập vẫn xanh. Nguyên nhân không nằm ở CaptchaAI: script vẫn gửi action=login cho cả hai luồng, còn bên checkout ngưỡng đặt ở 0,9 và gắn với action checkout. Cách sửa là đọc action trực tiếp từ HTML mỗi lần chạy và thêm enterprise=1 cho luồng thanh toán. Với vài nghìn lượt kiểm thử mỗi đêm, gói ADVANCE ($90/tháng, 50 thread) đủ để chạy song song.

Nếu đội bạn lưu log các lượt giải để đối soát nội bộ, hãy giữ nguyên tắc tối thiểu hóa dữ liệu — cùng tinh thần với Nghị định 13/2023/NĐ-CP về bảo vệ dữ liệu cá nhân.


Đọc reason code của Enterprise

Response Enterprise gửi về backend của website kèm reason code giải thích vì sao điểm được chấm như vậy. Biết chúng nghĩa là gì giúp bạn đoán vấn đề khi token bị từ chối.

Ý nghĩa Liên quan gì tới automation
AUTOMATION Phát hiện hành vi tự động Dùng cấu hình trình duyệt kiểm thử sát thực tế
UNEXPECTED_ENVIRONMENT Môi trường trình duyệt bất thường Kiểm tra xem chế độ headless có bị nhận diện không
TOO_MUCH_TRAFFIC Lượng request quá lớn từ một nguồn Áp giới hạn tần suất request (rate limit), giãn đều tải
UNEXPECTED_USAGE_PATTERNS Mẫu tương tác bất thường Thêm độ trễ hợp lý giữa các thao tác
LOW_CONFIDENCE_SCORE Không đủ dữ liệu để chấm điểm chắc chắn Gửi thêm tín hiệu hành vi trước khi gọi execute
SUSPECTED_CARDING Mẫu gian lận thẻ tín dụng Hầu như không gặp trong QA
SUSPECTED_CHARGEBACK Mẫu gian lận bồi hoàn Hầu như không gặp trong QA

Lưu ý: Bạn không nhận được các mã này khi giải qua CaptchaAI — chúng đi thẳng về backend của website ở bước xác minh token. Nắm được ý nghĩa của chúng giúp bạn trao đổi nhanh hơn với đội vận hành site.


Xử lý sự cố thường gặp

Vấn đề Nguyên nhân thường gặp Cách xử lý
Token bị từ chối trên site Enterprise Thiếu enterprise=1 Kiểm tra enterprise.js trong HTML rồi thêm cờ
Điểm thấp bất thường trên Enterprise Sai tham số action Lấy đúng chuỗi action từ lời gọi grecaptcha.enterprise.execute()
Chạy được lúc test, hỏng khi lên production Ngưỡng theo action ở production chặt hơn staging Đối chiếu action và ngưỡng của từng luồng, giãn nhịp gửi request
ERROR_WRONG_GOOGLEKEY Lấy nhầm data-sitekey của v2 Tìm render=KEY trong URL của script v3
CAPCHA_NOT_READY lặp lại quá lâu Polling quá gấp hoặc timeout quá ngắn Giữ nhịp 5 giây mỗi lần và cho vòng lặp chạy tối đa vài phút

Câu hỏi thường gặp

Giải v3 Enterprise có tốn thêm tiền so với v3 thường không?

Không. CaptchaAI tính theo thread chứ không theo lượt giải, và không có phụ phí cho biến thể Enterprise. Bạn chọn gói theo mức song song cần thiết, ví dụ BASIC ($15/tháng, 5 thread) cho script cá nhân.

Quên enterprise=1 trên site Enterprise thì chuyện gì xảy ra?

Task vẫn được nhận và bạn vẫn có token, nhưng token đó thường bị backend từ chối ở bước xác minh. Triệu chứng dễ nhận: in.phpres.php đều trả về OK|, còn biểu mẫu báo lỗi xác thực.

Nên chạy bước nhận diện mỗi lần hay cache lại kết quả?

Chạy mỗi phiên. Site có thể chuyển sang Enterprise mà giao diện không đổi, nên cache cứng phiên bản là lỗi âm thầm: task vẫn gửi bình thường, chỉ token bị từ chối.

CaptchaAI có giải được hCaptcha hay FunCaptcha nếu site đổi sang loại khác không?

Không — hCaptcha và FunCaptcha (Arkose Labs) hiện không được hỗ trợ, GeeTest v4 mới ở trạng thái sắp ra mắt. Các loại đang hỗ trợ gồm reCAPTCHA v2/v3 (kể cả Enterprise), Cloudflare Turnstile và Challenge, GeeTest v3, CAPTCHA ảnh/OCR, grid và BLS; CaptchaFox, Friendly Captcha, Lemin ở giai đoạn beta.

Điểm tụt sau khi site nâng cấp lên Enterprise, nên bắt đầu từ đâu?

Bắt đầu từ action và ngưỡng, đừng vội đổ lỗi cho chất lượng token. Enterprise có thể đặt ngưỡng cao cho những luồng nhạy cảm như thanh toán. Xác nhận script gửi đúng action, sau đó rà lại nhịp gửi request.


Bài liên quan

Os comentários estão desativados para este artigo.