当您使用带有 chromedriver 的 Selenium 时,网站可以检测到吗?

2024-11-20 08:43:00
admin
原创
10
摘要:问题描述:我一直在用 Chromedriver 测试 Selenium,我注意到有些页面可以检测到你正在使用 Selenium,即使根本没有自动化。即使我只是通过 Selenium 和Xephyr使用 Chrome 手动浏览,我也经常会收到一个页面,提示检测到可疑活动。我检查了我的用户代理和浏览器指纹,它们都...

问题描述:

我一直在用 Chromedriver 测试 Selenium,我注意到有些页面可以检测到你正在使用 Selenium,即使根本没有自动化。即使我只是通过 Selenium 和Xephyr使用 Chrome 手动浏览,我也经常会收到一个页面,提示检测到可疑活动。我检查了我的用户代理和浏览器指纹,它们都与普通的 Chrome 浏览器完全相同。

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

理论上,chromedriver 和 Chrome 对于任何网络服务器来说都应该看起来完全相同,但不知何故它们可以检测到它。

如果你想要一些测试代码,请尝试一下:

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,您会在一两个请求内被重定向和“阻止”。我一直在调查这个问题,但我不知道他们如何知道用户正在使用 Selenium。

他们是如何做到的?

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

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

类似这样的结果有没有办法从 JavaScript 检测出我是否在 Selenium Webdriver 页面中?表明应该没有办法检测您何时使用 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":"WidevineContentDecryptionMo
dule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":
{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-
flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContent
DecryptionModuleapplication/x-ppapi-widevine-
cdm","4":"NativeClientExecutableapplication/x-
nacl","5":"PortableNativeClientExecutableapplication/x-
pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-
pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":
{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"Trebu
chetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationM
ono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

在 Selenium 和 Chrome 中它是相同的。

VPN 只能用于一次使用,但在我加载第一个页面后就会被检测到。显然正在运行一些 JavaScript 代码来检测 Selenium。


解决方案 1:

基本上,Selenium 检测的工作方式是,它们测试与 Selenium 一起运行时出现的预定义 JavaScript 变量。机器人检测脚本通常会在任何变量(在窗口对象上)中查找包含单词“selenium”/“webdriver”的任何内容,以及名为$cdc_和的文档变量$wdc_。当然,所有这些都取决于您使用的浏览器。所有不同的浏览器都会显示不同的东西。

对我来说,我使用 Chrome,因此,我要做的就是确保它$cdc_不再作为文档变量存在,然后瞧(下载 chromedriver 源代码,修改 chromedriver 并$cdc_以不同的名称重新编译。)

这是我在chromedriver中修改的功能:

文件call_function.js

function getPageCache(opt_doc) {
  var doc = opt_doc || document;
  //var key = '$cdc_asdjflasutopfhvcZLmcfl_';
  var key = 'randomblabla_';
  if (!(key in doc))
    doc[key] = new Cache();
  return doc[key];
}

(请注意评论。我所做的一切都是为了$cdc_randomblabla_

以下伪代码演示了机器人网络可能使用的一些技术:

runBotDetection = function () {
    var documentDetectionKeys = [
        "__webdriver_evaluate",
        "__selenium_evaluate",
        "__webdriver_script_function",
        "__webdriver_script_func",
        "__webdriver_script_fn",
        "__fxdriver_evaluate",
        "__driver_unwrapped",
        "__webdriver_unwrapped",
        "__driver_evaluate",
        "__selenium_unwrapped",
        "__fxdriver_unwrapped",
    ];

    var windowDetectionKeys = [
        "_phantom",
        "__nightmare",
        "_selenium",
        "callPhantom",
        "callSelenium",
        "_Selenium_IDE_Recorder",
    ];

    for (const windowDetectionKey in windowDetectionKeys) {
        const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
        if (window[windowDetectionKeyValue]) {
            return true;
        }
    };
    for (const documentDetectionKey in documentDetectionKeys) {
        const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
        if (window['document'][documentDetectionKeyValue]) {
            return true;
        }
    };

    for (const documentKey in window['document']) {
        if (documentKey.match(/$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
            return true;
        }
    }

    if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;

    if (window['document']['documentElement']['getAttribute']('selenium')) return true;
    if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
    if (window['document']['documentElement']['getAttribute']('driver')) return true;

    return false;
};

根据答案,有多种方法可以删除它们。其中一种方法是chromedriver.exe使用十六进制编辑器打开并删除所有出现的$cdc_

解决方案 2:

替换cdc_字符串

您可以使用Vim或Perl替换cdc_中的字符串chromedriver请参阅@Erti-Chris Eelmaa 的回答以了解有关该字符串的更多信息以及它如何成为检测点

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

chromedriver在尝试编辑之前,请确保复制一份原件。

我们的目标是改变cdc_字符串,它看起来像$cdc_lasutopfhvcZLmcfl

以下方法已在 上进行了测试chromedriver version 2.41.578706


使用 Vim

vim -b /path/to/chromedriver

运行上述代码后,您可能会看到一堆乱码。请执行以下操作:

  1. cdc_通过dog_键入将所有实例替换为:%s/cdc_/dog_/g

    • dog_这只是一个例子。你可以选择任何内容,只要它与搜索字符串的字符数相同(例如cdc_),否则chromedriver将失败。

  2. 要保存更改并退出,请键入:wq!并按return

    • 如果您需要退出而不保存更改,请输入:q!并按return

-b选项预先告诉 vim 将文件作为二进制文件打开,这样它就不会弄乱诸如(缺少)行尾之类的东西(尤其是在文件末尾)。


使用 Perl

下面这行代码将所有cdc_出现的替换为dog_。感谢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、不同的网络等访问检测到你的网站。

解决方案 3:

正如我们在问题和发布的答案中已经发现的那样,这里有一个名为“Distil Networks”(现在是“Imperva”)的反网络抓取和机器人检测服务。而且,根据该公司首席执行官的采访:

尽管他们可以创建新的机器人,但我们找到了一种方法来识别他们使用的工具 Selenium,因此无论他们对该机器人进行多少次迭代,我们都会阻止 Selenium。我们现在使用 Python 和许多不同的技术来实现这一点。一旦我们看到一种类型的机器人出现某种模式,我们就会努力对他们使用的技术进行逆向工程并将其识别为恶意软件。

要了解他们究竟如何检测硒,还需要时间和额外的挑战,但目前我们可以肯定地说的是:

  • 它与您使用 Selenium 执行的操作无关。一旦您导航到该网站,您就会立即被检测到并被禁止。我尝试在操作之间添加人为的随机延迟,在页面加载后暂停 - 没有任何帮助

  • 这与浏览器指纹无关。我在多个浏览器上尝试过,使用干净的配置文件,而不是隐身模式,但没有任何帮助

  • 因为根据采访中的提示,这是“逆向工程”,我怀疑这是通过在浏览器中执行一些 JavaScript 代码来完成的,从而揭示这是一个通过 Selenium WebDriver 自动化的浏览器

我决定将其作为答案发布,因为很明显:

当您使用带有 chromedriver 的 selenium 时,网站可以检测到吗?

是的。


此外,我还没有尝试过旧版 Selenium 和旧版浏览器。理论上,在 Distil Networks 机器人检测器目前依赖的某个时间点,Selenium 中可能会实现/添加某些内容。然后,如果是这样的话,我们可能会检测(是的,让我们检测检测器)在哪个时间点/版本进行了相关更改,查看变更日志和变更集,也许这可以给我们提供更多信息,让我们知道在哪里查看以及他们使用什么来检测基于 webdriver 的浏览器。这只是一个需要测试的理论。

解决方案 4:

关于检测网站是否由Selenium控制的ChromeDriver驱动,已经有很多分析和讨论。以下是我的看法:

根据文章“浏览器检测”中的说法,使用用户代理为不同的浏览器提供不同的网页或服务通常不是最好的主意。无论用户使用哪种浏览器或设备,网络都应该是每个人都可以访问的。有一些最佳实践概述了如何开发一个网站,使其根据功能的可用性逐步增强,而不是针对特定的浏览器。

然而,浏览器和标准并不完善,仍然存在一些边缘情况,有些网站仍然会检测浏览器,以及浏览器是否由Selenium控制的WebDriver驱动。可以通过不同的方式检测浏览器,一些常用的机制如下:

  • 实现验证码/重新验证码检测自动机器人

您可以在recaptcha 3 如何知道我正在使用 selenium/chromedriver?中找到相关的详细讨论

  • Headless Chrome UserAgent中检测术语HeadlessChrome

您可以在“访问被拒绝”页面中找到相关的详细讨论,其中无头 Chrome 在 Linux 上工作,而有头 Chrome 在 Windows 上使用 Python 的 Selenium 工作

  • 使用Distil NetworksBot Management 服务

您可以在无法使用 Selenium 自动化 Chase 网站登录中找到相关的详细讨论

  • 使用AkamaiBot Manager 服务

您可以在 https://www.nseindia.com/ 上的“当使用 Selenium 和 Python 传递值时,动态下拉列表不会填充自动建议”中找到相关的详细讨论

  • 使用DatadomeBot Protection 服务

您可以在网站使用 DataDome 在使用 Selenium 和 Python 抓取时验证码被阻止中找到相关的详细讨论

然而,使用用户代理检测浏览器看起来很简单,但做好它实际上有点困难。

注意:此时值得一提的是:使用用户代理嗅探很少是一个好主意。总是有更好、更广泛兼容的方法来解决某个问题。


浏览器检测的注意事项

检测浏览器背后的想法可以是以下任一种:

  • 尝试解决网络浏览器某些特定变体或特定版本中的特定错误。

  • 尝试检查某些浏览器尚不支持的特定功能是否存在。

  • 尝试根据所使用的浏览器提供不同的 HTML。


通过 UserAgents 进行浏览器检测的替代方案

浏览器检测的一些替代方法如下:

  • 执行测试以检测浏览器如何实现某项功能的 API,并据此确定如何使用它。Chrome取消标记了正则表达式中的实验性后向支持就是一个例子。

  • 采用渐进增强的设计技术,分层开发网站,使用自下而上的方法,从较简单的层开始,逐层改进网站的功能,每层使用更多功能。

  • 采用自上而下的优雅降级方法,我们使用所需的所有功能构建最好的网站,然后对其进行调整以使其在旧版浏览器上运行。


解决方案

为了防止检测到Selenium驱动的WebDriver,一种适当的方法将包括下面提到的任一或所有方法:

  • 在每次执行测试套件时使用模块轮换UserAgent,如下所示:fake_useragent

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from fake_useragent import UserAgent

options = Options()
ua = UserAgent()
userAgent = ua.random
print(userAgent)
options.add_argument(f'user-agent={userAgent}')
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:WebDriversChromeDriverchromedriver_win32chromedriver.exe')
driver.get("https://www.google.co.in")
driver.quit()

您可以在如何在 Selenium 中更改 Google Chrome 用户代理?中找到相关的详细讨论

  • 在每个测试中轮换UserAgent 方法如下:Network.setUserAgentOverride`execute_cdp_cmd()`

from selenium import webdriver

driver = webdriver.Chrome(executable_path=r'C:WebDriverschromedriver.exe')
print(driver.execute_script("return navigator.userAgent;"))
# Setting user agent as Chrome/83.0.4103.97
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'})
print(driver.execute_script("return navigator.userAgent;"))

您可以在如何使用 Selenium 和 Python 更改用户代理中找到相关的详细讨论

  • 将webdriver的属性值更改为如下:navigatorundefined

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})

您可以在 Selenium webdriver 中找到相关的详细讨论:修改 navigator.webdriver 标志以防止 selenium 检测

  • navigator.plugins更改、、WebGL发丝特征缺失图像navigator.languages的值。

您可以在是否存在无法检测到的 selenium webdriver 版本?中找到相关的详细讨论

  • 改变传统的视口

您可以在如何使用 Selenium 和 python 绕过 Google 验证码?中找到相关的详细讨论


处理 reCAPTCHA

在处理2captcha和recaptcha-v3而是点击复选框与文本“我不是机器人”相关联,提取和使用可能会更容易获得身份验证data-sitekey

您可以在如何识别 ReCaptcha V2 的 32 位数据站点密钥以使用 Selenium 和 Python 请求以编程方式获取有效响应?中找到相关的详细讨论


总结

您可以在以下位置找到逃避 webdriver 检测的尖端解决方案:

  • selenium-stealth - 一种逃避 webdriver 检测的有效方法

解决方案 5:

随着Selenium Stealth的推出,可以逃避由ChromeDriver发起的Selenium驱动的检测google-chrome 浏览上下文变得更加容易。


硒隐形

selenium-stealth是一个用于防止检测的 Python 包。该程序试图使 python selenium 更加隐蔽。但是,截至目前,selenium-stealth 仅支持 Selenium Chrome。

目前 selenium-stealth 可以提供的功能:

  • 具有隐身功能的 selenium-stealth 通过了所有公共机器人测试。

  • 使用selenium-stealth selenium可以进行google账户登录。

  • selenium-stealth 帮助维持正常的 reCAPTCHA v3 分数


安装

Selenium-stealth 可在 PyPI 上使用,因此您可以使用 pip 安装,如下所示:

pip install selenium-stealth

硒4兼容代码

  • 代码块:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium_stealth import stealth


options = Options()
options.add_argument("start-maximized")

# Chrome is controlled by automated test software
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
s = Service('C:\\BrowserDrivers\\chromedriver.exe')
driver = webdriver.Chrome(service=s, options=options)

# Selenium Stealth settings
stealth(driver,
      languages=["en-US", "en"],
      vendor="Google Inc.",
      platform="Win32",
      webgl_vendor="Intel Inc.",
      renderer="Intel Iris OpenGL Engine",
      fix_hairline=True,
  )

driver.get("https://bot.sannysoft.com/")
  • 浏览器截图:

bot_sannysoft_com


总结

您可以在以下位置找到几个相关的详细讨论:

  • 当您使用带有 chromedriver 的 Selenium 时,网站可以检测到吗?

  • 如何自动登录到正在检测我使用 selenium-stealth 登录尝试的网站

  • 未检测到的 Chromedriver 无法正确加载

解决方案 6:

在 wellsfargo.com 上实现的示例:

try {
 if (window.document.documentElement.getAttribute("webdriver")) return !+[]
} catch (IDLMrxxel) {}
try {
 if ("_Selenium_IDE_Recorder" in window) return !+""
} catch (KknKsUayS) {}
try {
 if ("__webdriver_script_fn" in document) return !+""

解决方案 7:

混淆 JavaScript 结果

我检查了 chromedriver 源代码。它会将一些 JavaScript 文件注入浏览器。

此链接中的每个 JavaScript 文件都会注入到网页中:
https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

因此我使用逆向工程并通过十六进制编辑混淆了JavaScript 文件。现在我确定不再使用 JavaScript 变量、函数名称和固定字符串来发现 Selenium 活动。但仍有一些网站和reCAPTCHA检测到 Selenium!

也许他们检查了由 chromedriver JavaScript 执行引起的修改:)

Chrome 'navigator' 参数修改

我发现“navigator”中有一些参数可以简要地揭示 chromedriver 的使用。

这些是参数:

  • “navigator.webdriver”在非自动模式下,它是“未定义”。在自动模式下,它是“真”。

  • “navigator.plugins”在 Headless Chrome 中,其长度为 0。因此我添加了一些虚假元素来欺骗插件长度检查过程。

  • navigator.languages”被设置为默认 chrome 值 '["en-US", "en", "es"]'。

因此,我需要一个 chrome 扩展程序来在网页上运行 JavaScript。我使用文章中提供的JavaScript 代码制作了一个扩展程序,并使用另一篇文章将压缩的扩展程序添加到我的项目中。我已成功更改值;但仍然没有任何变化!

我没有找到其他类似的变量,但这并不意味着它们不存在。reCAPTCHA 仍然检测 chromedriver,因此应该有更多变量需要更改。下一步应该是对我不想做的检测器服务进行逆向工程。

现在我不确定是否值得花更多的时间在这个自动化过程上或寻找替代方法!

解决方案 8:

尝试将 Selenium 与 Chrome 的特定用户配置文件一起使用。这样,您就可以将其用作特定用户并定义任何您想要的内容。这样做时,它将以“真实”用户的身份运行。使用一些进程资源管理器查看 Chrome 进程,您会看到标签之间的差异。

例如:

username = os.getenv("USERNAME")
userProfile = "C:\\Users\\\" + username +
    "\\AppData\\Local\\Google\\Chrome\\User Data\\Default"

options = webdriver.ChromeOptions()
options.add_argument("user-data-dir={}".format(userProfile))
# Add any tag here you want.
options.add_experimental_option(
    "excludeSwitches",
    """
        ignore-certificate-errors
        safebrowsing-disable-download-protection
        safebrowsing-disable-auto-update
        disable-client-side-phishing-detection
    """.split()
)
chromedriver = "C:Python27chromedriverchromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

Google Chrome 标签列表在此处

解决方案 9:

我所要做的就是:

my_options = webdriver.ChromeOptions()
my_options.add_argument( '--disable-blink-features=AutomationControlled' )

与此相关的更多信息:这与网站skyscanner.com有关。过去我可以抓取它。是的,它确实检测到了浏览器自动化,并给了我一个验证码,让我按住一个按钮。我以前可以手动完成验证码,然后搜索航班,然后抓取。但这次完成验证码后,我一次又一次地收到相同的验证码,似乎无法逃脱。我尝试了一些最受欢迎的建议来避免自动化被检测到,但没有用。然后我发现这篇确实有效的文章,通过排除法,我发现只需要上面的选项就可以绕过他们的浏览器自动化检测。现在我甚至没有收到验证码,其他一切似乎都正常工作。

我目前正在运行的版本:

  • 操作系统:Windows 7 64位

  • win32 上的 Python 3.8.0(tags/v3.8.0:fa919fd,2019-10-14)(MSC v.1916 64 位 (AMD64))

  • 浏览器:Chrome 版本 100.0.4896.60(官方版本)(64 位)

  • 硒 4.1.3

  • ChromeDriver 100.0.4896.60 chromedriver_win32.zip 930ff33ae8babeaa74e0dd1ce1dae7ff

解决方案 10:

它适用于某些网站,从导航器中删除属性 webdriver

from selenium import webdriver
driver = webdriver.Chrome()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source":
        "const newProto = navigator.__proto__;"
        "delete newProto.webdriver;"
        "navigator.__proto__ = newProto;"
    })

