在许多情况下,Cloudflare Challenge会妨碍无障碍访问,使用户感到沮丧,限制对公开信息的访问,使应用程序和网站的测试变得困难。使用 Cloudflare Challenge 解算器可自动绕过这些障碍。
Cloudflare Challenge 页面演示
本页解释 Cloudflare Challenge 如何显示以及验证如何工作。您还可以在示例页面上查看 Cloudflare 伸缩门的工作原理。
如何解决 Cloudflare Challenge 问题页面
您应该拦截 turnstile.render
调用并获取以下值:
cData
chlPageData
action
此外,您还需要拦截回调定义,并使用从我们的 API 返回的 userAgent
。
要截取所需的参数,可以在加载旋转门部件之前在页面上注入以下 JavaScript。
// inject.js
console.clear = () => console.log('Console was cleared');
const i = setInterval(() => {
if (window.turnstile) {
clearInterval(i);
window.turnstile.render = (a, b) => {
let params = {
sitekey: b.sitekey,
pageurl: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
json: 1,
};
// we will intercept the message in puppeeter
console.log('intercepted-params:' + JSON.stringify(params));
window.cfCallback = b.callback;
return;
};
}
}, 50);
另一种方法是拦截对 api.js
脚本的请求,然后用自己的脚本替换它,返回参数并使回调在全局范围内可用。
最后,当你收到解决方案时:
- 执行回调,将令牌作为其参数
Puppeteer 代码示例
import { launch } from 'puppeteer';
import { Solver } from '@2captcha/captcha-solver';
import { readFileSync } from 'fs';
const solver = new Solver('APIKEY');
const example = async () => {
const browser = await launch({
headless: false,
devtools: true,
});
const [page] = await browser.pages();
const preloadFile = readFileSync('./inject.js', 'utf8');
await page.evaluateOnNewDocument(preloadFile);
// Here we intercept the console messages to catch the message logged by inject.js script
page.on('console', async (msg) => {
const txt = msg.text();
if (txt.includes('intercepted-params:')) {
const params = JSON.parse(txt.replace('intercepted-params:', ''));
console.log(params);
try {
console.log(`Solving the captcha...`);
const res = await solver.cloudflareTurnstile(params);
console.log(`Solved the captcha ${res.id}`);
console.log(res);
await page.evaluate((token) => {
cfCallback(token);
}, res.data);
} catch (e) {
console.log(e.err);
return process.exit();
}
} else {
return;
}
});
page.goto('https://2captcha.cn/demo/cloudflare-turnstile-challenge');
};
example();
您可以在 这里 观看完整的演示。