通过 CaptchaAI 进行的每个 reCAPTCHA 解决都需要正确的站点密钥和页面 URL。某些验证码类型还需要额外的参数 - 操作 (v3)、data-s(Google 站点)或企业标志。本指南涵盖了每种提取方法。
按 reCAPTCHA 版本列出的参数
| 范围 | v2 标准 | v2 隐形 | v3 | 企业 |
|---|---|---|---|---|
googlekey(站点密钥) |
必需的 | 必需的 | 必需的 | 必需的 |
pageurl |
必需的 | 必需的 | 必需的 | 必需的 |
invisible |
—— | 1 |
—— | —— |
action |
—— | —— | 必需的 | 有时 |
data-s |
有时 | 有时 | —— | —— |
enterprise |
—— | —— | —— | 1 |
方法一:HTML属性提取
来自 data-sitekey 属性
import re
import requests
url = "https://staging.example.com/qa-login"
html = requests.get(url).text
# Find data-sitekey
match = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', html)
if match:
sitekey = match.group(1)
print(f"Sitekey: {sitekey}")
# Check if invisible
invisible_match = re.search(r'data-size=["\']invisible["\']', html)
is_invisible = bool(invisible_match)
print(f"Invisible: {is_invisible}")
# Find callback
callback_match = re.search(r'data-callback=["\'](\w+)["\']', html)
callback = callback_match.group(1) if callback_match else None
print(f"Callback: {callback}")
# Check for data-s (Google-owned sites)
data_s_match = re.search(r'data-s=["\']([^"\']+)["\']', html)
data_s = data_s_match.group(1) if data_s_match else None
print(f"data-s: {data_s}")
JavaScript(Puppeteer)
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });
const params = await page.evaluate(() => {
const widget = document.querySelector('.g-recaptcha');
if (!widget) return null;
return {
sitekey: widget.getAttribute('data-sitekey'),
size: widget.getAttribute('data-size'),
callback: widget.getAttribute('data-callback'),
dataS: widget.getAttribute('data-s'),
invisible: widget.getAttribute('data-size') === 'invisible',
};
});
console.log(params);
方法二:脚本标签提取
reCAPTCHA v3 和企业站点密钥
v3 sitekeys 嵌入在脚本 URL 中:
# Find sitekey from script src
v3_match = re.search(
r'recaptcha/(?:api|enterprise)\.js\?.*?render=([A-Za-z0-9_-]+)',
html
)
if v3_match:
sitekey = v3_match.group(1)
print(f"v3 Sitekey: {sitekey}")
# Check enterprise
is_enterprise = 'enterprise.js' in html
print(f"Enterprise: {is_enterprise}")
查找动作参数
该操作在 JavaScript 代码中传递,而不是在 HTML 属性中传递:
# Search for grecaptcha.execute calls
action_match = re.search(
r'grecaptcha\.execute\s*\([^,]+,\s*\{[^}]*action\s*:\s*["\']([^"\']+)',
html
)
if action_match:
action = action_match.group(1)
print(f"Action: {action}")
方法三:iframe src提取
当 reCAPTCHA 在 iframe 内呈现时:
# Find reCAPTCHA iframe
iframe_match = re.search(
r'<iframe[^>]+src=["\']([^"\']*recaptcha/api2/anchor[^"\']*)["\']',
html
)
if iframe_match:
iframe_src = iframe_match.group(1)
sitekey_match = re.search(r'k=([A-Za-z0-9_-]+)', iframe_src)
if sitekey_match:
sitekey = sitekey_match.group(1)
print(f"Iframe sitekey: {sitekey}")
方法四:JavaScript渲染提取
对于使用 grecaptcha.render() 动态呈现 reCAPTCHA 的页面:
# Find grecaptcha.render calls
render_match = re.search(
r'grecaptcha\.render\s*\([^,]*,\s*\{([^}]+)\}',
html
)
if render_match:
config = render_match.group(1)
sk = re.search(r'sitekey\s*:\s*["\']([A-Za-z0-9_-]+)', config)
cb = re.search(r'callback\s*:\s*["\']?(\w+)', config)
sz = re.search(r'size\s*:\s*["\'](\w+)', config)
print(f"Sitekey: {sk.group(1) if sk else 'not found'}")
print(f"Callback: {cb.group(1) if cb else 'not found'}")
print(f"Size: {sz.group(1) if sz else 'not found'}")
完整的提取功能
import re
import requests
def extract_recaptcha_params(url):
html = requests.get(url, timeout=15).text
params = {"pageurl": url}
# Sitekey from data-sitekey
sk = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)', html)
if sk:
params["sitekey"] = sk.group(1)
# Sitekey from script render parameter (v3)
if "sitekey" not in params:
v3 = re.search(r'render=([A-Za-z0-9_-]{20,})', html)
if v3:
params["sitekey"] = v3.group(1)
# Sitekey from iframe
if "sitekey" not in params:
iframe = re.search(r'recaptcha.*?k=([A-Za-z0-9_-]+)', html)
if iframe:
params["sitekey"] = iframe.group(1)
# Sitekey from grecaptcha.render
if "sitekey" not in params:
render = re.search(r'sitekey\s*:\s*["\']([A-Za-z0-9_-]+)', html)
if render:
params["sitekey"] = render.group(1)
# Version detection
if re.search(r'data-size=["\']invisible', html):
params["invisible"] = True
if 'enterprise.js' in html:
params["enterprise"] = True
# Action (v3)
action = re.search(
r'action\s*:\s*["\']([^"\']+)',
html[html.find('grecaptcha.execute'):] if 'grecaptcha.execute' in html else ''
)
if action:
params["action"] = action.group(1)
# data-s
ds = re.search(r'data-s=["\']([^"\']+)', html)
if ds:
params["data_s"] = ds.group(1)
# Callback
cb = re.search(r'data-callback=["\'](\w+)', html)
if cb:
params["callback"] = cb.group(1)
return params
# Usage
params = extract_recaptcha_params("https://staging.example.com/qa-login")
for k, v in params.items():
print(f" {k}: {v}")
预期输出:
pageurl: https://staging.example.com/qa-login
sitekey: 6Le-SITEKEY-abc123
invisible: True
callback: onCaptchaComplete
将提取的参数提交给CaptchaAI
data = {
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": params["sitekey"],
"pageurl": params["pageurl"],
"json": "1",
}
if params.get("invisible"):
data["invisible"] = "1"
if params.get("enterprise"):
data["enterprise"] = "1"
if params.get("action"):
data["action"] = params["action"]
if params.get("data_s"):
data["data-s"] = params["data_s"]
resp = requests.post("https://ocr.captchaai.com/in.php", data=data).json()
故障排除
| 问题 | 原因 | 处理方式 |
|---|---|---|
| 未找到站点密钥 | 页面采用动态渲染 | 使用 Puppeteer/Selenium 代替静态 HTML |
| 错误的站点密钥 | 多个 reCAPTCHA 实例 | 检查哪个小部件映射到您提交的表单 |
| 未找到操作 | 在外部 JS 文件中定义 | 获取并搜索链接的 JavaScript 文件 |
data-s 根据请求进行更改 |
谷歌重新生成了它 | 为每个解决方案提取新鲜的 data-s |
常问问题
我可以在不加载浏览器页面的情况下提取参数吗?
是的,对于大多数网站来说,站点密钥位于 HTML 源代码中。但是 JavaScript 呈现的验证码需要浏览器或无头浏览器。
sitekey 与 API 密钥相同吗?
不。sitekey 是分配给网站的公钥。它可以安全地共享并且在页面源代码中可见。
使用 CaptchaAI 提取的参数进行可靠求解
获取您的 API 密钥:验证码网站。
相关指南
- 浏览器控制台验证码检测
- reCAPTCHA v2 回调机制
- reCAPTCHA v2 不可见:触发检测