当您使用含硒的硒时,网站是否可以检测到?

Rya*_*ein 303 javascript python selenium google-chrome selenium-chromedriver

我一直在用Chromedriver测试Selenium,我注意到有些页面可以检测到你正在使用Selenium,即使根本没有自动化.即使我只是通过Selenium和Xephyr使用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')
Run Code Online (Sandbox Code Playgroud)

如果您浏览stubhub,您将在一两个请求中被重定向和"阻止".我一直在研究这个,我无法弄清楚他们如何判断用户是否正在使用Selenium.

他们是如何做到的呢?

编辑更新:

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

编辑:

当我使用Fiddler来查看来回发送的HTTP请求时,我注意到"假浏览器"的请求通常在响应头中有"无缓存".

编辑:

这样的结果是否有办法检测到我在Javascript的Selenium Webdriver页面中建议无法检测何时使用webdriver.但是这个证据表明不然.

编辑:

该网站将指纹上传到他们的服务器,但我检查了使用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","4":"ChromePDFViewer"},"mimeTypes":{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContentDecryptionModuleapplication/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":"TrebuchetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationMono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}
Run Code Online (Sandbox Code Playgroud)

它的硒和铬相同

编辑:

VPN仅供一次使用,但在加载第一页后会被检测到.很明显,正在运行一些javascript来检测Selenium.

Ert*_*maa 126

基本上,硒检测的工作方式是,它们测试使用selenium运行时出现的预定义的javascript变量.机器人检测脚本通常在任何变量(在窗口对象上)中查找包含单词"selenium"/"webdriver"的任何内容,还有文件变量called $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];
}
Run Code Online (Sandbox Code Playgroud)

(注意评论,我所做的我转过身$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;
};
Run Code Online (Sandbox Code Playgroud)

根据用户@szx,也可以在十六进制编辑器中简单地打开chromedriver.exe,只需手动进行替换,而无需实际进行任何编译.

  • 是的,它没有probs工作,请注意一个问题是,如果你陷入"黑名单",在这个改变之前,很难走出去.如果你想要离开现有的黑名单,你需要实现伪画布指纹识别,禁用闪存,更改IP和更改请求标题顺序(交换语言和接受标题).一旦你进入黑名单,他们就有非常好的措施来跟踪你,即使你改变IP,即使你在隐姓埋名中打开镀铬等 (22认同)
  • 我只是在一个十六进制编辑器中用`chromedriver.exe`替换`$ cdc`和`xxxx`,它就可以了!我还注意到,如果你最大化浏览器窗口(而不是使用预定义的大小),它的检测频率会降低. (6认同)
  • 使用$ zzz_zzzzzzzzzzzzzzzzzzzzzzzzzz(相同数量的字符)进行十六进制编辑但不起作用. (4认同)
  • 刚刚测试并且有效。准备好至少需要一个小时来克隆 chromium 存储库并构建它...... (2认同)
  • 我找到了文件"/ Users/your_username/chromium/src/chrome/test/chromedriver/js" (2认同)
  • 就我而言,即使 $cdc_ 变量的名称已更改,但显然仍会检测到网络驱动程序。关于如何使 Chrome 看起来“100% 自然”还有其他建议吗? (2认同)
  • 有一种简单且可自动化的方法可以做到这一点,即在 chromedriver 二进制文件中将 `cdc_` 替换为 4 个字符的其他字符串。方法是使用类似的 perl 命令:`perl -pi -e 's/cdc_/abc_/g' /path/to/chromedriver`。一旦其他人确认,请随时编辑原始答案 (2认同)
  • 在windows,osx或linux上是这样的吗?osx上的十六进制编辑似乎不起作用. (2认同)
  • 所以总而言之,没有办法通过由 distil 网络支持的网站......这就是结束吗?不再需要抓取网页了:)。即使不是selenium,它们似乎也会检测到puthon,那么这是否意味着scrapy、PySpider等......也没有希望了?我想知道是否有人应该为此提供超级赏金,因为似乎没有明确的前进方向.. (2认同)
  • @Erti-ChrisEelmaa 您是否知道有任何不可检测的开源分叉? (2认同)

