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

How to Conceal WebDriver in Geckodriver from BotD in Java?

我按照 禁用 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

我该如何解决这个问题?

BotD 检测到你是因为你没有覆盖 navigator.webdriver属性。

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

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

driver.get("BotD url")之后用这一行重新运行你的代码然后点击 'Start detect' 在 BotD 页面上。

将不再显示检测到 webdriver。

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

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

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

使用 driven GeckoDriver initiated 浏览上下文

当用户代理处于远程控制下时,webdriver-active flag设置为true。最初是 false.

其中,webdriver returns true 如果设置了 webdriver-active 标志, false否则

作为:

navigator.webdriver Defines a standard way for co-operating user agents to inform the document that it is controlled by WebDriver, for example so that alternate code paths can be triggered during automation.

在他的 comments 中进一步 @whimboo 确认:

This implementation have to be conformant to this requirement. As such we will not provide a way to circumvent that.


结论

所以,底线是:

Selenium identifies itself

并且无法隐藏浏览器是 驱动的事实。


建议

然而,一些权威人士提出了一些不同的方法,可以掩盖 Mozilla Firefox 浏览器是通过使用 and WebDriver 控制的事实,如下所示:

compatible code

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()

可能的解决方案

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

compatible code

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/")

参考资料

您可以在

中找到一些相关的详细讨论
  • How to initiate a Tor Browser 9.5 which uses the default Firefox to 68.9.0esr using GeckoDriver and Selenium through Python