解决方案 11:

partial interface Navigator { readonly attribute boolean webdriver; };

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

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

直接取自2017 年 W3C 编辑的 WebDriver 草案。这强烈暗示至少 Selenium 驱动程序的未来迭代将是可识别的,以防止滥用。最终,如果没有源代码,很难说出究竟是什么原因导致 chrome 驱动程序可检测到。

解决方案 12:

除了Erti-Chris Eelmaa 的出色回答之外,它还有 ,而且很烦人window.navigator.webdriver,而且它是只读的。即使你将其值更改为false,它仍然会有true。这就是为什么仍然可以检测到由自动化软件驱动的浏览器。

分子动力学

该变量由 chrome 中的标志管理--enable-automation。chromedriver 使用该标志启动 Chrome,并将 Chrome 设置window.navigator.webdriver为。您可以在此处true找到它。您需要将标志添加到“排除开关”中。例如(Go):

package main

import (
    "github.com/tebeka/selenium"
    "github.com/tebeka/selenium/chrome"
)

func main() {

caps := selenium.Capabilities{
    "browserName": "chrome",
}

chromeCaps := chrome.Capabilities{
    Path:            "/path/to/chrome-binary",
    ExcludeSwitches: []string{"enable-automation"},
}
caps.AddChrome(chromeCaps)

wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 4444))
}

