Bootstrap

如何绕过 cloudflare reCAPTCHA 人机检测

我们在使用Selenium Puppeteer playwright chromedriver等自动化框架驱动chromium内核浏览器跑自动化任务时,如果目标网站部署了cloudflare reCAPTCHA 等人机验证系统,就会被人机验证拦下来。

最简单的人机检测是通过webdriver来检测,绕过很容易,我们不再赘述。

而cloudflare reCAPTCHA等一线厂商,通过获取 js runtime 中的信息提取,能够精准定位浏览器是否存在 cdp 连接,笔者亲身实践:绕过这项检测难度非常大,但经过不懈尝试,笔者最终成功绕过上述一线厂商的检测:

1.借用UC(Undetected-chromedriver)能力:

 Cloudflare和很多其他网站一样会检测访问是否为Selenium bot,其中一项为检测Selenium运行时出现的特有js变量。
 
# 这里主要包括了是否含有"selenium"/ "webdriver"的变量或者含有"$cdc_"/"$wdc_"的文件变量。
 
# 每个driver的检测机制会不一样,此处给出的方案基于chromedriver。
 
# 1. Undetected-chromedriver
# 非常简单好用的包,直接pip安装,如下初始化driver即可,之后就像正常Selenium使用即可。
 
import undetected_chromedriver as uc
driver = uc.Chrome()
driver.get('https://nowsecure.nl')
# 2. 直接修改chromedriver executable
# 将key变量修改成任意不含"cdc"的字符。
 
/**
 * Returns the global object cache for the page.
 * @param {Document=} opt_doc The document whose cache to retrieve. Defaults to
 *     the current document.
 * @return {!Cache} The page's object cache.
 */
function getPageCache(opt_doc, opt_w3c) {
  var doc = opt_doc || document;
  var w3c = opt_w3c || false;
  // |key| is a long random string, unlikely to conflict with anything else.
  var key = '$cdc_asdjflasutopfhvcZLmcfl_';
  if (w3c) {
    if (!(key in doc))
      doc[key] = new CacheWithUUID();
    return doc[key];
  } else {
    if (!(key in doc))
      doc[key] = new Cache();
    return doc[key];
  }
}
# 这两种本质上没有太大的区别,undetected-chromedriver本质上是给chromedriver启动时打上了一个补丁,完成了修改key的那一步
def patch_exe(self):
    """
    Patches the ChromeDriver binary
    :return: False on failure, binary name on success
    """
    logger.info("patching driver executable %s" % self.executable_path)
 
    linect = 0
    replacement = self.gen_random_cdc() #此处修改了cdc的名称
    with io.open(self.executable_path, "r+b") as fh:
        for line in iter(lambda: fh.readline(), b""):
            if b"cdc_" in line:
                fh.seek(-len(line), 1)
                newline = re.sub(b"cdc_.{22}", replacement, line)
                fh.write(newline)
                linect += 1
        return linect

2、使用具有该能力的指纹浏览器:

现实是上面的技术方案不好用,甚至不可用,而商业化的产品简单易用。笔者亲自验证  易指 ads具有该能力,猜想它们应该是过滤了js runtime 泄露的cdp信息。

下图是我用python + playwright + 易指顺利穿过cloudeflare视频。

playwright绕过cloudflare人机验证

;