提问者:小点点

网站能检测到你在用ChromeDriver时使用Selenium吗?


我一直在用Chromedriver测试Selenium,我注意到有些页面可以检测到你在使用Selenium,尽管根本没有自动化功能。即使我只是手动浏览,只是使用Chrome,通过Selenium和Xephyr,我也经常会看到一个页面,上面说检测到了可疑的activity。我已经检查了我的用户代理和我的浏览器指纹,他们都完全相同的正常Chrome浏览器。

当我用普通的Chrome浏览这些网站时,一切都很正常,但当我使用硒时,我就被检测到了。

理论上,chromedriver和Chrome在任何Web服务器上看起来都应该是完全一样的,但不知何故它们可以检测到它。

如果您想要一些测试代码,请试用以下代码:

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')

如果您浏览stubhub,您将在一两个请求中被重定向和“阻塞”。我一直在调查这件事,我不知道他们是怎么知道一个用户在使用硒的。

他们是怎么做的?

我在Firefox中安装了Selenium IDE插件,但当我在普通的Firefox浏览器中访问stubhub.com时,却被禁止了。

当我使用Fiddler查看来回发送的HTTP请求时,我注意到“假浏览器的”请求通常在响应头中有“no-cache”。

这样的结果表明,当您使用Webdriver时,不应该有任何方法来检测我是否在JavaScript的Selenium Webdriver页面中。但这一证据表明情况并非如此。

网站上传了一个指纹到他们的服务器,但我检查了一下,Selenium的指纹和使用Chrome时的指纹是一样的。

这是它们发送到服务器的指纹负载之一:{“AppName”:“Netscape”,“Platform”:“Linuxx86_64”,“Cookies”:1,“syslang”:“en-US”,“userlang”:“en-US”,“CPU”:“”,“ProductSub”:“20030107”,“SetTimeout”:1,“SetInterval”:1,“Plugins”:{“0”:“ChromePDFViewer”,“1”:“ShockWaveFlash”,“2”:“WidevineContentDecryptionModule”,“3”:“NativeClient”,“4ER“}}

硒和铬是一样的。

VPN只工作一次,但在我加载第一个页面后就会被检测到。显然,正在运行一些JavaScript来检测Selenium。


共1个答案

匿名用户

您可以使用VIMPerl替换ChromeDriver中的CDC_字符串。请参阅@erti-Chris Eelmaa的答案以了解更多关于该字符串以及它是如何作为检测点的。

使用VimPerl可以避免重新编译源代码或使用十六进制编辑器。

在尝试编辑ChromeDriver之前,请确保制作原始ChromeDriver的副本。

我们的目标是更改cdc_字符串,该字符串看起来类似于$cdc_lasutopfhvczlmcfl

ChromeDriver版本2.41.578706上测试了以下方法。

vim /path/to/chromedriver

在运行上面的行之后,您可能会看到一堆胡言乱语。执行以下操作:

  • 通过键入:%s/cdc_/dog_/gcdc_的所有实例替换为dog_
    • dog_只是一个例子。您可以选择任何内容,只要它具有与搜索字符串相同的字符量(例如,CDC_),否则ChromeDriver将失败。
    • 如果需要退出而不保存更改,请键入:q!并按Return

    下面一行用dog_替换所有cdc_出现的情况。Vic Seedoubleyew功劳:

    perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver
    

    确保替换字符串(例如DOG_)具有与搜索字符串(例如CDC_)相同的字符数,否则ChromeDriver将失败。

    验证是否替换了所有出现的CDC_

    grep "cdc_" /path/to/chromedriver
    

    如果没有返回输出,则替换成功。

    转到修改后的ChromeDriver并双击它。终端窗口应该打开。如果在输出中没有看到killed,则说明您已经成功地更改了驱动程序。

    请确保更改后的ChromeDriver二进制文件的名称为ChromeDriver,并且将原始二进制文件从其原始位置移动或重命名。

    我以前在尝试登录时在网站上被检测到,但是在用一个相同大小的字符串替换cdc_之后,我就能够登录了。就像其他人所说的那样,如果你已经被检测到了,即使在使用了这个方法之后,你也可能会因为很多其他原因而被阻止。因此,您可能必须尝试使用VPN、不同的网络等访问正在检测您的站点。