两个版本都以隐形方式运行并返回风险评分(0.0 到 1.0)。 Enterprise 添加了原因代码、自适应阈值和 Google Cloud 项目管理 - 但从 CaptchaAI 求解的角度来看,唯一的参数差异是 enterprise=1。挑战在于检测网站使用哪个版本,因为两者都是不可见的。
特性比较
| 特征 | 标准v3 | 企业版3 |
|---|---|---|
| 隐形操作 | 是的 | 是的 |
| 分数(0.0–1.0) | 是的 | 是的 |
| 动作参数 | 必需的 | 必需的 |
| JS文件 | api.js?render=KEY |
enterprise.js?render=KEY |
| 执行函数 | grecaptcha.execute() |
grecaptcha.enterprise.execute() |
| 原因代码 | 不 | 是(自动化、TOO_MUCH_TRAFFIC 等) |
| 每个操作的自定义阈值 | 不 | 是(通过 Cloud Console) |
| 密码泄露检测 | 不 | 是的 |
| 账户卫士 | 不 | 是的 |
| 验证端点 | siteverify(免费) |
recaptchaenterprise.googleapis.com(付费) |
| CaptchaAI 参数 | version=v3 |
version=v3 + enterprise=1 |
| 典型求解时间 | 10-20秒 | 10-20秒 |
如何检测网站使用的版本
由于这两个版本都是不可见的(没有可见的小部件),因此检测必须依赖于 JavaScript:
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)
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,
};
}
浏览器控制台快速检查:
// 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);
}
使用 CaptchaAI 解决
标准v3
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
企业版3
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
具有自动检测功能的通用求解器
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]}...")
常见错误
| 错误 | 结果 | 处理方式 |
|---|---|---|
在标准 v3 上使用 enterprise=1 |
令牌可能无效 | 添加标志之前检查 enterprise.js |
在 Enterprise v3 上省略 enterprise=1 |
令牌被后端拒绝 | 当 enterprise.js 存在时始终添加 |
action参数错误 |
分数低,令牌被拒绝 | 从页面 JavaScript 中提取准确的操作字符串 |
省略version=v3 |
求解器将其视为 v2 | 对于基于分数的 reCAPTCHA,始终包含 version=v3 |
| 使用 v2 sitekey 进行 v3 解决 | ERROR_WRONG_GOOGLEKEY |
v3 sitekeys 来自 render=KEY 参数 |
提取动作参数
action 参数对于 v3 至关重要 - 无论是标准版还是企业版。如果您发送了错误的操作,分数将会很低并且令牌可能会被拒绝。
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"
token 提交
两个版本的方法相同:
# 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",
}));
常问问题
Enterprise v3 是否给出不同的分数?
评分模型类似,但企业可能会使用其他信号和自定义阈值。 CaptchaAI 对两者的处理方式相同——无论 Google 使用哪种模型,返回的令牌都有效。
如何在页面上检测 Enterprise v3?
在脚本标记中查找 enterprise.js 而不是 api.js,在 JavaScript 中查找 grecaptcha.enterprise.execute()。两者都是不可见的,因此没有视觉差异。
Enterprise v3 的解决成本是否更高?
查看 CaptchaAI 的当前定价。企业解决方案的定价可能不同,但 API 集成工作与标准相同。
如果找不到操作参数怎么办?
尝试常用值:"verify"、"submit"、"homepage"、"login"。如果令牌仍然被拒绝,请使用浏览器 DevTools 在页面脚本中搜索 execute( 并找到确切的操作字符串。
站点可以在标准站点和企业站点之间切换吗?恕不另行通知?
是的。站点可以随时迁移到 Enterprise。构建您的检测以在每个页面加载时运行,而不是对版本进行硬编码。
相关指南
- reCAPTCHA v3 Enterprise 与标准— 替代比较角度
- reCAPTCHA 企业版与标准版 — 实用指南— 涵盖所有版本
- 如何使用API解决reCAPTCHA v3— 标准 v3 教程
- 如何使用API解决reCAPTCHA v3 Enterprise— 企业版 v3 教程
- reCAPTCHA v3 操作参数解释— 动作参数深入探讨
常问问题
使用错误的企业标志会导致失败吗?
经常是的。使用 Enterprise 的站点根据 Enterprise API 验证令牌,该 API 需要 Enterprise 令牌。标准令牌可能无法验证,反之亦然。
如何以编程方式检测 Enterprise v3?
搜索enterprise.js的页面源码:
page_source = driver.page_source
is_enterprise = "enterprise.js" in page_source
有性能差异吗?
不会。两个版本的解决时间和成功率相似。