当用户单击按钮或提交表单时,会触发不可见的 reCAPTCHA — 没有复选框。质询在后台发生,只有在验证令牌后页面才会继续。通过 CaptchaAI 解决该问题与标准 v2 类似,但增加了一个关键点:您必须在 API 请求中传递 invisible=1。
集成中最大的区别是如何注入令牌。大多数不可见实现使用回调函数而不是隐藏的 g-recaptcha-response 字段。您需要找到并调用该回调。
不确定它是隐形的还是标准的 v2? 阅读reCAPTCHA v2 与 Invisible 的解释获取检测提示。
你需要什么
| 要求 | 细节 |
|---|---|
| CaptchaAI API 密钥 | captchaai.com/api.php |
| 站点密钥 | 来自小部件或按钮上的 data-sitekey |
| 页面网址 | 运行不可见验证码的完整 URL |
| 浏览器工具 | Selenium/Puppeteer 执行回调 |
第 1 步:检测不可见的 reCAPTCHA
在 HTML 页面中查找这些模式:
<!-- Option 1: div with data-size="invisible" -->
<div class="g-recaptcha" data-sitekey="6LdKlZEU..." data-size="invisible" data-callback="onSubmit"></div>
<!-- Option 2: button with data-sitekey (invisible by default) -->
<button data-sitekey="6LdKlZEU..." data-callback="onSubmit">Submit</button>
<!-- Option 3: programmatic execution -->
<script>
grecaptcha.execute('6LdKlZEU...', {action: 'submit'});
</script>
如果您看到 data-size="invisible"、带有 data-sitekey 的按钮或没有容器的 grecaptcha.execute(),则它是不可见的 reCAPTCHA。
第二步:提交至CaptchaAI
import requests
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "6LdKlZEUAAAAAPoxm...",
"pageurl": "https://example.com/signup",
"invisible": 1,
"json": 1
})
task_id = response.json()["request"]
const params = new URLSearchParams({
key: "YOUR_API_KEY", method: "userrecaptcha",
googlekey: "6LdKlZEUAAAAAPoxm...",
pageurl: "https://example.com/signup",
invisible: 1, json: 1,
});
const res = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
const { request: taskId } = await res.json();
第三步:投票结果
import time
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Error: {result['request']}")
步骤4:通过回调注入token
这是关键的一步。不可见的 reCAPTCHA 需要一个 回调函数,而不仅仅是一个隐藏字段值:
# Selenium example
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com/signup")
# Find the callback name
callback = driver.execute_script("""
var el = document.querySelector('[data-callback]');
if (el) return el.getAttribute('data-callback');
var btn = document.querySelector('[data-sitekey]');
if (btn) return btn.getAttribute('data-callback');
return null;
""")
# Execute the callback with the token
if callback:
driver.execute_script(f"window['{callback}']('{token}');")
else:
# Fallback: fill hidden field and submit
driver.execute_script(f"""
document.getElementById('g-recaptcha-response').innerHTML = '{token}';
document.querySelector('form').submit();
""")
// Puppeteer example
await page.evaluate((token) => {
const el = document.querySelector('[data-callback]') || document.querySelector('[data-sitekey]');
const callbackName = el?.getAttribute('data-callback');
if (callbackName && window[callbackName]) {
window[callbackName](token);
} else {
document.getElementById('g-recaptcha-response').innerHTML = token;
document.querySelector('form').submit();
}
}, token);
工作功能齐全
import requests
import time
def solve_invisible_recaptcha(api_key, sitekey, page_url):
submit = requests.get("https://ocr.captchaai.com/in.php", params={
"key": api_key, "method": "userrecaptcha", "googlekey": sitekey,
"pageurl": page_url, "invisible": 1, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result.get('request')}")
raise TimeoutError("Timed out")
token = solve_invisible_recaptcha("YOUR_API_KEY", "6LdKlZEU...", "https://example.com/signup")
完整的可运行示例
需要一个包含环境设置、轮询、重试和错误处理的完整工作项目吗?
常问问题
我如何知道 reCAPTCHA 是否不可见?
在小部件 div 上查找 data-size="invisible" 或带有 data-sitekey 的按钮。如果没有可见的复选框,则它可能是不可见的。
对于不可见的 reCAPTCHA,我是否需要无形=1?
是的。如果没有它,CaptchaAI 会将任务视为标准 v2,并且令牌可能会被拒绝。
如果找不到回调函数怎么办?
尝试填写 g-recaptcha-response 隐藏字段并提交表单。一些不可见的实现会退回到此方法。如果失败,请在页面 JavaScript 中搜索处理 reCAPTCHA 响应的函数。
隐形 reCAPTCHA 可以成为企业吗?
是的。将 invisible=1 和 enterprise=1 添加到您的请求中。
为什么回调执行后页面没有响应?
回调名称可能是错误的,或者页面可能需要额外的表单字段。验证确切的回调名称并确保在回调触发之前填写所有必需的表单字段。
开始解决隐形 reCAPTCHA
获取您的 API 密钥:captchaai.com/api.php。将 invisible=1 添加到您的 v2 求解代码中并使用上面的回调注入模式。
相关指南
- reCAPTCHA Invisible 的工作原理
- 常见 reCAPTCHA Invisible 错误
- reCAPTCHA v2 与 Invisible 的解释
- 如何使用API解决reCAPTCHA v2回调