百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

教你怎么用JavaScript检测当前浏览器是无头浏览器

liuian 2025-05-05 17:01 61 浏览

什么是无头浏览器(headless browser)?

无头浏览器是指可以在图形界面情况下运行的浏览器。我可以通过编程来控制无头浏览器自动执行各种任务,比如做测试,给网页截屏等。

为什么叫“无头”浏览器?

“无头”这个词来源于最初的“无头计算机(Headless computer)”。维基百科关于的“无头计算机”词条:

无头系统(headless system)是指已配置为无须显示器(即“头”)、键盘和鼠标操作的计算机系统或设备。无头系统通常通过网络连接控制,但也有部分无头系统的设备需要通过RS-232串行连接进行设备的管理。服务器通常采用无头模式以降低运作成本。

为什么要检测无头浏览器?

除了之前提到的两种无害的使用案例,无头浏览器可以被用来自动执行恶意任务。最常见的形式是做网络爬虫,或伪装访问量,或探测网站漏洞。

一个非常流行的无头浏览器是PhantomJS,因为它是基于 Qt 框架,所以跟我们常见的浏览器相比有很多不同的特征,因此有很多方法判断出它。

但是,从chrome 59开始,谷歌发布了一款无头谷歌浏览器。它跟PhantomJS不同,它是基于正统的谷歌浏览器开发出来的,不是基于其它的框架,这让程序很难区分出它是正常浏览器还是无头浏览器。

下面,我们将介绍几种判断程序是运行在普通浏览器还是无头浏览器里的方法。

检测无头浏览器

注意:这些方法只是在四种设备 (2 Linux, 2 Mac) 里测试过,也就是说, 肯定还有其他很多方法检测无头浏览器。

User agent

先介绍使用做最常见的一种判断浏览器种类的方法,检查User agent。在linux计算机里Chrome version 59无头浏览器的User agent值是:

“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36”

于是,我们可以这样检测是否是无头Chrome浏览器:

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

User agent 也可以从 HTTP headers 里获取。然而,这两种情况都很容易伪造。

插件 Plugins

navigator.plugins 会返回一个数组,里面是当前浏览器里的插件信息。通常,普通Chrome浏览器有一些缺省插件,比如 Chrome PDF viewer 或 Google Native Client。相反,在无头模式里,没有任何插件,返回的是个空数组。

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

语言

在谷歌浏览器里,有两个JavaScript属性可以获取当前浏览器的语言设置: navigator.language 和 navigator.languages。头一个是指浏览器界面的语言,后一个返回的是个数组,里面存储的是浏览器用户的所有次选语言。然而,在无头模式里,navigator.languages 返回的是个空字符串。

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

WebGL

WebGL 提供了一组能在HTML canvas 里执行3D渲染的API。通过这些API,我们可以查询出图形驱动的 vendor 和 renderer 。

在linux上的普通谷歌浏览器里,我们获得的 renderer 和 vendor 值为: “Google SwiftShader” 和 “Google Inc.”。

而在无头模式里,我们获得的一个是 “Mesa OffScreen”——它是没有使用任何 window 系统的渲染技术的名称,和 “Brian Paul” ——开源 Mesa 图形库的最初的程序。

 var canvas = document.createElement('canvas');
 var gl = canvas.getContext('webgl');
  
 var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
 var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
 var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
  
 if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") {
  console.log("Chrome headless detected");
 }


并不是所有版本的无头浏览器都有同样的这两个值。然而目前在无头浏览器里是“Mesa Offscreen” 和 “Brian Paul” 这两个值。

浏览器特征

Modernizr 可以探测出当前浏览器对HTML和CSS各种特性的支持程度。我发现,普通Chrome和无头Chrome里唯一的区别是,无头模式下没有 hairline 特征,它是用来检测是否支持 hidpi/retina hairlines的

 if(!Modernizr["hairline"]) {
  console.log("It may be Chrome headless");
 }

加载失败的图片

最后,我发现的最后一个方法,也是看起来最有效的方法,切入点是检查浏览器里不能正常加载的图片的高和宽。

在正常的Chrome里,未成功加载的图片的大小跟浏览器的zoom有关,但肯定不是零。而在无头Chrome浏览器里,这种图片的宽和高都是0。

 
 var body = document.getElementsByTagName("body")[0];
 var image = document.createElement("img");
 image.src = "http://iloveponeydotcom32188.jg";
 image.setAttribute("id", "fakeimage");
 body.appendChild(image);
 image.onerror = function(){
  if(image.width == 0 && image.height == 0) {
  console.log("Chrome headless detected");
  }
 } 

