如何使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无法检测的主要内容,如果未能解决你的问题,请参考以下文章
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 已崩溃