ale*_*cxe 82

正如我们已经在问题和已发布的答案中找到的那样,这里有一个反网络抓取和Bot检测服务,称为"Distil Networks".并且,根据公司CEO的采访:

即使他们可以创建新的机器人,我们找到了一种方法来识别他们正在使用的工具Selenium,所以无论他们在该机器人上迭代多少次,我们都会阻止Selenium.我们现在正在使用Python和许多不同的技术.一旦我们看到某种类型的机器人出现了一种模式,那么我们就会对他们使用的技术进行逆向工程并将其识别为恶意技术.

理解他们究竟是如何检测Selenium需要时间和其他挑战,但目前我们可以肯定地说:

  • 它与您使用硒的行为无关 - 一旦您导航到该站点,您就会立即被检测到并被禁止.我试图在操作之间添加人工随机延迟,在页面加载后暂停 - 没有任何帮助
  • 它不是关于浏览器指纹 - 在多个浏览器中尝试使用干净的配置文件,而不是隐身模式 - 没有任何帮助
  • 因为,根据采访中的提示,这是"逆向工程",我怀疑这是通过在浏览器中执行的一些JS代码来完成的,这是通过selenium webdriver实现的浏览器自动化

决定将其作为答案发布,因为很清楚:

当您使用含硒的硒时,网站是否可以检测到?

是.


此外,我没有尝试过的是较旧的selenium和较旧的浏览器版本 - 理论上,在某些点上可能会有一些实现/添加到Distil Networks bot探测器当前所依赖的内容.然后,如果是这种情况,我们可能会检测(是的,让我们检测到探测器)在哪个点/版本上进行了相关更改,查看更改日志和更改集,并且可能会为我们提供有关在哪里查看的更多信息他们用它来检测一个基于webdriver的浏览器.这只是一个需要测试的理论.

  • Easyjet正在使用蒸馏网络服务,是的,它可以阻止虚拟机器人,但不是复杂的机器人,因为我们每天从不同的IP(我们再次使用'相同的'地址)测试它超过2000个请求所以基本上每个IP都用于每天5-10个请求,我可以告诉所有这些机器人检测服务只是在那里开发和销售大约45%的工作算法,我们使用的刮板很容易检测到我可以阻止它,而destilnetworks,squareshield和其他不能推动我从不使用任何一个. (9认同)
  • 我认为他们正在检测Chrome浏览器中的navigator.webdriver。我尝试在https://intoli.com/blog/not-possible-to-block-chrome-headless/和/sf/ask/3310851421/的帮助下使navigator.webdriver = false设置-mutationobserver如何在使用sele的页面加载之前注入javascript。它返回一个漫游器检测页面,而不是https://www.distilnetworks.com/distil_identify_cookie.html (2认同)

Deb*_*anB 31

关于检测到由Selenium控制的ChromeDriver驱动的网站,已经进行了很多分析和讨论。这是我的两分钱:

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

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

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

  • 无头 Chrome UserAgent 中检测术语HeadlessChrome

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

您可以在Unable to use Selenium to automatically Chase site login 中找到相关的详细讨论

当使用 Selenium 和 Python 传递值时,您可以在 https://www.nseindia.com/ 上的 Dynamic dropdown does not populate with autoSuggestions 中找到相关的详细讨论

  • 使用机器人的保护服务Datadome

您可以在网站中找到相关的详细讨论,使用 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:\WebDrivers\ChromeDriver\chromedriver_win32\chromedriver.exe')
    driver.get("https://www.google.co.in")
    driver.quit()
    
    Run Code Online (Sandbox Code Playgroud)

