///
什么是 Cloudflare 验证码以及如何使用 CapMonster Cloud 轻松解决验证码问题
Ekaterina Yanchuk
Ekaterina Yanchuk
技术文章作者
December 17, 2024
5 分钟

什么是 Cloudflare 验证码以及如何使用 CapMonster Cloud 轻松解决验证码问题 

 

Cloudflare验证码在确保各种网站安全方面发挥着重要作用。虽然它对普通用户来说并不麻烦,但在使用脚本时可能会很困难,而这正是它的目的所在。在本文中,我们将探讨解决 Cloudflare 验证码的有效策略,重点介绍 CapMonster 云的功能 - 自动解决各类验证码的领先服务之一。

robots
立即开始自动化您的工作流 reCAPTCHA v2

什么是 Cloudflare 验证码,为什么需要它?

Cloudflare验证码是一种防止自动请求的保护系统,可以防止网站资源被滥用。对于大多数真正的访问者来说,这种验证码不会造成任何不便,因为它不要求执行某些任务 - 验证通常在后台进行(否则,您最多需要做的就是点击带有 "确认您是人类 "字样的窗口) 

当您成功通过 Cloudflare 验证码时:

none provided

如果系统检测到自动请求的迹象,则可能会出现此消息: 

none provided

Cloudflare 提供两种验证码:转门和挑战。

Turnstile 和 Challenge:区别是什么?

Cloudflare转门位于网站本身(例如,可在注册表单下方看到该窗口小部件),Cloudflare Challenge 首先会弹出一个单独的 "稍等 "页面,进行 5 秒钟的检查,如果成功通过,则会打开网站本身。

普通 CF 十字转门的示例:

none provided

调用 CF 挑战赛页面:

none provided

Developer Tools,查看 网络 选项卡并查看特征标志: 

  • 对网站的首次请求返回 403 代码:

none provided

  • id 为 challenge-form 的表单具有一个包含__cf_chl_f_tk=参数的 action 属性(不要误认为是转门验证码参数中的 action):

none provided
  • 页面上有两个类似的<script>标记,可在 window object:
none provided

Cloudflare的验证码干扰了解析过程

解析要求数据检索的效率和连续性,但有时这一过程会因一些障碍而变得复杂,例如 Cloudflare 验证码 。这种检查会导致延误和中断。因此,有必要找到克服这些问题的方法,并调整其解析方法以解决 Cloudflare 验证码问题,同时保持所需的数据准确性和可靠性水平。2;margin-bottom:0pt;margin-top:0pt;" dir="ltr">数据解析的开发人员和从业人员正在探索各种方法,其中值得一提的是实现自动验证码求解的有效工具--CapMonster Cloud。该云服务有助于解决网站上的拦截问题,从而节省了用户的时间并简化了自动化任务。

如何使用 CapMonster Cloud 解决 Cloudflare 验证码

CapMonster Cloud 提供了一个 API,用于解决各种网站上的验证码问题。要使用它,您需要注册,获得 API 密钥,并在您的代码或程序中使用它。虽然 Cloudflare 验证码是一个相当严重的障碍,但如果您正确编写要发送到服务器的任务并接收结果,那么解决它并不困难。2;margin-bottom:0pt;margin-top:0pt;" dir="ltr">以下说明将帮助您避免在使用服务和解决 Cloudflare 验证码时可能出现的错误。

如何查找 Cloudflare 验证码解决方案的参数

要解决验证码问题,您需要在请求中向 Capmonster.云服务器。对于 CF 伸缩门,此类参数是 websiteKey - 验证码密钥,其格式大致如下: 0x4AAAAAAABUYP0XeMJJF0xoy 。您可以在页面代码中找到它,例如在 "网络 "选项卡中: 

none provided

要解决 Cloudflare 挑战,您需要在此基础上传递其他参数(如果您通过浏览器工作,则需要获取验证码令牌): 

  • pageAction
  • data
  • pageData
  • userAgent

所有这些参数都不需要手动搜索,可以在页面加载之前使用 Javascript 代码捕获:

window.turnstile=新代理服务器(window.turnstile, {
       get(target, prop) {
        if (prop === 'render') {
        return function(a, b) {
         let p = {
         type:"无钥匙转门任务"、
         websiteKey: b.sitekey、
           websiteURL:window.location.href、
           data: b.cData、
           pagedata: b.chlPageData、
         action:b.action、
           userAgent: navigator.userAgent
           };

          console.log(JSON.stringify(p));
         window.params = p;
         window.turnstileCallback = b.callback;
          return target.render.apply(this, arguments);
          }
           }
        return target[prop];
        }
      });

