跳转到内容

查找 reCAPTCHA 参数

创建 reCAPTCHA 任务需要 websiteURL(出现验证码的网页地址)和 websiteKey(网站密钥),v3 还需要 pageAction。用 Selenium 之类的工具模拟提交时,还要知道回调函数。这些都能在浏览器的开发者工具(F12)里找到。

打开出现验证码的网页,按 F12 打开控制台(Console),粘贴并运行:

find-recaptcha-clients.js
// Paste into the browser DevTools console on a page with reCAPTCHA, then run findRecaptchaClients().
// Lists every reCAPTCHA on the page: version (V2/V3), sitekey, page URL and the callback function.
function findRecaptchaClients() {
if (typeof ___grecaptcha_cfg === 'undefined') return [];
return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' };
const objects = Object.entries(client).filter(([, value]) => value && typeof value === 'object');
objects.forEach(([toplevelKey, toplevel]) => {
const found = Object.entries(toplevel).find(
([, value]) => value && typeof value === 'object' && 'sitekey' in value && 'size' in value,
);
if (toplevel instanceof HTMLElement && toplevel.tagName === 'DIV') data.pageurl = toplevel.baseURI;
if (found) {
const [sublevelKey, sublevel] = found;
data.sitekey = sublevel.sitekey;
const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
const callback = sublevel[callbackKey];
if (!callback) {
data.callback = null;
data.function = null;
} else {
data.function = callback;
const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('');
data.callback = `___grecaptcha_cfg.clients${keys}`;
}
}
});
return data;
});
}
findRecaptchaClients();

返回结果里,sitekey 就是 websiteKey,pageurl 就是 websiteURL,version 是 v2 还是 v3,function 和 callback 是回调函数:

[
{
"id": "0",
"version": "V2",
"sitekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"function": "onSuccess",
"callback": "___grecaptcha_cfg.clients['0']['l']['l']['callback']",
"pageurl": "https://www.google.com/recaptcha/api2/demo"
}
]

返回空数组说明页面还没加载 reCAPTCHA,等验证码出现后再运行。

在 Network 面板里搜索 anchor,找到类似这样的请求:

https://www.google.com/recaptcha/api2/anchor?ar=1&k=6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9&co=...&hl=en&size=normal
  • k= 后面的值就是 websiteKey。
  • websiteURL 填出现验证码的那个网页的完整地址(这个请求的 Referer 一般就是它)。

也可以在页面源码里搜 data-sitekey。

pageAction 是网页调用 grecaptcha.execute(网站密钥, {action: '...'}) 时传的 action,必须和网页的一致。

方法一:搜索源码。 在开发者工具的 Sources 面板里右键“Search in all files”,普通 v3 搜 .execute(,企业版 v3 搜 .enterprise.execute,看后面的 action:

grecaptcha.ready(function () {
grecaptcha.execute('6LdpS-gUAAAAAL3Qr2yP7rkrQjkKBVvEY_48JS5l', { action: 'login' }).then(function (token) {
// ...
});
});

这里 pageAction 是 login。

方法二:断点。 代码被混淆、搜不到时,在控制台运行 debug(grecaptcha.execute)(企业版 debug(grecaptcha.enterprise.execute)),然后在网页上进行会触发验证的操作(例如点登录)。断点停下后,在右侧 Scope 里看 action 的值。

一个网站可能在不同步骤用不同的 action(例如注册时先 signup/submit_email 再 signup/success),要取你要通过的那一步的值。按 F8 继续执行,可以看到下一个 action。

用 Selenium 等工具在浏览器里填 token 时,填完要调用网页的回调函数,告诉网页验证已完成:

  • 在 Elements 面板搜索 data-callback,它的值就是回调函数名,例如 data-callback="onSuccess"。
  • 或者搜索 grecaptcha.render,看参数里的 callback。
  • 或者在控制台查看 ___grecaptcha_cfg.clients,或用上面的自动查找脚本。

调用方法:

driver.execute_script("onSuccess(arguments[0])", g_recaptcha_response)

有的网页没有回调函数,把 token 填进 g-recaptcha-response 文本框后直接提交表单即可。完整流程见 用 token 完成 reCAPTCHA。