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=KEYvà gọigrecaptcha.execute(). - Enterprise v3 nạp
enterprise.js?render=KEYvà gọigrecaptcha.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, action và pageurl.
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 | Có | Có |
| Điểm (0,0–1,0) | Có | Có |
| Tham số action | Bắt buộc | Bắt buộc |
| Reason code | Không | Có |
| 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 | Có |
| Account Defender | Không | Có |
| Nhãn chống gian lận | Không | Có |
| Tích hợp xác thực đa yếu tố | Không | Có |
| 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.
| Mã | Ý 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.php và res.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
- Hướng dẫn giải reCAPTCHA v3: Standard và Enterprise - góc thực hành khác
- reCAPTCHA Enterprise và Standard: đối chiếu đầy đủ - cả v2 lẫn v3
- Cách giải reCAPTCHA v3 bằng API - bản v3 thường
- Cách giải reCAPTCHA v3 Enterprise bằng API - bản Enterprise
-
Cơ chế chấm điểm rủi ro của reCAPTCHA v3 Enterprise - phân tích sâu
- Cơ chế chấm điểm rủi ro của reCAPTCHA v3 Enterprise
- Cách giải reCAPTCHA v3 Enterprise bằng API
- Hướng dẫn giải reCAPTCHA v3: Standard và Enterprise