我按照 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
:
FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.setProfile(firefoxProfile);
// Disables WebRTC
firefoxProfile.setPreference("media.peerconnection.enabled", false);
我禁用了自动化扩展:
// 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 仍然检测到我的浏览器受自动化工具控制。
我该如何解决这个问题?
当使用 Selenium 驱动 GeckoDriver 发起 firefox 浏览上下文
当用户代理处于远程控制状态时,webdriver-active 标志 设置为
true
。最初是false
。
其中,如果设置了 webdriver-active 标志,则
webdriver
返回 true
,否则返回 false
。
如:
navigator.webdriver 定义协作用户代理的标准方法,以通知文档它由 WebDriver 控制,例如 示例,以便可以在期间触发备用代码路径 自动化。
在他的
评论中进一步
@whimboo
确认:
此实施必须符合此要求。像这样 我们不会提供规避方法。
所以,底线是:
Selenium 识别自己
并且无法掩盖浏览器是由 WebDriver 驱动的事实。
然而,一些专家提出了一些不同的方法,这些方法可以掩盖 Mozilla Firefox 浏览器是通过使用 Firefox Profiles 和 Proxies 进行 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()
一个潜在的解决方案是使用 tor 浏览器,如下所示:
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/")
您可以在
中找到一些相关的详细讨论BotD 会检测到您,因为您没有覆盖 navigator.webdriver 属性。
我可以用这段代码覆盖它:
((JavascriptExecutor)driver).executeScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
在
driver.get("BotD url")
之后使用此行重新运行代码,然后单击
BotD 页面上‘开始检测’。
不再显示检测到网络驱动程序。
我知道您正在寻找一种方法使其在初始页面加载之前工作。
但是这里有两件事需要考虑:
navigator.webdriver
属性的选项。 (这是gecko开发者的官方回复。)因为我的整个代码库(数千行代码)都是为 Firefox 编写的。将来我希望添加对 Chrome 的支持,但无论哪种情况,我都不想仅仅因为无法解决一个问题而放弃使用 Firefox。我希望找到解决这个问题的方法..一定有办法..
因为OP真的想要答案,所以我要给出答案。
// ==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,从而消除驱动程序检测。