EveryInfra

reCAPTCHA v3(打分式,无交互)

reCAPTCHA v3(打分式,无交互)Google无感打分什么都不用做。页面右下角浮着一个「protected by reCAPTCHA」徽标,除此之外没有勾选框、没有图片题,用户全程无感。徽标位置可以被站点改成 bottomleft 或 inline(嵌进页面里),所以看不到徽标也不代表页面没装 v3。

正在查询可用性…$1.39 / 1K 次按成功计费,失败退款

接口规格

项目
typerecaptcha_v3
必填参数website_urlwebsite_key
可选参数page_actionmin_scoreapi_domaininvisibleenterprise_payload
返回一个 token 字符串solution.gRecaptchaResponse
怎么用这个解填回目标站表单的 `g-recaptcha-response` 字段
价格$1.39 / 1K 次 —— 按成功计费,没解出来退款
厂商文档Google 官方文档

参数去页面哪里取

下面全部是可以直接照做的定位方法 —— DOM 属性名、JS 全局变量名、script 上的 query 参数。

我们要的是 website_url(验证码所在页面的完整 URL,不是首页)、website_key,可选 page_action / api_domain / min_score

website_key(sitekey)——四个位置,任选一个

1. script 标签的 query 参数(最常见、最可靠):
<script src="https://www.google.com/recaptcha/api.js?render=6Lxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"></script>

render= 后面那 40 个字符就是 sitekey。控制台一行取:

document.querySelector('script[src*="recaptcha/api.js"]').src

⚠ 判据也在这里:render 的值是一串 key → v3;值是字面量 explicit 或压根没有 render → 那是 v2,别按 v3 提交。

2. 自动绑定写法时挂在按钮上

<button class="g-recaptcha" data-sitekey="6Lxx…" data-callback="onSubmit" data-action="submit">

data-sitekey 属性。这种写法 data-action 顺带把 action 也给你了。

3. 徽标 iframe 的 URL:找 div.grecaptcha-badge 里那个 iframe,src 形如

https://www.google.com/recaptcha/api2/anchor?ar=1&k=<sitekey>&co=<base64>&hl=en&size=invisible