解决方案 13:

据说 Firefox 在使用 webdriver 时会进行设置window.navigator.webdriver === true。这是根据旧规范之一(例如:archive.org )进行的,但我在新规范中找不到它,除了附录中一些非常模糊的措辞。

对它的测试是在文件fingerprint_test.js中的selenium代码中,其中末尾的注释说“当前仅在firefox中实现”,但是我无法通过一些简单的grep操作识别出该方向的任何代码,无论是在当前(41.0.2)Firefox发布树中还是在Chromium树中。

我还发现了一条关于2015 年 1 月Firefox 驱动程序 b82512999938 中指纹识别的旧提交的评论。该代码仍在昨天下载的 Selenium GIT-master 中,javascript/firefox-driver/extension/content/server.js并带有一条评论,链接到当前 w3c webdriver 规范中措辞略有不同的附录。

解决方案 14:

我还发现,有些网站使用检查用户代理的平台。如果值包含“HeadlessChrome”,则使用无头模式时行为可能会很奇怪。

解决方法是覆盖用户代理值,例如在 Java 中:

chromeOptions.addArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");

解决方案 15:

我所见过的机器人检测似乎更复杂,或者至少与我在下面的答案中读到的不同。

实验 1

  1. 我从 Python 控制台使用 Selenium 打开浏览器和网页。

  2. 鼠标已经位于特定位置,我知道页面加载后链接会出现在此位置。我从不移动鼠标。

  3. 我按下鼠标左键一次(这对于将焦点从运行 Python 的控制台转移到浏览器是必要的)。

  4. 我再次按下鼠标左键(记住,光标位于给定的链接上方)。

  5. 链接正常打开,正如它应该的那样。

