查找 reCAPTCHA 参数
创建 reCAPTCHA 任务需要 websiteURL(出现验证码的网页地址)和 websiteKey(网站密钥),v3 还需要 pageAction。用 Selenium 之类的工具模拟提交时,还要知道回调函数。这些都能在浏览器的开发者工具(F12)里找到。
最快的办法:自动查找脚本
Section titled “最快的办法:自动查找脚本”打开出现验证码的网页,按 F12 打开控制台(Console),粘贴并运行:
// 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,等验证码出现后再运行。
websiteKey 和 websiteURL
Section titled “websiteKey 和 websiteURL”在 Network 面板里搜索 anchor,找到类似这样的请求:
https://www.google.com/recaptcha/api2/anchor?ar=1&k=6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9&co=...&hl=en&size=normalk=后面的值就是websiteKey。websiteURL填出现验证码的那个网页的完整地址(这个请求的Referer一般就是它)。
也可以在页面源码里搜 data-sitekey。
pageAction(v3)
Section titled “pageAction(v3)”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。