k= 参数就是 sitekey。(co= 是 base64 编码的来源,例如 aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbTo0NDM. 解出来是 https://www.google.com:443,这个不用传给我们。)

4. 兜底正则document.documentElement.outerHTML.match(/6L[\w-]{38}/g)。sitekey 官方只保证「40 位、大小写敏感」,实践中普遍以 6L 开头。

页面 JS 已跑起来时还可以读内部配置对象 ___grecaptcha_cfg.clients,逐个展开找 sitekey(非官方 API,但在 reCAPTCHA 页面上普遍存在)。

page_action——最容易漏、也最容易错的一个

它是 grecaptcha.execute() 第二个参数对象里的 action 值:

grecaptcha.ready(function () {
  grecaptcha.execute('<sitekey>', {action: 'submit'}).then(function (token) { … });
});

三种找法,从易到难:
- DOM 上直接有:.g-recaptcha 元素的 data-action 属性;

- DevTools 全局搜索(Cmd/Ctrl+Opt+F,搜所有已加载资源)搜 grecaptcha.execute{action,压缩过的 bundle 里字面量通常还在;

- action 是运行时拼出来的变量时,在触发那个动作之前先在 console 打一个探针,然后再点提交,真值会打出来:

const _x = grecaptcha.execute;
grecaptcha.execute = (k, o) => { console.log('sitekey:', k, 'opts:', o); return _x(k, o); };

Google 的硬约束:action 只能含字母、数字、斜杠和下划线,且不区分大小写。官方推荐值也是最常见的字面量:login signup password_reset checkout cart_add cart_view payment_add get_price transaction_confirmed
不要猜。 目标站后端会校验返回的 action 与预期是否一致,Google 官方文档明说不一致意味着「有人在伪造 action」。猜错的后果是 token 在目标站被拒,而我们这边显示成功——所以我们不替你填默认值,你不传就不发。

api_domain

只在页面从备用域加载脚本时才需要。看 script 的 host:www.google.com(默认,不用传)还是 www.recaptcha.net(要传)。后者是 Google 官方提供的备选域,用于规避 google.com 上的其他 Cookie,或 google.com 不可达的地区。

调用示例

一个端点解全部验证码类型 —— 换一种验证码只改 type 这一个字段。

请求
curl -X POST https://api.everyinfra.com/api/v1/captcha \  -H "Authorization: Bearer omg_你的KEY" \  -H "Content-Type: application/json" \  -d '{"type":"recaptcha_v3","website_url":"<website_url>","website_key":"<website_key>"}'
响应
{  "solution": {    "gRecaptchaResponse": "…"  },  "billing": { "charged": true, "credits": 100 }}

怎么确认目标站用的就是它

页面加载后由 grecaptcha.execute() 主动向 Google 打一次请求,把浏览器环境、鼠标轨迹、Cookie(_GRECAPTCHA)和跨页行为打包成一个加密 token;站点后端拿 token 去换一个 0.0–1.0 的分数(1.0 最像真人,0.0 最像机器人),再自己定阈值决定放行还是拦截。Google 官方建议阈值从 0.5 起步再按真实流量调。因为它只出分不出题,所以「过不过」的判断权在目标站手里,不在验证码本身。

容易搞混的

最容易和 reCAPTCHA v2 Invisible 搞混——两者页面上长得一模一样:都只有右下角一个徽标、都不需要用户操作。区分只看 script URL:api.js?render=<40 位 key> 是 v3;api.js(无 render,或 render=explicit)配合页面上存在 .g-recaptcha 元素、或代码里出现 grecaptcha.render(..., {size:'invisible'}),那是 v2 Invisible,要按 recaptcha_v2 + invisible=true 提交。实在分不清就两个都试一次——错的那次会以 422 明确报错,不会扣费。

v3 Enterprise 的区别只有一处:脚本路径是 /recaptcha/api.js 还是 /recaptcha/enterprise.js

hCaptcha 也常被混:后者脚本域名是 hcaptcha.com,表单字段叫 h-captcha-response,不是 g-recaptcha-response

去看 reCAPTCHA v2 那一条 →

常见部署场景

已知的坑

token 两分钟过期(Google 官方明写)。拿到就得马上用,不能提前批量囤着慢慢消费。

action 错了比不传更糟:不传我们直接不发、你立刻知道;传错则 token 生成成功、我们计费成功,最后死在目标站的 action 校验上,排查起来看不出原因。

分数阈值是目标站自己定的,同一个 token 在 A 站够用、在 B 站不够用完全正常。Google 建议 0.5 起步,但站点可以设到 0.7、0.9。我们交付的是 token,不是「一定过」的承诺。

v3 key 超配额时 Google 会 fail open,官方原话是返回静态 0.9 分并附错误信息,而且「v3 站点超配额时没有任何用户可见提示」。也就是说目标站的行为有时候和你的 token 质量无关。

sitekey 40 位、大小写敏感,从压缩过的 HTML 里手抄很容易截断或吃掉大小写。用选择器取,别用眼睛抄。

徽标能被 badge=inline 挪进页面内部甚至视觉上藏起来,「页面上没看到 reCAPTCHA 徽标」不构成「这站没装 v3」

www.recaptcha.net 是官方备用域。页面用了它而你没传 api_domain,token 的来源域对不上。

常见问题

reCAPTCHA v3(打分式,无交互) 要传哪些参数?

必填 website_url、website_key;可选 page_action、min_score、api_domain、invisible、enterprise_payload。请求里 type 传 recaptcha_v3。

解出来的东西怎么用?

返回一个 token 字符串,取 solution.gRecaptchaResponse。填回目标站表单的 g-recaptcha-response 字段

aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbTo0NDM. 要去页面的哪里找?

重点找 aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbTo0NDM.、___grecaptcha_cfg.clients、transaction_confirmed。本页「参数去页面哪里取」一节写了全部位置与取法,含可直接粘进控制台的一行命令。

怎么确认目标站用的就是 reCAPTCHA v3(打分式,无交互)?

最容易和 reCAPTCHA v2 Invisible 搞混——两者页面上长得一模一样:都只有右下角一个徽标、都不需要用户操作。区分只看 script URL:api.js?render=<40 位 key> 是 v3;api.js(无 render,或 render=explicit)配合页面上存在 .g-recaptcha 元素、或代码里出现 grecaptcha.render(..., {size:'invisible'}),那是 v2 Invisible,要按 recaptcha_v2 + invisible=true 提交。实在分不清就两个都试一次——错的那次会以 422 明确报错,不会扣费。

v3 Enterprise 的区别只有一处:脚本路径是 /recaptcha/api.js 还是 /recaptcha/enterprise.js

hCaptcha 也常被混:后者脚本域名是 hcaptcha.com,表单字段叫 h-captcha-response,不是 g-recaptcha-response

有什么容易踩的坑?

token 两分钟过期(Google 官方明写)。拿到就得马上用,不能提前批量囤着慢慢消费。

多少钱一次,失败扣不扣?

$1.39 / 1K 次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。

开始接入

一个端点覆盖全部验证码类型,按成功计费,失败与空结果一律退款。