如何使ChromeDriver不被检测到

22

这是我的第一个Stack Overflow问题,请耐心等待。

我阅读了这篇 SO问题,从而想知道是否可能使chromedriver完全无法被检测到?

出于好奇心,我测试了所描述的方法,并发现它未能成功地创建完全匿名的浏览器。

我阅读了驱动程序的文档,发现了以下内容:

partial interface Navigator { readonly attribute boolean webdriver; };

Navigator接口的webdriver IDL属性必须返回webdriver-active标志的值,该标志最初为false。

此属性允许网站确定用户代理是否由WebDriver控制,并可用于帮助缓解拒绝服务攻击。

然而,我甚至无法在浏览器控制台或源代码中找到这些标记的位置。

我想象这是检测chromedriver的原因,但在查看源代码后,我无法找到此接口。 因此,这使我想知道当前的chromedriver是否包含此功能。 如果没有,我仍然知道当前的chromedriver可以被网站和其他服务(如distill)检测到。


1
你到底想做什么?创建一个“匿名”的用户代理还是让ChromeDriver像“普通”的Chrome浏览器一样运行?而你实际遇到了什么问题? - Mick Mnemonic
根据定义,chromedriver是一个“常规”的Chrome浏览器。它利用JSON Wireframe协议向“真实”的Chrome浏览器发送消息。然而,有趣的是,它肯定可以被检测到作为Selenium webdriver。我想清除浏览器中的这种检测,以创建服务器认为是真正的真实浏览器。这样,我就可以自定义我的当前浏览器,以满足我的精确喜好,而不必担心网站认为我试图执行DDOS攻击,并因此限制我访问他们的网站。 - bryce
<以 clippy 的声音> 我想你正在尝试发起 DDOS 攻击。让我来帮助你!-- 实际上,网站使用的检测机制远比检测 Selenium 更加复杂。 - MK.
2个回答

34
为了使用ChromeDriver不被Distil检查点检测到(这在stackoverflow帖子中有很好的描述),你需要确保你的浏览器在它的窗口或文档原型中不包含任何变量,以显示你正在使用一个webdriver,就像你提到的那个。
你可以使用Selenium软件和ChromeDriver以及Chrome,只要你采取一些预防措施并对二进制文件进行一些修复。这种方法仅适用于有头版本,如果你想使用无头版本,你需要采取额外的措施来通过窗口/渲染测试,在这里描述

1. 修复Chrome二进制文件,或使用旧版本

首先,让我们处理那个设置为True的navigator.webdriver。这是由W3C协议在此处定义的,作为浏览器的'NavigatorAutomationInformation'的一部分,该协议扩展了Navigator接口。如何删除它?该项目有很多文件、第三方东西、闪烁的Web运行时等。因此,与其试图弄清楚这是如何工作的而变得疯狂,不如聪明地搜索谷歌,找到包含这个提交的链接在此处。注意这些文件:

  • third_party/WebKit/Source/core/frame/Navigator.h, which holds the line of code:

     `bool webdriver() const { return true; }` 
    
    This method is supossed to always return true, as you can see.
    
  • third_party/WebKit/Source/core/frame/Navigator.idl, which contains the extensions of Navigators, included our

    `Navigator implements NavigatorAutomationInformation;` 
    
    which is being commited. Interesting, isn't it?
    
  • third_party/WebKit/Source/core/frame/NavigatorAutomationInformation.idl contains the extension itself, with a read-only variable, which is webdriver:

         `[
             NoInterfaceObject, // Always used on target of 'implements'
             Exposed=(Window),
             RuntimeEnabled=AutomationControlled
         ] interface NavigatorAutomationInformation {
             readonly attribute boolean webdriver;
         };`
    
要取消这个功能,只需要在Navigator.idl中注释掉扩展Navigator的代码行,并编译源代码(在Linux下编译)。然而,这对于几乎任何计算机来说都是一项繁琐的任务,可能需要数小时。如果你查看提交的日期,它是在2017年10月,因此一个选项是下载该日期之前发布的任何Chrome版本。要搜索镜像,请在Google上搜索inurl:/deb/pool/main/g/google-chrome-stable/

2. 修复ChromeDriver

Distil检查正则表达式规则“/\$[a-z]dc_/”与窗口变量匹配,而ChromeDriver添加了一个符合该条件的变量,如此处所述。正如他们所提到的那样,您需要在源代码中编辑call_function.js并重新定义变量var key = '$cdc_asdjflasutopfhvcZLmcfl_';。为其他内容。另外,可能更容易的方法是使用十六进制编辑器更新现有二进制文件。

如果您决定使用旧版Chrome - 我猜您已经这样做了 - 您将需要使用适当版本的ChromeDriver。您可以在ChromeDriver下载网页上了解适合您Chrome版本的驱动程序。例如,对于适合您需求的Chrome v61,您可以使用ChromeDriver 2.34。完成后,只需将ChromeDriver二进制文件放在“/usr/bin/local”上即可。


3. 采取其他预防措施

  • 注意你的用户代理。
  • 不要执行过多的重复请求。
  • 在请求之间使用(随机)延迟。
  • 使用这里使用的Chrome参数模拟正常用户配置文件。

对于Chrome无头浏览器用户需要采取的额外措施 - 您从itoli链接https://intoli.com/blog/making-chrome-headless-undetectable/分享的内容 - 它们似乎是编写为通过使用代理来工作,使用mitmproxy Python模块。是否有一种方法可以在不使用该模块或代理的情况下应用那些注入JavaScript设置? - Coolio2654
提醒一下,对于任何想要这样做的人来说:Chromium不再使用WebKit,而是使用“blink”。你要找的文件现在在third_party/blink/renderer/core/frame中。 - zeusalmighty

2
你不能直接使用Selenium的WebDriver更改UserAgent,这似乎是你真正想做的事情。
但这并不意味着不能更改。
请看这个答案。你可以使用它将Selenium伪装成其他浏览器或任何其他东西。当然,如果一个网站决定找出你的真实身份,Selenium留下的很多线索(如精准点击)就会暴露你的身份。

你好,感谢您的回复。如果您打开一个chromedriver和普通的chrome浏览器并进行比较,您会发现浏览器头部看起来完全相同。(除非我做错了。我使用http://www.whoishostingthis.com/tools/user-agent/进行了检查)。 - bryce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接