无头铬浏览器始终显示验证码

时间:2019-11-30 09:25:20

标签: php centos headless chromium-os

我在headless-chromium-php上使用谷歌浏览器无头浏览器

导航到某些网站,但始终由验证码检测到

我尝试使用此plugin

随机更改用户代理

但没有任何改变

        $UserAgent = \Campo\UserAgent::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();

为什么会这样?

1 个答案:

答案 0 :(得分:0)

  

强烈建议您阅读以下两篇文章,并将所有这些技术应用于您的代码,以使Chrome无头检测变得更加困难

     

Detecting Chrome headless, new techniques

     

It is not possible to detect and block Chrome Headless

无头浏览器检测器通常利用多种技术来识别您的浏览器是否受到远程控制,例如,某些浏览器环境属性:

用户代理(旧)

它是通常用于检测操作系统以及用户浏览器的属性。在具有Chrome 63版本的Linux计算机上,它具有以下值:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/63.0.3071.115 Safari/537.36

因此,我们可以检查是否存在Chrome Headless:

if (/HeadlessChrome/.test(window.navigator.userAgent)) {
    console.log('Chrome headless detected!')
}

Webdriver(新)

为了自动执行无头的Chrome,将新的属性webdriver添加到了导航器对象(请参阅Chromium代码)。因此,通过测试该属性是否存在,可以检测无头的Chrome。

if (navigator.webdriver) {
    console.log('Chrome headless detected!')
}

Chrome(新)

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。第一个是浏览器用户界面的语言,第二个是代表用户首选语言的字符串数组。但是,在无头模式下,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')
    }
}