检测Chrome headless的技巧

检测Chrome headless的技巧原文链接 https antoinevaste com bot 20detection 2018 01 17 detect chrome headless v2 html 更新 我创建了一个库 可以通过浏览器指纹来检测脚本和爬虫 这个库仍然在开发过程中 不过你可以开始尝试使用了 代码已经在 Github 上了 目前 我在测试一个新的检测方法 欢迎来进行挑战 并给出反馈 之前我写了一个博

更新:我创建了一个库,可以通过浏览器指纹来检测脚本和爬虫。这个库仍然在开发过程中,不过你可以开始尝试使用了。代码已经在Github上了,目前,我在测试一个新的检测方法,欢迎来进行挑战,并给出反馈。


之前我写了一个博文,关于检测Chrome headless的一些技巧。在那之后,我收到了一些反馈说有些技巧已经失效了。在进行了一些测试之后,确认最后三个技巧已经失效了:WebGL特征、浏览器特征、以及当Chrome加载图片失败时图片大小的特征。

因此,在这个博文中,我会介绍一下检测Chrome headless仍然有效的一些技巧(新发现的和之前仍然有效的)。

User agent (旧)

首先我们介绍一个在之前博文提出的简单方法:User Agent。这是普遍用来区分用户操作系统和浏览器的一个属性。在Linux系统上,使用版本为63的Chrome,其对应的User Agent为:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/63.0.3071.115 Safari/537.36

因此,我们可以检查Chrome headless的User Agent特征:

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

User Agent也可以通过HTTP头来获取。当让,不管如何获取,想要篡改User Agent都是一件很容易的事情。

Webdriver(新)

为了能够自动化的操控Chrome headless,一个新的属性webdriver被引入了进来(可以查看Chromium代码),用来操控对象。因此,可以通过检测这个属性的存在,来判断是否是Chrome headless。

if(navigator.webdriver) { console.log("Chrome headless detected"); } 

Chrome (新)

window.chrome是一个给Chrome扩展插件开发人员使用的新的特性。这个特性在Chrome vanilla模式下存在,但是在headless模式下不存在

// isChrome is true if the browser is Chrome, Chromium or Opera if(isChrome && !window.chrome) { console.log("Chrome headless detected"); } 

权限 (新)

目前,在headless模式下,还无法对权限进行操作。因此,这会导致Notification.permissionnavigator.permissions.query不一致的情况。

navigator.permissions.query({name:'notifications'}).then(function(permissionStatus) { 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 viewer或者Google Native Client。相对的,在headless模式中,这个列表不包含任何插件。

if(navigator.plugins.length === 0) { console.log("It may be Chrome headless"); } 

语言 (旧)

在Chrome中,可以通过两个Javascript的属性来获取用户使用的语言:navigator.languagenavigator.languages。第一个是浏览器UI的语言,第二个是用户偏好语言的列表。然而,在headless模式中,navigator.languages会返回一个空的字符串。

if(navigator.languages === "") { console.log("Chrome headless detected"); } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220412.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:33
下一篇 2026年3月17日 下午8:33


相关推荐

  • linux目录结构详解_linux系统文件在哪个目录

    linux目录结构详解_linux系统文件在哪个目录前言平常linux系统用的也不少,那么linux下的每个目录都是用来干什么的,小伙伴们有仔细研究过吗?让我们来了解下吧Linux系统目录结构登录系统后,在当前命令窗口下输入命令:[root@

    2022年7月30日
    7
  • getdate()方法_formatdatetime函数

    getdate()方法_formatdatetime函数今天看博客看到了一个关于字符串处理的方法,突然就想到可以用来格式化数据,相比之前我是用判断然后用字符串拼接的方法,比较繁琐,感觉这样做会更加好些。1.str0.padStart(length,str1),将指定字符串str1按照长度填充到字符串str0的头部2.关于月份month和日day为个位数的处理如下:varnowTime=newDate()varnowMonth=String(nowTime.getMonth()+1).padStart(2,’0′)…

    2025年9月1日
    5
  • js android 换行符,关于js对textarea换行符的处理方法浅析

    js android 换行符,关于js对textarea换行符的处理方法浅析前言本文很简单,就是记录一下js对textarea换行符的处理。调试随便写一个textarea整个调试如下图:发现:textareaid里面的换行符可以通过indexOf获取textareaid.value.indexOf(“\n”)但是直接通过正则全局替换没有效果(如上图)textareaid.value.replace(‘/\n/g’,’;’)但是单个替换可以替换到:textareaid.v…

    2022年5月24日
    70
  • ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]

    ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]比较目前,针对于ARM平台的主流编译器主要有以下三者:比较ARMCCIARGCCforARM命令行工具IDE中,独立提供仅随其IDE发布,不独立提供独立提供开发商ARMIARGNU(目前由ARM维护)支持的平台Windows、LinuxWindowsWindows、Linux、Mac配套IDEKeilMDK、Develo…

    2022年6月10日
    57
  • 安装Ubuntu Linux系统时硬盘分区最合理的方法

    安装Ubuntu Linux系统时硬盘分区最合理的方法无论是安装 Windows 还是 Linux 操作系统 硬盘分区都是整个系统安装过程中最为棘手的环节 网上的一些 UbuntuLinux 安装教程一般都是自动分区 给初学者带来很大的不便 下面我就根据多年来在装系统的经验谈谈安装 UbuntuLinux 系统时硬盘分区最合理的方法 在讲硬盘分区之前 我先来普及一下硬盘的相关分类 硬盘一般分为 IDE 硬盘 SCSI 硬盘和 SATA 硬盘三种 在 Linux 系统

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号