您可以在Way to change Google Chrome user agent in Selenium 中找到相关的详细讨论

  • 旋转的UserAgent在每个你的测试使用Network.setUserAgentOverride通过execute_cdp_cmd()如下:

    from selenium import webdriver
    
    driver = webdriver.Chrome(executable_path=r'C:\WebDrivers\chromedriver.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;"))
    
    Run Code Online (Sandbox Code Playgroud)

您可以在How to change the User Agent using Selenium and Python 中找到相关的详细讨论

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

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

您可以在Selenium webdriver: Modifying navigator.webdriver flag to prevent selenium detection 中找到相关的详细讨论

  • 更改navigator.plugins, navigator.languages, WebGL , hairline feature , missing image等的值。

您可以在Is there a version of selenium webdriver that is not detection? 中找到相关的详细讨论

您可以在How to bypass Google captcha with Selenium and python 中找到相关的详细讨论


处理 reCAPTCHA

在处理而不是单击与文本关联的我不是机器人,可能更容易获得身份验证提取和使用data-sitekey.

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

  • 我在 Bloomberg.com 上测试了你的 Python 代码。仍然认出我是机器人。 (3认同)

Deb*_*anB 31

随着Selenium Stealth的出现,可以逃避Selenium驱动的ChromeDriver的检测,启动 浏览上下文变得更加容易。


硒隐形

selenium-stealth是一个用于防止检测的 Python 包。这个程序试图让 python selenium 更加隐秘。然而,到目前为止,selenium-stealth 仅支持 Selenium Chrome。

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

  • selenium-stealth with Stealth 通过了所有公共机器人测试。

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

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


安装

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

pip install selenium-stealth
Run Code Online (Sandbox Code Playgroud)

兼容代码

  • 代码块:

    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/")
    
    Run Code Online (Sandbox Code Playgroud)
  • 浏览器截图:

bot_sannysoft_com


TL; 博士

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

  • 我尝试了这个解决方案,但对我来说没有成功。他们检测到我正在使用一些机器人 (2认同)

col*_*r0n 23

对于Mac用户

cdc_使用Vim或Perl 替换变量

您可以使用vim,或者@Vic来自@ Erti-Chris Eelmaa在@Eici-Chris Eelmaa的答案中指出perl,替换cdc_变量chromedriver(请参阅@ Erti-Chris Eelmaa的帖子以了解有关该变量的更多信息).使用vimperl阻止您必须重新编译源代码或使用十六进制编辑器.chromedriver在尝试编辑之前,请务必复印原件.此外,测试了以下方法chromedriver version 2.41.578706.


使用Vim

vim /path/to/chromedriver
Run Code Online (Sandbox Code Playgroud)

在运行上面的行之后,你可能会看到一堆乱码.请执行下列操作:

  1. cdc_通过键入/cdc_并按下来搜索return.
  2. 按下启用编辑a.
  3. 删除任意数量的内容$cdc_lasutopfhvcZLmcfl并用等量字符替换已删除的内容.如果不这样做,chromedriver将会失败.
  4. 完成编辑后,按esc.
  5. 要保存更改并退出,请键入:wq!并按return.
  6. 如果您不想保存更改,但想要退出,请键入:q!并按return.
  7. 你完成了.

转到更改chromedriver并双击它.terminal应该打开一个窗口.如果未killed在输出中看到,则表明您已成功更改了驱动程序.


使用Perl

以下行替换cdc_dog_:

perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver
Run Code Online (Sandbox Code Playgroud)

确保替换字符串与搜索字符串具有相同的字符数,否则chromedriver将失败.

Perl解释

s///g 表示您要搜索字符串并将其全局替换为另一个字符串(替换所有出现的字符串).

例如, s/string/replacment/g

所以,

s/// 表示搜索和替换字符串.

cdc_ 是搜索字符串.

dog_ 是替换字符串.

g 是全局键,它替换字符串的每个匹配项.

如何检查Perl替换是否有效

以下行将打印搜索字符串的每次出现cdc_:

perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver

如果没有返回任何内容,cdc_则已被替换.

相反,你可以使用这个:

perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver

看看你的替换字符串dog_是否现在是chromedriver二进制文件.如果是,则替换字符串将打印到控制台.

转到更改chromedriver并双击它.terminal应该打开一个窗口.如果未killed在输出中看到,则表明您已成功更改了驱动程序.


包起来

更改chromedriver二进制文件后,请确保更改的二进制文件的名称chromedriverchromedriver,并且原始二进制文件要么从其原始位置移动,要么重命名.


我用这种方法的经验

我以前在尝试登录时在网站上被检测到,但是在用cdc_相同大小的字符串替换之后,我能够登录.就像其他人说的那样,如果你已经被检测到,你可能会被阻止使用这种方法后,还有很多其他原因.因此,您可能必须尝试访问使用VPN,不同网络或您拥有的网站检测到您的网站.

  • 这不适用于当前的chromedriver版本 (8认同)
  • 请注意,chromedriver 人员已声明此问题无法修复,因此您可能需要在不确定的未来使用 fork 或编辑二进制文件。https://bugs.chromium.org/p/chromedriver/issues/detail?id=3220 (6认同)
  • 太长了;在十六进制编辑器中打开二进制文件,将以“$cdc”开头的字符串更改为相同长度的其他字符串,然后保存并运行修改后的二进制文件。 (3认同)
  • 即使我在其他网络上的新物理计算机上使用了chromedriver.exe修改后也无法正常工作。 (2认同)
  • 它给出一个错误说,这个版本不能在这台计算机上运行:( (2认同)

aia*_*tro 20

如何在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 !+""
Run Code Online (Sandbox Code Playgroud)

  • 为什么最后一次尝试没有关闭?除了你能解释一下你的答案. (10认同)

svi*_*nec 18

我所要做的就是:

my_options = webdriver.ChromeOptions()
my_options.add_argument( '--disable-blink-features=AutomationControlled' )
Run Code Online (Sandbox Code Playgroud)

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

我当前运行的版本:

  • 操作系统:Windows 7 64 位
  • Python 3.8.0 (tags/v3.8.0:fa919fd, 2019-10-14) (MSC v.1916 64 位 (AMD64)) 在 win32 上
  • 浏览器:Chrome版本100.0.4896.60(官方版本)(64位)
  • 硒4.1.3
  • ChromeDriver 100.0.4896.60 chromedriver_win32.zip 930ff33ae8babeaa74e0dd1ce1dae7ff


Sha*_*nKM 12

混淆JavaScripts结果

我检查了chromedriver源代码.这会将一些javascript文件注入浏览器.
此链接上的每个javascript文件都会注入网页: https ://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

所以我使用逆向工程并通过十六进制编辑对js文件进行了模糊处理.现在我确信不再使用javascript变量,函数名和固定字符串来发现selenium活动.但仍有一些网站和reCaptcha检测硒!
也许他们检查由chromedriver js执行引起的修改:)


编辑1:

Chrome'导航器'参数修改

我发现'导航器'中有一些参数可以简单地揭示使用chromedriver.这些是参数:

  • "navigator.webdriver"在非自动模式下,它是"未定义的".在自动模式下,它是"真实的".
  • "navigator.plugins"无头镀铬有0长度.所以我添加了一些假元素来欺骗插件长度检查过程.
  • " navigator.languages"设置为默认的chrome值'["en-US","en","es"]'.

所以我需要的是一个chrome扩展来在网页上运行javascript.我使用文章中提供的js代码进行了扩展,并使用另一篇文章将压缩扩展添加到我的项目中.我成功地改变了价值观; 但仍然没有改变!

我没有找到像这样的其他变量,但这并不意味着它们不存在.仍然reCaptcha检测chromedriver,所以应该有更多的变量要改变.在接下来的步骤应该是,我不希望做的检测服务,逆向工程.

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


Kob*_*i K 10

尝试使用具有特定用户配置文件chrome的selenium,这样您就可以将其用作特定用户并定义您想要的任何内容.这样做时它将作为"真正的"用户运行,使用某个进程资源管理器查看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 here any tag you want.
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors", "safebrowsing-disable-download-protection", "safebrowsing-disable-auto-update", "disable-client-side-phishing-detection"])
chromedriver = "C:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)
Run Code Online (Sandbox Code Playgroud)

chrome标签列表在这里


bry*_*yce 10

partial interface Navigator { readonly attribute boolean webdriver; };

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

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

直接取自2017 W3C Editor的WebDriver草案.这在很大程度上意味着,至少,未来的硒驱动程序迭代将被识别以防止滥用.最终,没有源代码很难分辨,究竟是什么原因导致特定的chrome驱动程序是可检测的.

  • 我的意思是没有有问题的网站的源代码.很难说出他们正在检查什么. (5认同)
  • "没有源代码就很难分辨"......源代码是免费提供的 (4认同)

小智 9

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

MDN

该变量由--enable-automationchrome 中的标志管理。该chromedriver推出Chrome会标志和Chrome套window.navigator.webdrivertrue。你可以在这里找到它。您需要添加到“排除开关”标志。例如():

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))
}
Run Code Online (Sandbox Code Playgroud)