接收到的数据将用于创建任务并发送到 Capmonster.云服务器(将介绍解决此类验证码的完整脚本示例 下面).

如果您处理请求并需要 cf_clearance cookie,您还需要指定代理参数和 htmlPageBase64 - base64 编码的 html 页面 "稍等片刻",在访问具有此保护的网站时,该页面的代码为 403。

Sample code to get the htmlPageBase64 string:

var htmlContent = document.documentElement.outerHTML;

var htmlBase64 = btoa(unescape(encodeURIComponent(htmlContent)));

console.log(htmlBase64);

 

为 Cloudflare 解决方案创建任务的所有参数列表和示例查询

  Turnstile:

参数

Type

Required

Values

type

String

yes

TurnstileTaskProxyless

websiteURL

String

yes

验证码解决页面的地址

websiteKey

String

yes

Turnstile Key

pageAction

String

no

操作字段,可在加载验证码的回调函数中找到

请求示例:

https://api.capmonster.cloud/createTask

{
    "clientKey":"dce6bcbb1a728ea8d871de6d169a2057",
    "任务":
    {
        "type": "TurnstileTaskProxyless"、
        "websiteURL": "http://tsmanaged.zlsupport.com"、
        "websiteKey":"0x4AAAAABUYP0XeMJF0xoy"
    }
} 

示例响应: 

{
  "errorId":0、
  "taskId":407533072
} 

挑战(获取令牌):

参数

Type

Required

Value

type

String

yes

TurnstileTaskProxyless

websiteURL

String

yes

验证码解决页面的地址

websiteKey

String

yes

Turnstile Key

cloudflareTaskType

String

yes

token

userAgent

String

yes

浏览器用户代理。

仅传递 Windows 操作系统的当前 UA 。例如,在撰写本报告时,最新版本为 124 版:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36

pageAction

String

yes

可在加载验证码的回调函数中找到的操作字段。如果使用 cloudflareTaskType,则动作通常为 "托管 "或 "非交互"。

data

String

yes

数据字段的值可以从 cData 参数中获取。

pageData

String

yes

pageData 字段的值可以从 chlPageData 参数中获取。

无需转移代理即可接收令牌。

   

请求示例:

https://api.capmonster.cloud/createTask

{
	"clientKey":"dce6bcbb1a728ea8d871de6d169a2057",
	"任务":{
		"类型":"TurnstileTask"、
		"websiteURL":"https://site.com"、
		"websiteKey":"0x4AAAAADnPIDROrmt1Wwj"、
		"cloudflareTaskType":"标记"、
		"userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"、
		"pageAction":"managed"、
		"pageData":"HUHDWUHuhuwfiweh32..uh2uhuhyugYUG="、
		"data":"874291f4retD1366"。
	}
} 

挑战(处理需要 cf_clearance cookie 时的请求):

参数

Type

Required

Value

type

String

yes

TurnstileTask

websiteURL

String

yes

验证码解决页面的地址

websiteKey

String

yes

Turnstile key(您可以传递任何字符串)

cloudflareTaskType

String

no

cf_clearance

htmlPageBase64

String

yes

Base64 编码的 html 页面"稍等" 在访问受此保护的网站时,会给出代码 403。

userAgent

String

yes

浏览器用户代理。

仅传递 Windows 操作系统的当前 UA 。在撰写本文时,这是 124 版本:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36

proxyType

String

yes

http - 常规 http/https 代理

https - 仅当 "http "不起作用时才尝试此选项(某些自定义代理需要)

socks4 - socks4 代理

socks5 - socks5 代理

proxyAddress

String

yes

IPv4/IPv6 代理的 IP 地址。不允许:

- 使用主机名

- 使用透明代理(可以看到客户端 IP)

- 在本地计算机上使用代理

proxyPort

Integer

yes

Proxy port

proxyLogin

String

yes

Proxy 服务器登录

proxyPassword

String

yes

Proxy 服务器密码

Example request:

https://api.capmonster.cloud/createTask

  {
  "clientKey":"dce6bcbb1a728ea8d871de6d169a2057",
  "任务":{
    "type": "TurnstileTask"、
    "websiteURL": "https://nowsecure.nl"、
    "websiteKey": "xxxxxxxxxx"、
    "cloudflareTaskType":"cf_clearance"、
    "htmlPageBase64":"PCFET0NUWVBFIGh0...vYm9keT48L2h0bWw+"、
    "userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0 Safari/537.36"、
    "proxyType": "http"、
    "proxyAddress":"8.8.8.8",
    "代理端口":8080、
    "代理登录": "proxyLoginHere"、
    "代理密码": "proxyPasswordHere"(代理密码在此处)。
  }
} 

Getting the result:

Use the getTaskResult 方法来获取验证码解决方案。

Property

Type

Description

cf_clearance

String

您可以在浏览器中插入特定的 cloudflare cookie

token

String

使用回调函数时使用令牌

在 Node 上使用 Selenium 实施 Cloudflare 挑战赛解决方案的示例。js

// 首先,导入所有必要的附加组件:

const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

(async function example() {

  // 使用 Selenium WebDriver 创建 Chrome 浏览器驱动程序实例

  const options = new chrome.Options();
  options.addArguments('--auto-open-devtools-for-tabs');


  const driver = await new Builder()
    .forBrowser('chrome')
    .setChromeOptions(options)
    .build();

  try {

    // 导航至需要解决 Cloudflare 挑战的页面
   
 await driver.get('https://your_site_with_captcha.com');

    // 执行 JavaScript 以配置代理对象 window.turnstile
    
await driver.executeScript(`)
      window.turnstile = new Proxy(window.turnstile, {
        get(target, prop) {
          if (prop === 'render') {
            return function(a, b) {
              
// 获取 TurnstileTaskProxyless 任务的参数

              let p = {
                type:"TurnstileTaskProxyless"、
                websiteKey: b.sitekey、
                websiteURL: window.location.href、
                data: b.cData、
                pagedata: b.chlPageData、
                action:b.action、
                userAgent: navigator.userAgent
              };

              // 将参数导出到控制台

              console.log(JSON.stringify(p));
              window.params = p;
              window.turnstileCallback = b.callback;
              return target.render.apply(this, arguments);
            }
          }
          返回 target[prop];
        }
      });
    `);

    // 执行 JavaScript,预计 5 秒后终止

    const params = await driver.executeAsyncScript(`)
      const callback = arguments[arguments.length - 1];
      setTimeout(() => {
        callback(window.params);
      }, 5000);
    `);

    // 将获得的参数导出到控制台

    console.log('Params:', params);

    if (params) {

      // 生成用于在 CapMonster 服务中创建任务的数据

      const data = {
        clientKey: 'your_API'、
        task: {
          type: 'TurnstileTaskProxyless'、
          websiteURL: params.websiteURL、
          websiteKey: params.websiteKey、
          data:params.data、
          action: params.action、
          cloudflareTaskType:"token"、
          pageAction:"managed"、
          pageData: params.pagedata
        }
      };

      // 将创建任务的数据导出到控制台

      console.log('Data:', data);

      // 发送请求在 CapMonster.cloud 中创建任务

      const createResult = await fetch('https://api.capmonster.cloud/createTask', {
        method: 'post'、
        body:JSON.stringify(data)
      });

      // 获取任务创建结果

      const createTaskResult = await createResult.json();
      console.log('Create Task Result:', createTaskResult);

      if (createTaskResult.taskId) {
        const asyncDelay = (timeout) =>;
          new Promise(resolve => {
              setTimeout(() => {
                  resolve();
              }, timeout);
          });
        
        // 用于获取待完成任务结果的函数

        const getTaskResult = async (taskId) => {
          const taskResult = await fetch('https://api.capmonster.cloud/getTaskResult', {
            method: 'post'、
            body:JSON.stringify({
              "clientKey": "your_API"、
              "taskId": taskId
            })
          });
          const taskResponse = await taskResult.json();
          console.log('Task Response:', taskResponse);
          if (taskResponse.status === 'processing') {
            await asyncDelay(5000);
            return await getTaskResult(taskId);
          }
          return taskResponse;
        };
       
        // 从 CapMonster.cloud 服务获取任务执行结果

        const taskRes = await getTaskResult(createTaskResult.taskId);
        console.log('Task Result:', taskRes);

        if (taskRes.solution) {

          // 在控制台中导出解决方案标记

          console.log('Solution Token:', taskRes.solution.token);

          // 创建一个回调函数来传递解决方案令牌

          await driver.executeScript(`
            window.turnstileCallback('${taskRes.solution.token}');
          `);
        }
      }
    }
  } finally {
    await driver.quit();
  }
})();