实验 2

  1. 和以前一样,我从 Python 控制台使用 Selenium 打开浏览器和网页。

  2. 这一次,我没有使用鼠标单击,而是使用 Selenium(在 Python 控制台中)以随机偏移量单击相同的元素。

  3. 链接没有打开,但我被带到了注册页面。

启示

  • 通过 Selenium 打开网络浏览器并不妨碍我表现出人类的本性

  • 像人类一样移动鼠标并不一定被归类为人类

  • 通过 Selenium 点击带有偏移量的内容仍然会引发警报

这似乎很神秘,但我猜他们只能确定某个操作是否源自 Selenium,而不在乎浏览器本身是否通过 Selenium 打开。或者他们可以确定窗口是否有焦点?如果有人有任何见解,那将会很有趣。

解决方案 16:

Chromium 开发人员最近在 2021 年添加了第二种无头模式,该模式不再添加HeadlessChrome到用户代理字符串中。请参阅https://bugs.chromium.org/p/chromium/issues/detail?id=706008#c36

他们后来在 2023 年为 Chrome 109 重新命名了该选项 -> https://github.com/chromium/chromium/commit/e9c516118e2e1923757ecb13e6d9fff36775d1f4

较新的--headless=new标志现在可让您在新的无头模式下获得 Chrome 的全部功能,您甚至可以在其中运行适用于 Chrome 109 及更高版本的扩展程序。(如果使用 Chrome 96 至 108,请使用较旧的--headless=chrome选项。)

