我正在使用带有无头铬-php 的谷歌浏览器
导航到某些网站,但验证码始终检测到
它我尝试使用此插件随机更改用户代理
但什么都没有改变
$UserAgent = CampoUserAgent::random([
'os_type' => 'Windows',
'device_type' => 'desktop'
]);
$browserFactory = new BrowserFactory('/opt/google/chrome/google-chrome');
$browser = $browserFactory->createBrowser([
'sendSyncDefaultTimeout' => 5000,
'userAgent' => $UserAgent
]);
$page = $browser->createPage();
$page->navigate($NextURL)->waitForNavigation();
为什么会这样?
我强烈建议您阅读下面的两篇文章,并在您的代码上应用所有这些技术,以使Chrome无头检测变得更加困难
检测Chrome无头新技术
无法检测和阻止 Chrome 无头
无头浏览器检测器通常使用一系列技术来识别您的浏览器是否被远程控制,例如,某些浏览器环境属性:
用户代理(旧(
它是通常用于检测操作系统以及用户浏览器的属性。在装有 Chrome 版本 63 的 Linux 计算机上,它具有以下值:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/63.0.3071.115 Safari/537.36
因此,我们可以检查是否存在 铬无头:
if (/HeadlessChrome/.test(window.navigator.userAgent)) {
console.log('Chrome headless detected!')
}
网络驱动程序(新(
为了自动执行 Chrome 无头操作,在导航器对象中添加了一个新的属性网络驱动程序(请参阅 Chromium 代码(。因此,通过测试该属性是否存在,可以检测到Chrome无头。
if (navigator.webdriver) {
console.log('Chrome headless detected!')
}
铬(新(
window.chrome
是一个似乎为Chrome扩展程序开发人员提供功能的对象。虽然它在原版模式下可用,但在无头模式下不可用。
if (!window.chrome) {
console.log('Chrome headless detected')
}
权限(新增(
目前无法在无外设模式下处理权限。因此,它会导致不一致的状态,其中 Notification.permission 和 navigator.permissions.query 报告的值相互矛盾。
const permissionStatus = await navigator.permissions.query({ name: 'notifications' })
if (Notification.permission === 'denied' && permissionStatus.state === 'prompt') {
console.log('This is Chrome headless!')
} else {
console.log('This is not Chrome headless')
}
插件(旧(
navigator.plugins
返回浏览器中存在的插件数组。通常,在Chrome上,我们会找到默认插件,例如Chrome PDF查看器或Google Native Client。相反,在无头模式下,返回的数组不包含插件。
if (navigator.plugins.length === 0) {
console.log('Chrome headless detected!')
}
语言(旧(
在Chrome中,两个Javascript属性能够获取用户使用的语言:navigator.language和navigator.languages。第一个是浏览器 UI 的语言,而第二个是表示用户首选语言的字符串数组。但是,在无头模式下,navigator.languages 返回一个空字符串。
if (navigator.languages === '') {
console.log('Chrome headless detected')
}
WebGL
WebGL是一个在HTML画布中执行3D渲染的API。使用此 API,可以查询图形驱动程序的供应商以及图形驱动程序的呈现器。
使用普通的Chrome和Linux,我获得了渲染器和供应商的以下值:"Google SwiftShader"和"Google Inc."。在无头模式下,我获得了"Mesa OffScreen",这是一种用于不使用任何类型的窗口系统的渲染技术,以及"Brian Paul",这是启动开源Mesa图形库的程序。
const canvas = document.createElement('canvas')
const gl = canvas.getContext('webgl')
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info')
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)
if (vendor == 'Brian Paul' && renderer == 'Mesa OffScreen') {
console.log('Chrome headless detected')
}
缺少图像
最后,我们的最后一个发现似乎也是最可靠的,来自Chrome使用的图像尺寸,以防无法加载图像。
如果是普通 Chrome,图像的宽度和高度取决于浏览器的缩放,但与零不同。在无头 Chrome 中,图像的宽度和高度等于零。
const img = document.createElement('img')
img.src = "http://iloveponeydotcom32188.jg"
document.body.appendChild(img)
img.onerror = () => {
if (img.width == 0 && img.height == 0) {
console.log('Chrome headless detected')
}
}