如何使铬驱动器无法检测到

2022-09-02 03:32:11

这是我的第一个堆栈溢出问题,所以请耐心等待。

我已经阅读了这个SO问题,这使我想知道,是否有可能使chromedriver完全无法检测到?

出于我自己的好奇心,我测试了所描述的方法,发现它在创建一个完全匿名的浏览器时并不成功。

我通读了驱动程序的文档,发现了这个:

partial interface Navigator { readonly attribute boolean webdriver; };

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

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

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

我想这是负责检测chromedriver的,但是,在梳理源代码后,我找不到这个接口。因此,它让我想知道此功能是否包含在当前的chromedriver中。如果没有,我仍然知道当前的chromedriver可以通过网站和其他服务(如蒸馏)检测到。


答案 1

为了使用ChromeDriver无法检测到Distil检查点(在此stackoverflow文章中进行了很好的描述),您需要确保您的浏览器在其窗口或文档原型中不包含任何变量,这些变量显示您正在使用Webdriver,就像您提到的那个一样。

您可以将软件用作Selenium以及ChromeDriver和Chrome,只要您采取一些预防措施并对二进制文件进行一些修复即可。此方法仅适用于头戴式版本,如果您希望使用无头版本,则需要进行其他测量才能通过窗口/渲染测试,如此处所述


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

首先,让我们处理设置为 True 的设置。这是由W3C协议定义的,作为浏览器的“NavigatorAutomationInformation”的一部分,它扩展了Navigator界面。如何删除它?该项目有很多文件,第三方的东西,眨眼的Web运行时等。因此,与其疯狂地试图弄清楚这是如何工作的,因为Chromium是开源的,不如聪明地在谷歌上搜索包含它的提交。这是链接。请注意以下文件:navigator.webdriver

  • third_party/WebKit/Source/core/frame/Navigator.h,其中包含代码行:

     `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,其中包含 Navigators 的扩展,包括我们的

    `Navigator implements NavigatorAutomationInformation;` 
    
    which is being commited. Interesting, isn't it?
    
  • third_party/WebKit/Source/core/frame/NavigatorAutomationInformation.idl包含扩展本身,以及一个只读变量,即:webdriver

         `[
             NoInterfaceObject, // Always used on target of 'implements'
             Exposed=(Window),
             RuntimeEnabled=AutomationControlled
         ] interface NavigatorAutomationInformation {
             readonly attribute boolean webdriver;
         };`
    

要摆脱此功能,注释使用此功能扩展的行并编译源代码(在此处在linux中编译)就足够了。但是,对于几乎任何计算机来说,这都是一项艰巨的任务,可能需要几个小时。如果您查看提交日期,则为2017年10月,因此可以选择下载该日期之前发布的任何版本的Chrome。要搜索镜像,您可以谷歌搜索.Navigator.idlNavigatorinurl:/deb/pool/main/g/google-chrome-stable/


2. 修复 ChromeDriver

Distil 会根据窗口变量检查正则表达式规则 '/\$[a-z]dc_/',ChromeDriver 会添加一个满足该条件的正则表达式规则。如这里所述。正如他们所提到的,您必须在源代码中进行编辑,并重新定义变量 。与其他东西。此外,可能更容易的是,您可以使用十六进制编辑器来更新现有的二进制文件。call_function.jsvar key = '$cdc_asdjflasutopfhvcZLmcfl_';

如果您决定使用旧版本的Chrome(我猜您确实这样做了),则需要使用适当版本的ChromeDriver。您可以在ChromeDriver下载网页中知道哪一个适合您的Chrome版本。例如,对于 Chrome v61(符合您的需求),您可以使用 ChromeDriver 2.34。完成后,只需将ChromeDriver二进制文件放在“/usr/bin/local”上即可。


3. 采取其他预防措施

  • 注意你的用户代理。
  • 不要执行太多重复的请求。
  • 在请求之间使用(随机)延迟。
  • 使用此处使用的 Chrome 参数来模拟普通用户配置文件。

答案 2

你不能使用Selenium的WebDriver本身来改变UserAgent,这听起来像是你真正想在这里做的事情。

但是,这并不意味着它不能改变。

输入 PhantomJS。

看看这个答案。您可以使用它来将Selenium伪装成不同的浏览器,或者几乎其他任何东西。当然,如果一个网站决心弄清楚你,硒留下了很多线索(比如以完美的精度点击)。


推荐