这就是检测无头浏览器的详细步骤

这里小编是一个有着10年工作经验的前端高级工程师,关于web前端有许多的技术干货,包括但不限于各大厂的最新面试题系列、前端项目、最新前端路线等。需要的伙伴可以私信我

发送【前端资料】

就可以获取领取地址,免费送给大家。对于学习web前端有任何问题(学习方法,学习效率,如何就业)都可以问我。希望你也能凭自己的努力,成为下一个优秀的程序员

相关推荐

python环境怎么搭建?小白看完就会!简简单单

很多小伙伴安装了python不会搭建环境,看完这个你就会了Python可应用于多平台包括Linux和MacOSX。你可以通过终端窗口输入"python"命令来查看本地是否...

手把手教本地部署Xinference + deepseek-R1、reranker-v2、bge-m3

Xinference作为本地AI推理框架,相较于Ollama和其他推理方案,有以下几个核心优势:1.多模型支持。Xinference兼容大量LLM(大语言模型),不仅支持LLaMA...

Windows 10下使用编译并使用openCV

1.Windows系统下OpenCV及第三方库文件的使用与下载如果没有特殊要求,在Windows系统下可以直接使用OpenCV的预编译版本。在github的opencv项目release中选择相应r...

Windows环境CMake学习笔记(一)_windows下cmake使用

前言CMake是C++的必学部分,本篇文章从安装环境开始,通过使用CMake构建一个最简单的cpp项目和g++直接编译作对比了解CMake的构建过程,为接下来深入学习CMake打下基础。一、系统环境操...

Docker 安装教程_docker安装shinobi

Docker概述与安装&Dockerfile文件一、Docker概述Docker是一个开源的容器化平台,它允许开发者将应用及其依赖打包到轻量级、可移植的容器中,并能在任何支持Docker...

【直播流】RTSP拉流转推RTMP_rtmp推流和rtsp拉流区别

背景:从第三方协调了几路慢直播,直播流的协议有RTSP、FLV和HLS。不过,本方播放工具只能稳定地播放RTMP流。(本次测试环境:Windows10)步骤概述:安装FFmpeg,用于拉流和转码推流。...

Windows常用的一些CMD运行命令_windows使用cmd运行程序

CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本appwiz.cpl:程序和功能calc:启动计算器certmgr.msc:证书管理实...

JAVA编程环境搭建 JDK与环境变量、Eclipse

1JDK1.1JDK概述JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了:JAVA开发工具(jdk\bin)基础...

go os/exec 简明教程_go语言os包

Go标准库提供了便利的方法,可以很容易地运行外部命令,一般我们会使用os/exec包下的方法实现执行外部命令以及和外部命令交互。os/exec包装了os.StartProcess方法,更方便的进行输入...

Python内置模块:shutil模块使用教程(文件与目录高级操作实践)

一、shutil模块简介在Python开发中,文件与目录操作是最基础的需求之一。虽然os模块提供了基础的文件系统交互能力,但对于复制、移动、删除目录、归档压缩等复杂操作,shutil模块(Shell...

乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现

|注:本文曾发表在博客园我的个人博客中,转载至此公众号以归档保存。家里小朋友养了一只小乌龟,到了冬天就冬眠了,早早地准备了一个冬眠箱,铺上椰土,在室温低于15℃时,就把小乌龟放到冬眠箱里,不一会儿它...

Python环境安装教程_python安装及环境变量配置

文章目录前言一、安装python运行环境1.官网https://www.python.org下载安装包.exe2.安装python二、python模块下载1.配置pip环境变量2.下载pyth...

Python Windows 11 安装后,CMD界面进入不了Python编译界面的解决

1.Python安装进入官网下载python编译界面PythonReleasePython3.10.4|Python.org2.搜索栏输入cmd,进入命令提示符这时输入python命令提...

Windows命令行command的Shell命令详细解析和语法

CMD命令大全及详细解释和语法CMD命令大全及详细解释和语法MicrosoftWindowsXP[版本5.1.2600]有关某个命令的详细信息,请键入HELP命令名ASSOC显示或修改文...

JDK1.8安装&环境变量配置_java安装jdk配置环境变量

1、下载并安装JDK1.8链接:https://pan.baidu.com/s/1bfceFjfTQvLylu7a3T7fyg?pwd=ydtm提取码:ydtm2、设置环境变量2.1打开“控制面板”...