Usm*_*ani 9

它适用于某些网站,从导航器中删除属性 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;"
    })
Run Code Online (Sandbox Code Playgroud)


Adi*_*ana 8

我发现的另一件事是某些网站使用检查用户代理的平台。如果该值包含:“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");
Run Code Online (Sandbox Code Playgroud)


小智 6

答案:是的

有些网站会通过浏览器的指纹和其他数据来检测硒,其他网站会根据行为来检测硒,不仅基于你做了什么,还基于你不做什么。

通常用selenium提供的数据就足以检测它。

您可以在此类网站中检查浏览器指纹

https://bot.sannysoft.com
https://fingerprintjs.github.io/fingerprintjs/
https://antoinevastel.com/bots/
Run Code Online (Sandbox Code Playgroud)

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

您可以使用 options() 更改一些指纹,例如用户代理等,请自行查看结果。

您可以尝试通过多种方式避免这种检测,我建议使用这个库:unDetected_chromedriver:

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

import undetected_chromedriver.v2 as uc
Run Code Online (Sandbox Code Playgroud)

另外,您可以尝试使用硒的替代品。我听说过 PhantomJS,但没有尝试。


Mic*_*ntz 6

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")
Run Code Online (Sandbox Code Playgroud)

用法:(Chrome 96 到 Chrome 108):

