如何使chromedriver无法检测

Posted

技术标签:

【中文标题】如何使chromedriver无法检测【英文标题】:How to make chromedriver undetectable 【发布时间】:2017-06-29 09:33:17 【问题描述】:

这是我的第一个 Stack Overflow 问题,请多多包涵。

我已经阅读了this SO question,这让我想知道,是否有可能让 chromedriver 完全无法检测到?

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

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

partial interface Navigator readonly attribute boolean webdriver; ;

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

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

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

我想这是负责检测chromedriver的,但是在梳理源码后,我找不到这个接口。结果,这让我想知道这个功能是否包含在当前的 chromedriver 中。如果没有,我仍然知道当前的chromedriver可以被网站和其他服务如distill检测到。

【问题讨论】:

你到底想做什么?创建一个“匿名”用户代理或让 ChromeDriver 充当“常规”Chrome 浏览器?您遇到的实际问题是什么? 根据定义 chromedriver 是一个“常规”的 chrome 浏览器。它利用 JSON 线框协议将消息发送到“真正的”chrome 浏览器。但是,值得注意的是,它肯定可以作为 selenium webdriver 检测到。我想从浏览器中清除此检测,以创建服务器将其视为真正真实浏览器的内容。这样我就可以根据自己的喜好自定义当前的浏览器,而不必担心网站会认为我正在尝试执行 DDOS 攻击,从而限制我访问他们的网站。 我认为您正试图发起 DDOS 攻击。我来帮你! -- 实际上,网站使用比检测硒更复杂的技术来检测机器人。 【参考方案1】:

您不能使用 Selenium 的 WebDriver 本身来更改 UserAgent,这听起来像是您在这里真正想要做的。

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

输入 PhantomJS。

查看this answer。您可以使用它来将 Selenium 伪装成不同的浏览器,或者其他任何东西。当然,如果一个网站决心找出你的答案,Selenium 会留下很多线索(比如精准点击)。

【讨论】:

您好,感谢您的回复。如果您要打开 chromedriver 和常规 chrome 浏览器,并比较两者,您会发现浏览器标题看起来完全一样。 (除非我做错了。我使用whoishostingthis.com/tools/user-agent 进行此检查)。【参考方案2】:

为了使用无法检测到 Distil 检查点的 ChromeDriver(在此 *** post 中有很好的描述),您需要确保您的浏览器在其窗口或文档原型中不包含任何变量,这些变量表明您正在使用webdriver,就像你提到的那样。

只要您采取一些预防措施并对二进制文件进行一些修复,您就可以将软件作为 Selenium 与 ChromeDriver 和 Chrome 一起使用。此方法仅适用于有头版本,如果您希望使用无头版本,则需要进行额外的测量以通过窗口/渲染测试,described here。


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

首先,让我们处理设置为 True 的 navigator.webdriver。这 由 W3C 协议 here 定义为 浏览器的“NavigatorAutomationInformation”,它扩展了 Navigator 界面。如何删除它?该项目有很多文件、第三方的东西、blink web 运行时等。所以,不要疯狂地试图弄清楚它是如何工作的,因为 Chromium 是开源的,只要聪明一点,在谷歌搜索包含的提交那。 Here is the link。注意这些文件:

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,包含了 Navigator 的扩展,包含了我们的

`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;
     ;`

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


2。修复 ChromeDriver

Distil 针对窗口变量检查正则表达式规则“/\$[a-z]dc_/”,ChromeDriver 添加一个满足该条件的here。正如他们所提到的,您必须在源代码中编辑call_function.js,并重新定义变量var key = '$cdc_asdjflasutopfhvcZLmcfl_';。用别的东西。此外,可能更简单,您可以使用十六进制编辑器来更新现有的二进制文件。

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


3.采取其他预防措施

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

【讨论】:

对于 Chrome 无头用户必须采取的其他措施 - 您从 itoli 链接共享,intoli.com/blog/making-chrome-headless-undetectable - 它们似乎是通过使用代理编写的,使用 @ 987654344@ Python 模块。有没有办法在不使用该模块或代理的情况下应用这些注入 javascript 的设置? 仅供任何想要这样做的人参考; Chromium 不再使用 WebKit;他们使用“眨眼”。您要查找的文件现在位于 third_party/blink/renderer/core/frame 中。

以上是关于如何使chromedriver无法检测的主要内容,如果未能解决你的问题,请参考以下文章

未检测到的 Chromedriver 未正确加载

Python自动检测Chrome浏览器版本号并下载对应驱动文件[chromedriver.exe]

python webdriver.chrome 无法隐藏浏览器窗口?

未知错误:Chrome 无法启动:异常退出(驱动程序信息:chromedriver=2.9

Selenium:WebDriverException:Chrome 无法启动:由于 google-chrome 不再运行而崩溃,因此 ChromeDriver 假设 Chrome 已崩溃

Selenium:WebDriverException:Chrome 无法启动:由于 google-chrome 不再运行而崩溃,因此 ChromeDriver 假设 Chrome 已崩溃