Java环境下如何在Geckodriver中隐藏WebDriver避免被BotD检测
解决步骤
你缺少核心反检测配置和运行时特征修正,按以下步骤修改代码即可绕过BotD检测:
1. 补充Firefox核心反检测偏好配置
你之前仅配置了WebRTC禁用和无效的Chrome端参数,漏了Firefox专属的核心标识开关,添加以下配置:
FirefoxOptions firefoxOptions = new FirefoxOptions(); FirefoxProfile firefoxProfile = new FirefoxProfile(firefoxProfileFile); // 核心webdriver标识禁用 firefoxProfile.setPreference("dom.webdriver.enabled", false); // 禁用远程控制相关特征 firefoxProfile.setPreference("marionette.enabled", false); firefoxProfile.setPreference("marionette.port", 0); // 特征对齐普通用户浏览器 firefoxProfile.setPreference("plugin.scan.plid.all", false); firefoxProfile.setPreference("plugin.scan.Acrobat", "99.0"); firefoxProfile.setPreference("media.peerconnection.enabled", false); // 禁用自动化专属行为配置 firefoxOptions.setCapability("moz:webdriverClick", false); firefoxOptions.setCapability("moz:useNonSpecCompliantPointerOrigin", true); firefoxOptions.setProfile(firefoxProfile);
注:之前添加的useAutomationExtension是Chrome浏览器专属参数,对Firefox无效,直接删除即可。
2. 添加启动参数对齐普通用户行为
添加以下启动参数,避免暴露自动化启动特征:
firefoxOptions.addArguments("--no-remote"); firefoxOptions.addArguments("--start-maximized"); firefoxOptions.addArguments("--disable-infobars"); firefoxOptions.addArguments("--disable-blink-features=AutomationControlled");
3. 注入页面初始化脚本覆盖运行时特征
BotD会检测页面运行时的全局变量特征,需要在所有页面加载前执行脚本覆盖残留的webdriver属性:
driver = new FirefoxDriver(firefoxOptions); // 注入全局脚本,覆盖所有新页面的webdriver相关标识 Map<String, Object> scriptParams = new HashMap<>(); scriptParams.put("source", "Object.defineProperty(navigator, 'webdriver', { get: () => undefined });\n" + "delete window.cdc_adoQpoasnfa76pfcZLmcfl_;\n" + "delete window.selenium;\n" + "// 按需补充更多特征修正,比如补全plugins、mimeTypes数组伪造真实浏览器插件"); driver.executeCdpCommand("Page.addScriptToEvaluateOnNewDocument", scriptParams);
4. 优化Profile配置
当前使用的安装目录默认Profile缺少普通用户的使用痕迹、插件、缓存等特征,建议手动打开本地Firefox完成常用配置(安装广告拦截、PDF预览等常用插件,访问过常用站点),在Firefox地址栏输入about:profiles找到当前使用的用户Profile路径,替换代码中firefoxProfileFile的路径即可。
修改完成后即可绕过BotD的自动化工具检测。
内容的提问来源于stack exchange,提问作者Morgan Osker
相关产品推荐
相关产品推荐