options.add_argument("--headless=chrome")
Run Code Online (Sandbox Code Playgroud)

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

将其与其他工具(例如unDetected-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()
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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


Bas*_*man 5

听起来他们是Web应用程序防火墙的幕后推手.看看modsecurity和owasp,看看它们是如何工作的.实际上,您要问的是如何进行机器人检测规避.这不是selenium web驱动程序的用途.它用于测试您的Web应用程序而不是其他Web应用程序.这是可能的,但基本上,你必须看看WAF在他们的规则集中寻找什么,如果可以的话,特别是用selenium来避免它.即使这样,它仍然可能无法工作,因为你不知道他们正在使用什么样的WAF.你做了正确的第一步,即伪造用户代理.如果这不起作用,那么WAF就位,你可能需要更加棘手.

编辑:取自其他答案的点.确保首先正确设置了用户代理.也许让它打到本地网络服务器或嗅到流出的流量.

  • 这个话题非常广阔,我想说如果你不懂,而你想了解的话,这里不是合适的地方。从 owasp 开始。研究渗透测试和网络安全。另外,就像我之前说过的,请专门研究 modsecurity 和 WAF 以了解此主题。 (2认同)
  • 我也是一名开发人员:)。学习是我可以落后的一个原因。我不介意帮忙,我只是想表明我不知道你的意图,也不能完全帮助你绕过他们的网站安全。不过,要回答您的问题,他们检测的不是硒。规则检测到可疑行为并决定对违规客户采取适当措施。他们通过你没有做的事情而不是你正在做的事情来抓住你。在 repo 链接中,您可以查看此文件以获得想法 base_rules/modsecurity_crs_20_protocol_violations.conf (2认同)

