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。
我知道您正在寻找一种方法让它在初始页面加载之前工作。
但这里有两件事需要考虑:
- Webdriver 开发人员希望他们的工具能够被浏览器检测到。
- Gecko 驱动程序开发人员不会实施禁用
navigator.webdriver
属性的选项。 (This为gecko开发者官方回复。)
使用 driven GeckoDriver initiated firefox时浏览上下文
当用户代理处于远程控制下时,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 控制的事实,如下所示:
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/")
参考资料
您可以在
中找到一些相关的详细讨论
- How to initiate a Tor Browser 9.5 which uses the default Firefox to 68.9.0esr using GeckoDriver and Selenium through Python
我按照 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。
我知道您正在寻找一种方法让它在初始页面加载之前工作。
但这里有两件事需要考虑:
- Webdriver 开发人员希望他们的工具能够被浏览器检测到。
- Gecko 驱动程序开发人员不会实施禁用
navigator.webdriver
属性的选项。 (This为gecko开发者官方回复。)
使用
当用户代理处于远程控制下时,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 浏览器是通过使用
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/")
参考资料
您可以在
中找到一些相关的详细讨论- How to initiate a Tor Browser 9.5 which uses the default Firefox to 68.9.0esr using GeckoDriver and Selenium through Python