使用方法:(Chrome 109 及以上版本):

options.add_argument("--headless=new")

使用方法:(Chrome 96 至 Chrome 108):

options.add_argument("--headless=chrome")

这种新的无头模式使 Chromium 浏览器的工作方式与常规模式一样,这意味着它们不会像旧版无头模式下的 Chrome 那样容易被检测到。

将其与其他工具(如未检测到的 chromedriver)结合起来,以最大限度地逃避 Selenium 检测。


您还可以使用SeleniumBase提供的反检测机制:

pip install seleniumbase,然后使用 运行以下命令python

from seleniumbase import Driver
import time

driver = Driver(uc=True)
driver.get("https://nowsecure.nl/#relax")
time.sleep(6)
driver.quit()

该脚本绕过了通常会阻止硒的站点的检测。

SeleniumBase 还具有其他具有其自己的 API 的格式:

from seleniumbase import SB

with SB(uc=True) as sb:
    sb.open("https://nowsecure.nl/#relax")
    sb.sleep(3)
    if not sb.is_text_visible("OH YEAH, you passed!", "h1"):
        sb.get_new_driver(undetectable=True)
        sb.open("https://nowsecure.nl/#relax")
        sb.sleep(3)
    sb.assert_text("OH YEAH, you passed!", "h1", timeout=3)