lfa*_*one 5

即使你发送所有正确的数据(例如Selenium没有显示为扩展名,你有一个合理的分辨率/位深度,&c),有许多服务和工具可以描述访问者的行为,以确定是否actor是用户或自动化系统.

例如,访问一个站点,然后通过在不到一秒的时间内将鼠标直接移动到相关按钮来立即执行某些操作,这是用户实际上无法做到的事情.

作为调试工具,使用https://panopticlick.eff.org/这样的网站来检查浏览器的独特性也是很有用的.它还可以帮助您验证是否有任何特定参数表明您在Selenium中运行.

  • 我已经使用过该网站,指纹与普通浏览器相同.我也没有自动化任何东西.我只是正常浏览. (2认同)

dea*_*ndi 5

据说Firefox可以设置window.navigator.webdriver === true如果使用webdriver.这是根据一个较旧的规格(例如:archive.org),但除了附录中一些非常含糊的措辞外,我无法在新的规范中找到它.

一种用于它的测试是在文件中的硒代码fingerprint_test.js其中在最后评论说:"目前只在Firefox中实现",但我不能用一些简单的识别任何代码在那个方向grepING,既不在当前(41.0.2)Firefox发布树也不在Chromium树中.

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

  • 我刚刚用 Firefox 55 测试了 webdriver,我可以确认这不是真的。变量 `window.navigator.webdriver` 未定义。 (2认同)
  • 更新:我用 Firefox 65 进行了测试,这是真的:`window.navigator.webdriver == true` (2认同)

小智 5

一些网站正在检测这个:

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) {}
Run Code Online (Sandbox Code Playgroud)


M3R*_*3RS 5

我所看到的漫游器检测似乎比我在下面的答案中读到的东西更加复杂或至少有所不同。

实验1:

  1. 我从Python控制台使用Selenium打开浏览器和网页。
  2. 鼠标已经位于特定的位置,我知道该链接将在页面加载后出现。我从不动鼠标。
  3. 我按下了鼠标左键一次(这是从运行Python的控制台到浏览器的焦点)。
  4. 我再次按下鼠标左键(记住,光标在给定链接的上方)。
  5. 链接会正常打开,应该打开。

实验2:

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

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

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

含义:

  • 通过Selenium打开网络浏览器并不会阻止我出现人类
  • 像人一样移动鼠标并不一定要归类为人
  • 通过Selenium单击具有偏移量的内容仍会引发警报

似乎很神秘,但我想他们可以确定某个动作是否起源于Selenium,而他们并不关心浏览器本身是否通过Selenium打开。还是可以确定窗口是否具有焦点?听到有人有任何见识会很有趣。

  • 我的信念是 Selenium 通过 javascript 将某些内容注入页面以查找和访问元素。我相信他们正在检测这种注入。 (4认同)
  • 你是对的,这个测试是 100% 有效的。我做过类似的测试,结果相同。我可以发送 Enter 选项卡或发送密钥。当我访问元素时,页面停止工作。因此,如果驱动程序将一些 JavaScript 注入到浏览器中。我们可以使用 chrome 扩展来加密该 javascript,并使用相同的扩展在下一页上解密。几天后我会尝试看看它。 (2认同)

pgu*_*rio 5

在我看来,用 Selenium 做的最简单的方法是拦截发回浏览器指纹的 XHR。

但由于这是一个仅限 Selenium 的问题,因此最好使用其他东西。Selenium 应该让这样的事情变得更容易,而不是更难。

  • 我猜 Requests 将是主要的 python 选项。如果您发送的请求与浏览器发送的请求完全相同,您将显示为普通浏览器。 (2认同)

归档时间:

查看次数:

126105 次

最近记录:

6 年 前