检测Chrome headless的技巧
原文链接:
https://antoinevastel.com/bot%20detection/2018/01/17/detect-chrome-headless-v2.html
更新:我创建了一个库,可以通过浏览器指纹来检测脚本和爬虫。这个库仍然在开发过程中,不过你可以开始尝试使用了。代码已经在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.permission和navigator.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.language 和 navigator.languages。第一个是浏览器UI的语言,第二个是用户偏好语言的列表。然而,在headless模式中,navigator.languages会返回一个空的字符串。
if(navigator.languages === "") {
console.log("Chrome headless detected");
}
推荐阅读
-
检测Chrome headless的技巧
-
Chrome开发者控制台中几个常用的小技巧
-
对象特征检测法判断浏览器对javascript对象的支持_javascript技巧
-
Chrome Dev tools的几点小技巧
-
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码_javascript技巧
-
用js实现的检测浏览器和系统的函数_javascript技巧
-
js检测网络是否具体连接功能的代码_javascript技巧
-
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)_javascript技巧
-
php下检测字符串是否是utf8编码的代码_php技巧
-
ff chrome和ie下全局动态定位的异同及全局高度的取法_javascript技巧