(这是一个绕过 Cloudflare 检测的示例脚本,与上面的脚本一样。)

解决方案 17:

听起来它们位于 Web 应用程序防火墙后面。查看 modsecurity 和OWASP以了解它们的工作原理。

实际上,您问的是如何逃避机器人检测。这不是 Selenium WebDriver 的用途。它用于测试您的 Web 应用程序而不影响其他 Web 应用程序。这是可能的,但基本上,您必须查看 WAF 在其规则集中寻找什么,并尽可能使用 selenium 避免它。即使这样,它可能仍然不起作用,因为您不知道他们使用的是什么 WAF。

您第一步做对了,即伪造用户代理。但如果这不起作用,则表明 WAF 已到位,您可能需要采取更棘手的措施。

引用自其他答案。首先确保您的用户代理确实设置正确。也许让它访问本地 Web 服务器或嗅探传出的流量。

解决方案 18:

答案:是的

一些网站会通过浏览器的指纹和其他数据检测硒,其他网站会根据行为检测硒,不仅基于您所做的事情,还基于您不做的事情。

通常,硒提供的数据就足以检测到它。

您可以在类似这样的网站上检查浏览器指纹

https://bot.sannysoft.com
https://fingerprintjs.github.io/fingerprintjs/
https://antoinevastel.com/bots/