解决 Cloudflare 挑战的替代脚本

有时由于某些原因无法立即捕获参数,在这种情况下,您可以尝试添加重新加载验证码页面,直到参数被检索到: 

const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

(async function example() {
  const options = new chrome.Options();
  options.addArguments('--auto-open-devtools-for-tabs');

  const driver = await new Builder()
    .forBrowser('chrome')
    .setChromeOptions(options)
    .build();

  让 params = null;

  try {
    while (!params) {
      await driver.get('https://your_site_with_captcha.com/');

      await driver.executeScript(`)
        window.turnstile = new Proxy(window.turnstile, {
          get(target, prop) {
            if (prop === 'render') {
              return function(a, b) {
                让 p = {
                  类型"TurnstileTaskProxyless"、
                  websiteKey: b.sitekey、
                  websiteURL: window.location.href、
                  data: b.cData、
                  pagedata: b.chlPageData、
                  action:b.action、
                  userAgent: navigator.userAgent
                };

                console.log(JSON.stringify(p));
                window.params = p;
                window.turnstileCallback = b.callback;
                return target.render.apply(this, arguments);
              }
            }
            返回 target[prop];
          }
        });
      `);

      params = await driver.executeAsyncScript(`)
        const callback = arguments[arguments.length - 1];
        setTimeout(() => {
          callback(window.params);
        }, 5000);
      `);
      
      如果 (!params) {
        console.log('Params not obtained, reloading page...');
        await driver.sleep(3000);
      }
    }

    console.log('Params:', params);

    const data = {
      clientKey: 'your_API_key'、
      任务:{
        type: 'TurnstileTaskProxyless'、
        websiteURL: params.websiteURL、
        websiteKey: params.websiteKey、
        data:params.data、
        action: params.action、
        cloudflareTaskType:"token"、
        pageAction:"managed"、
        pageData: params.pagedata
      }
    };

    console.log('Data:', data);

    const createResult = await fetch('https://api.capmonster.cloud/createTask', {
      method: 'post'、
      body:JSON.stringify(data)
    });

    const createTaskResult = await createResult.json();
    console.log('Create Task Result:', createTaskResult);

    if (createTaskResult.taskId) {
      const asyncDelay = (timeout) =>;
        new Promise(resolve => {
            setTimeout(() => {
                resolve();
            }, timeout);
        });
      
      const getTaskResult = async (taskId) => {
        const taskResult = await fetch('https://api.capmonster.cloud/getTaskResult', {
          method: 'post'、
          body:JSON.stringify({
            "clientKey": "your_API_key"、
            "taskId": taskId
          })
        });
        const taskResponse = await taskResult.json();
        console.log('Task Response:', taskResponse);
        if (taskResponse.status === 'processing') {
          await asyncDelay(5000);
          return await getTaskResult(taskId);
        }
        return taskResponse;
      };
     
      const taskRes = await getTaskResult(createTaskResult.taskId);
      console.log('Task Result:', taskRes);

      if (taskRes.solution) {
        console.log('Solution Token:', taskRes.solution.token);
        await driver.executeScript(`
          window.turnstileCallback('${taskRes.solution.token}');
        `);
      }
    }

  } finally {
    await driver.quit();
  }
})();

结论

由 Cloudflare 开发的验证码是一项复杂而强大的技术,可保护网站免受各种类型的恶意活动,包括垃圾邮件、DDoS 攻击和其他形式的自动攻击。但是,对于某些任务,可能有必要解决这一保护问题,例如在自动化流程或与其他应用程序集成时。

CapMonster Cloud 服务为此类情况提供了解决方案,让您可以轻松解决验证码问题。为此,您需要熟悉 生成验证码请求,将其发送到服务服务器并接收结果 。 

 

Note:我们在此提醒您,该产品用于在您自己的网站和您拥有合法访问权限的网站上自动进行测试。

ItGuy
geear
面向软件开发者的联盟计划
通过用户识别验证码的消费获取高达 30% 的返佣。
✅ 请求已发送
感谢您对我们的合作伙伴计划感兴趣!我们将在 7 个工作日内与您联系。
请求加入
填写表格以提交申请加入合作伙伴计划。
更多文章