Cloudflare Challenge 页面演示

本页解释 Cloudflare Challenge 如何显示以及验证如何工作。您还可以在示例页面上查看 Cloudflare 伸缩门的工作原理。

Cloudflare Challenge的徽标

在许多情况下,Cloudflare Challenge会妨碍无障碍访问,使用户感到沮丧,限制对公开信息的访问,使应用程序和网站的测试变得困难。使用 Cloudflare Challenge 解算器可自动绕过这些障碍。

如何解决 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();

您可以在 这里 观看完整的演示。