尝试使用您的用户浏览器,然后尝试使用 selenium,您将看到差异。

您可以使用 options() 更改一些指纹,例如用户代理和其他指纹,自己查看结果。

你可以尝试用多种方式来避免这种检测,我建议使用这个库:undetected_chromedriver:

https://github.com/ultrafunkamsterdam/unDetected-chromedriver

import undetected_chromedriver.v2 as uc

否则,您可以尝试使用 selenium 的替代品。我听说过 PhantomJS,但没有尝试过。

解决方案 19:

即使您发送了所有正确的数据(例如,Selenium 没有显示为扩展,您具有合理的分辨率/位深度等),也有许多服务和工具可以分析访问者行为,以确定行为者是用户还是自动化系统。

例如,访问一个网站然后立即通过将鼠标直接移动到相关按钮来执行某些操作(不到一秒),这是没有用户真正会做的事情。

使用诸如https://panopticlick.eff.org/之类的网站来检查您的浏览器的独特性也可能用作调试工具;它还可以帮助您验证是否有任何特定参数表明您正在 Selenium 中运行。

解决方案 20:

一些网站检测到了这一点:

function d() {
try {
    if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)
        return !0
} catch (e) {}

try {
    //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))
    if (window.document.documentElement.getAttribute("webdriver"))
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)
    if ("_Selenium_IDE_Recorder" in window)
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)
    if ("__webdriver_script_fn" in document)
        return !0
} catch (e) {}

解决方案 21:

在我看来,使用 Selenium 执行此操作的最简单方法是拦截发回浏览器指纹的XHR 。

