sitekey 明明复制对了,CaptchaAI 还是返回 ERROR_WRONG_GOOGLEKEY?多数是三个原因:提错了、页面其实是 Enterprise、或 sitekey 动态加载。按下表定位,对号修复。
报错原因与处理方式速查
| 原因 | 怎么判断 | 处理方式 |
|---|---|---|
| sitekey 提取错了 | 与页面源码不一致 | 用方法一 / 二核对 |
| Enterprise 按标准方式提交 | 加载 recaptcha/enterprise.js |
加 enterprise=1 |
| 隐形 reCAPTCHA 用错参数 | 无勾选框,含 grecaptcha.execute( |
加 invisible=1 |
| sitekey 已轮换 | 两次抓取结果不一样 | 每次提交前重新提取 |
| 抓到 iframe / 别页面的 key | 来源域名不一致 | 从主页面提取 |
| 提取结果是空的 | 页面 JS 渲染 sitekey | 换浏览器渲染方案 |
| 硬编码了旧 sitekey | 之前能用,现在失效 | 改成每次现取 |
提取并校验 sitekey
先拿到正确 sitekey,再校验格式——三步做完能排除大半 ERROR_WRONG_GOOGLEKEY。
方法一:抓页面源码
import re
import requests
def extract_sitekey(page_url):
"""Extract reCAPTCHA sitekey from page source."""
resp = requests.get(page_url, timeout=15)
html = resp.text
# Pattern 1: data-sitekey attribute
match = re.search(r'data-sitekey="([^"]+)"', html)
if match:
return match.group(1)
# Pattern 2: grecaptcha.render call
match = re.search(r"grecaptcha\.render\([^,]+,\s*\{[^}]*sitekey['\"]?\s*:\s*['\"]([^'\"]+)", html)
if match:
return match.group(1)
# Pattern 3: grecaptcha.execute call
match = re.search(r"grecaptcha\.execute\(['\"]([^'\"]+)", html)
if match:
return match.group(1)
# Pattern 4: reCAPTCHA script src
match = re.search(r"recaptcha/api\.js\?render=([^&\"]+)", html)
if match:
return match.group(1)
return None
sitekey = extract_sitekey("https://staging.example.com/qa-login")
print(f"Sitekey: {sitekey}")
适合静态页面;国内网络访问 Google 资源偶尔超时,先排查网络再排查逻辑。
方法二:浏览器手动查找
抓不到源码,或想肉眼核对时用这条路:
| 途径 | 操作步骤 |
|---|---|
| 元素面板 | F12 → Elements(元素)→ Ctrl+F 搜 sitekey → 复制 data-sitekey 属性值 |
| Network 面板 | F12 → Network(网络)→ 过滤 recaptcha → 找 google.com/recaptcha/api2/anchor 请求 → k= 即 sitekey |
方法三:提交前校验格式
先校验格式再调 API,拦住"提错未发现"的情况:
import re
def validate_sitekey(sitekey):
"""Validate sitekey format before API call."""
if not sitekey:
raise ValueError("Sitekey is empty")
# Standard format: 40 alphanumeric + hyphens/underscores
if not re.match(r'^[a-zA-Z0-9_-]{20,60}$', sitekey):
raise ValueError(f"Invalid sitekey format: {sitekey}")
return True
# Use before solving
sitekey = extract_sitekey("https://staging.example.com/qa-login")
validate_sitekey(sitekey)
特殊 reCAPTCHA 变体:Enterprise 与隐形(invisible)
reCAPTCHA Enterprise
Enterprise sitekey 跟标准版长得一样,肉眼分辨不出来,提交时必须多加 enterprise 字段:
import requests
# Standard reCAPTCHA — loads via recaptcha/api.js
# Enterprise reCAPTCHA — loads via recaptcha/enterprise.js
def detect_enterprise(page_url):
"""Detect if page uses reCAPTCHA Enterprise."""
resp = requests.get(page_url, timeout=15)
return "recaptcha/enterprise.js" in resp.text
# Submit with enterprise flag
is_enterprise = detect_enterprise("https://example.com")
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://example.com",
"json": 1,
}
if is_enterprise:
data["enterprise"] = 1
resp = requests.post("https://ocr.captchaai.com/in.php", data=data)
看脚本路径是 recaptcha/enterprise.js 还是 recaptcha/api.js,不用猜。
隐形 reCAPTCHA(invisible)
隐形 reCAPTCHA 没有勾选框,很多人第一次直接按标准参数提交,结果同样报 ERROR_WRONG_GOOGLEKEY:
def detect_invisible(html):
"""Detect invisible reCAPTCHA."""
indicators = [
'data-size="invisible"',
"grecaptcha.execute(",
"recaptcha/api.js?render=",
]
return any(i in html for i in indicators)
# Submit with invisible flag
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://example.com",
"invisible": 1,
"json": 1,
}
sitekey 由 JavaScript 动态加载时怎么办
有些页面的 sitekey 由脚本运行时插入,requests 抓源码拿不到值,要换成能跑 JavaScript 的浏览器方案:
from selenium import webdriver
from selenium.webdriver.common.by import By
def extract_dynamic_sitekey(url):
"""Extract sitekey from JavaScript-rendered page."""
driver = webdriver.Chrome()
driver.get(url)
# Wait for reCAPTCHA to load
import time
time.sleep(3)
# Try data-sitekey attribute
elements = driver.find_elements(By.CSS_SELECTOR, "[data-sitekey]")
if elements:
sitekey = elements[0].get_attribute("data-sitekey")
driver.quit()
return sitekey
# Try iframe src parameter
iframes = driver.find_elements(By.CSS_SELECTOR, "iframe[src*='recaptcha']")
for iframe in iframes:
src = iframe.get_attribute("src")
import re
match = re.search(r'[?&]k=([^&]+)', src)
if match:
driver.quit()
return match.group(1)
driver.quit()
return None
跨境电商注册页尤其常见——sitekey 由框架异步渲染,换成上面这段脚本就能解决。
常见问题
ERROR_WRONG_GOOGLEKEY 和 ERROR_INVALID_SITE_KEY 是同一个错误吗?
指向同一类问题——googlekey 无效或和目标页面不匹配,处理思路一致:重新提取、核对 Enterprise / invisible 参数、排查 iframe。
页面上同时出现多个 sitekey,该提交哪一个?
先确认有几个 reCAPTCHA 组件(登录、注册往往各挂一个),再用元素面板核对 data-sitekey,别凭位置猜。
sitekey 需要缓存吗,多久重新提取一次?
可以短期缓存,几分钟到几小时。部分站点会轮换 sitekey,解题开始失败就先重新提取再重试。
用 requests 抓不到 sitekey,是正则写错了吗?
先排除页面是不是 JavaScript 动态渲染——这是最常见的原因,直接看源码,没有 sitekey 字样就换上文的浏览器渲染方案。
相关指南
拿到正确的 sitekey 之后——用 CaptchaAI 提交识别。