如何在Java中从BotD中隐藏Geckodriver中的WebDriver?

问题描述 投票:0回答:3

我按照 Stackoverflow 上的 这篇文章 禁用了

Firefox WebDriver
检测。

启动 Geckodriver:

System.setProperty("webdriver.gecko.driver", geckdriverExecutableFilePath);



File firefoxProfileFile = new File(fullPathOfFirefoxInstallationFolder);



FirefoxProfile firefoxProfile = null;

        
 try {
    firefoxProfile = new FirefoxProfile(firefoxProfileFile);
     } catch (Exception e) {

    e.printStackTrace();
     }

我禁用了

WebDriver
:

WebDriver Disabled

FirefoxOptions firefoxOptions = new FirefoxOptions();

firefoxOptions.setProfile(firefoxProfile);

// Disables WebRTC
firefoxProfile.setPreference("media.peerconnection.enabled", false);

我禁用了自动化扩展:

Automation Extension Disabled

// Disables Automation Extension
firefoxProfile.setPreference("useAutomationExtension", false);

我添加了代理:

    DesiredCapabilities dc = DesiredCapabilities.firefox();
    Proxy proxy = new Proxy();
    proxy.setHttpProxy(ipAddress + ":" + port);
    proxy.setFtpProxy(ipAddress + ":" + port);
    proxy.setSslProxy(ipAddress + ":" + port);

   dc.setCapability(CapabilityType.PROXY, proxy);




   firefoxOptions.merge(dc);

   driver = new FirefoxDriver(firefoxOptions);

但是 BotD 仍然检测到我的浏览器受自动化工具控制。

BotD Detection

我该如何解决这个问题?

java selenium selenium-webdriver webdriver geckodriver
3个回答
8
投票

当使用 Selenium 驱动 GeckoDriver 发起 浏览上下文

当用户代理处于远程控制状态时,webdriver-active 标志 设置为

true
。最初是
false

webdriver-active flag

其中,如果设置了 webdriver-active 标志,则

webdriver
返回
true
,否则返回
false

如:

navigator.webdriver 定义协作用户代理的标准方法,以通知文档它由 WebDriver 控制,例如 示例,以便可以在期间触发备用代码路径 自动化。

在他的

评论
中进一步@whimboo确认:

此实施必须符合此要求。像这样 我们不会提供规避方法。


结论

所以,底线是:

Selenium 识别自己

并且无法掩盖浏览器是由 WebDriver 驱动的事实。


推荐

然而,一些专家提出了一些不同的方法,这些方法可以掩盖 Mozilla Firefox 浏览器是通过使用 Firefox ProfilesProxies 进行 WebDriver 控制的事实,如下所示:

兼容代码

from selenium.webdriver import Firefox
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options

profile_path = r'C:\Users\Admin\AppData\Roaming\Mozilla\Firefox\Profiles\s8543x41.default-release'
options=Options()
options.set_preference('profile', profile_path)
options.set_preference('network.proxy.type', 1)
options.set_preference('network.proxy.socks', '127.0.0.1')
options.set_preference('network.proxy.socks_port', 9050)
options.set_preference('network.proxy.socks_remote_dns', False)
service = Service('C:\\BrowserDrivers\\geckodriver.exe')
driver = Firefox(service=service, options=options)
driver.get("https://www.google.com")
driver.quit()

潜在的解决方案

一个潜在的解决方案是使用 浏览器,如下所示:

兼容代码

from selenium.webdriver import Firefox  
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
import os

torexe = os.popen(r'C:\Users\username\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe')
profile_path = r'C:\Users\username\Desktop\Tor Browser\Browser\TorBrowser\Data\Browser\profile.default'
firefox_options=Options()
firefox_options.set_preference('profile', profile_path)
firefox_options.set_preference('network.proxy.type', 1)
firefox_options.set_preference('network.proxy.socks', '127.0.0.1')
firefox_options.set_preference('network.proxy.socks_port', 9050)
firefox_options.set_preference("network.proxy.socks_remote_dns", False)
firefox_options.binary_location = r'C:\Users\username\Desktop\Tor Browser\Browser\firefox.exe'
service = Service('C:\\BrowserDrivers\\geckodriver.exe')
driver = webdriver.Firefox(service=service, options=firefox_options)
driver.get("https://www.tiktok.com/")

参考文献

您可以在

中找到一些相关的详细讨论

0
投票

BotD 会检测到您,因为您没有覆盖 navigator.webdriver 属性。

我可以用这段代码覆盖它:

((JavascriptExecutor)driver).executeScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");

driver.get("BotD url")
之后使用此行重新运行代码,然后单击 BotD 页面上‘开始检测’

不再显示检测到网络驱动程序。

我知道您正在寻找一种方法使其在初始页面加载之前工作。

但是这里有两件事需要考虑:

  1. Webdriver 开发人员希望他们的工具能够被浏览器检测到。
  2. Gecko 驱动程序开发人员不会实现禁用
    navigator.webdriver
    属性的选项。 (是gecko开发者的官方回复。)

0
投票

因为我的整个代码库(数千行代码)都是为 Firefox 编写的。将来我希望添加对 Chrome 的支持,但无论哪种情况,我都不想仅仅因为无法解决一个问题而放弃使用 Firefox。我希望找到解决这个问题的方法..一定有办法..

因为OP真的想要答案,所以我要给出答案。

  • 将 Violentmonkey 插件安装到你的 geckodriver
  • 安装此脚本:
// ==UserScript==
// @name            Webdriver Get Rekt
// @author          noname
// @namespace       http://www.example.url/to/your-web-site/
// @description     Put a good description in here
// @license         Creative Commons Attribution License
// @version            0.1
// @include         http*://*/*
// @run-at           document-start
// @compatible      Greasemonkey
// ==/UserScript==

Object.defineProperty(navigator, 'webdriver', {get: () => undefined})

应该能够在页面加载之前覆盖 navigator.webdriver,从而消除驱动程序检测。

© www.soinside.com 2019 - 2024. All rights reserved.