但由于这是 Selenium 独有的问题,因此最好使用其他东西。Selenium 应该使这类事情变得更容易,而不是更难。

解决方案 22:

使用以下代码编写 HTML 页面。您将看到,在 DOM 中,selenium 在 outerHTML 中应用了 webdriver 属性:

<html>
<head>
  <script type="text/javascript">
  <!--
    function showWindow(){
      javascript:(alert(document.documentElement.outerHTML));
    }
  //-->
  </script>
</head>
<body>
  <form>
    <input type="button" value="Show outerHTML" onclick="showWindow()">
  </form>
</body>
</html>

运行代码片段Hide results展开片段

解决方案 23:

可以让你的网络浏览器和驱动程序隐形。但你需要明白,网络浏览器和驱动程序开发人员总是承受着巨大的压力:总部希望合法,所以他们接受特殊的检测机制。所以你永远不会收到隐形的浏览器和驱动程序。解决方案如下:

  1. 您应该通过删除所有可以透明的东西来修补 Web 浏览器、驱动程序和 Selenium 本身。

  2. 不要与任何人分享你的补丁。如果你发布你的补丁,它们将被新的检测机制击败。

  3. 您应该实施自动测试,以比较原始浏览器环境和修补后的浏览器 + 驱动程序环境。从任何可能的角度来看,它们都应该相同。不要发布您的测试。

  4. 您应该通过迁移到下一版本的 Web 浏览器、驱动程序和 Selenium 来维护您的补丁。

  5. 您应该维护您的测试,并在测试失败时更新补丁。

是否有可能保护您的网站免受机器人攻击?一般来说可以,但唯一好的解决方案是captcha。不要尊重navigatorjsenv、uniqueevent行为等。请不要指望补丁会是像、等这样的毛绒undetected-chromedriver玩具selenium-stealth

你应该始终记住,检测意味着你想从客户端的未知应用程序获取一些东西。客户可能会通过修补自己的应用程序来删除所有内容,你不知道他(或他的员工)对 Web 浏览器和驱动程序源代码了解多少。如果他的员工参与了开源 Web 浏览器开发,你就没有机会检测到他。

仅举个例子(这个问题中提到的内容):

  1. 导航器.webdriver

  2. CDC_

  3. HeadlessChrome

  4. 语言

  5. __webdriver

此列表中的所有内容都可以在 5 分钟内隐藏/删除,但还有更多其他副作用可能会暴露机器人。

解决方案 24:

您可以尝试使用参数“enable-automation”

var options = new ChromeOptions();

// hide selenium
options.AddExcludedArguments(new List<string>() { "enable-automation" });

var driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options);

但是,我想提醒一下,此功能已在ChromeDriver 79.0.3945.16中修复。因此,您可能应该使用旧版本的 Chrome。

另外,作为另一种选择,您可以尝试使用 InternetExplorerDriver 而不是 Chrome。对我来说,没有任何黑客攻击,IE 根本不会阻塞。

欲了解更多信息,请查看此处:

Selenium webdriver:修改 navigator.webdriver 标志以防止 selenium 检测

无法隐藏 Chrome v76 中的“Chrome 正受到自动软件控制”信息栏

解决方案 25:

我发现可以像这样更改 JavaScript“key”变量:

//Fools the website into believing a human is navigating it
((JavascriptExecutor)driver).executeScript("window.key = \"blahblah\";");

当使用 Selenium WebDriver 和 Google Chrome 时,它​​适用于某些网站,因为许多网站会检查这个变量以避免被 Selenium 抓取。

解决方案 26:

我有同样的问题,并通过以下配置解决了该问题(在 C# 中)

options.AddArguments("start-maximized");
options.AddArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");

options.AddExcludedArgument("enable-automation"); // For hiding chrome being controlled by automation..
options.AddAdditionalCapability("useAutomationExtension", false);

// Import cookies
options.AddArguments("user-data-dir=" + userDataDir);

options.AddArguments("profile-directory=" + profileDir);
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用