027.爬虫专用浏览器-绕过常见无头检测(二)

news2024/11/18 21:37:34

一、无头检测简介:

  • 无头检测(Headless Detection)就是检测用户是否在无头浏览器。只要检测到,那百分百是爬虫。
  • 无头检测我们多数使用这个站:https://bot.sannysoft.com/
  • 之前写过一篇文章:插眼传送,绕过了部分检测,但是不全,这里我们继续追加。

二、WebGL Render

  • 无头模式下,不会使用gpu,所以检测webGL render是否有关键字"SwiftShader",如果有那就是无头。

在这里插入图片描述

  • 打开文件 \third_party\blink\renderer\modules\webgl\webgl_rendering_context_base.cc
case WebGLDebugRendererInfo::kUnmaskedRendererWebgl:
      if (ExtensionEnabled(kWebGLDebugRendererInfoName)) {
        if (IdentifiabilityStudySettings::Get()->ShouldSampleType(
                blink::IdentifiableSurface::Type::kWebGLParameter)) {
          RecordIdentifiableGLParameterDigest(
              pname, IdentifiabilityBenignStringToken(
                         String(ContextGL()->GetString(GL_RENDERER))));
        }
        //return WebGLAny(script_state,
        //                String(ContextGL()->GetString(GL_RENDERER)));
        
        // 追加 ==========================================
        base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();
        int seed;
        if (base_command_line->HasSwitch("fingerprints")) {
          std::istringstream(base_command_line->GetSwitchValueASCII("fingerprints")) >> seed;
        }else{
          auto now = std::chrono::system_clock::now();
          std::time_t now_time_t = std::chrono::system_clock::to_time_t(now);
          seed = static_cast<int>(now_time_t);
        }
		String tmp = " (NV/" + String(std::to_string(seed)) + ")";
		String render = (String(ContextGL()->GetString(GL_RENDERER)) + tmp);
		std::string renderer = render.Utf8();
		
		// 将全部SwiftShader替换成NVDIA
		std::string searchString = "SwiftShader";
        std::string replaceString = "NVDIA";
		
		size_t start_pos = 0;
		while ((start_pos = renderer.find(searchString, start_pos)) != std::string::npos) {
			renderer.replace(start_pos, searchString.length(), replaceString);
			start_pos += replaceString.length(); 
		}
        return WebGLAny(script_state, String(renderer));
        // 结束追加 ==========================================
        
        }
      SynthesizeGLError(
          GL_INVALID_ENUM, "getParameter",
          "invalid parameter name, WEBGL_debug_renderer_info not enabled");
      return ScriptValue::CreateNull(script_state->GetIsolate());

这里的逻辑是将SwiftShader关键字全部改成NVDIA了。

三、window.chrome

  • 正常有头的chromium内核浏览器打开F12都是有window.chrome的,但无头浏览器会返回undefined

在这里插入图片描述

  • 打开文件 \content\renderer\render_frame_impl.cc
void RenderFrameImpl::DidClearWindowObject() {
  TRACE_EVENT_WITH_FLOW0("navigation", "RenderFrameImpl::DidClearWindowObject",
                         TRACE_ID_LOCAL(this),
                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
  if (enabled_bindings_ & BINDINGS_POLICY_WEB_UI)
    WebUIExtension::Install(frame_);
    
  • 替换为:
void RenderFrameImpl::DidClearWindowObject() {
  TRACE_EVENT_WITH_FLOW0("navigation", "RenderFrameImpl::DidClearWindowObject",
                         TRACE_ID_LOCAL(this),
                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
  //if (enabled_bindings_ & BINDINGS_POLICY_WEB_UI)
  //  WebUIExtension::Install(frame_);
    WebUIExtension::Install(frame_);

这里就是把if条件注释掉。

四、plugins插件

有头浏览器都会装5个默认插件,但无头会变成0个。
这个上篇无头博客改了,但是改的有点乱,会被cloudflare检测到,所以上篇这里作废,我们重改。

  • 打开:\third_party\blink\renderer\modules\plugins\dom_plugin_array.cc
bool DOMPluginArray::IsPdfViewerAvailable() {
  auto* data = GetPluginData();
  if (!data)
    return false;
  for (const Member<MimeClassInfo>& mime_info : data->Mimes()) {
    if (mime_info->Type() == "application/pdf")
      return true;
  }
  return false;
}

  • 替换为:
bool DOMPluginArray::IsPdfViewerAvailable() {
  //auto* data = GetPluginData();
  //if (!data)
  //  return false;
  //for (const Member<MimeClassInfo>& mime_info : data->Mimes()) {
  //  if (mime_info->Type() == "application/pdf")
  //    return true;
  //}
  //return false;
  return true;
}

让这个函数一直返回true即可。

五、无头userAgent

  • 上篇博客给userAgent去掉了HeadlessChrome特征,但是发现他一直不变,因为无头的UA和有头的UA是两套逻辑。这里我们给无头UA加些随机数。

  • 打开:\headless\lib\browser\headless_browser_impl.cc

std::string HeadlessBrowser::GetProductNameAndVersion() {
  return std::string(kHeadlessProductName) + "/" + PRODUCT_VERSION;
}
  • 替换为:
std::string HeadlessBrowser::GetProductNameAndVersion() {
  //return std::string(kHeadlessProductName) + "/" + PRODUCT_VERSION;
  
  base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();
  int tmp = 0;
  if (base_command_line->HasSwitch("fingerprints")) {
    std::istringstream(base_command_line->GetSwitchValueASCII("fingerprints")) >> tmp;
  }
  int fooversion = 124;
  return "Chrome/" + std::to_string(fooversion) + ".0.0.0 BigTom/" + std::to_string(tmp);
}

六、结语:

  • 无头模式主要是为了后续做linux版本做准备,但博主太穷,没钱升级电脑。
  • 所以短时间linux版的是搞不了了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C盘空间不足如何解决?解决C盘空间不足的7个方法

当计算机的C盘&#xff08;通常作为系统盘&#xff09;空间不足时&#xff0c;会严重影响系统的运行效率和稳定性。针对这一问题&#xff0c;以下7个解决方案&#xff0c;可以帮助我们有效释放C盘空间&#xff0c;提升系统性能。 1.磁盘清理 利用Windows内置的磁盘清理工具…

【IPV6从入门到起飞】5-3 IPV6+Home Assistant(ESP32+MQTT+GPIO)远程控制灯

IPV6Home Assistant[ESP32MQTTGPIO]远程控制灯 1 背景2 Home Assistant 配置3 ESP32 配置3-1 工程代码3-2 硬件接线 4 实现效果 1 背景 在上一小节我们通过ESP32接入了Home Assistant&#xff0c;实现了温度、湿度、光照强度的数据采集&#xff0c;但智能家居更多的是实现控制…

IDEA 修改 ${USER} 配置

背景 安装了阿里巴巴代码规范插件&#xff0c;需要使用自动添加作者信息的功能 但是添加的是个人昵称&#xff0c;并非公司要求的工号等信息&#xff0c;于是需要做出修改 修改方案 历经一番波折后&#xff0c;终于发现其原理&#xff0c;是因为 插件添加作者信息&#xff0…

Version ‘18.19.0‘ not found - try `nvm ls-remote` to browse available versions.

nvm安装指定版本不好使了 使用 nvm install 18.19.0 一直报错 Version 18.19.0 not found - try nvm ls-remote to browse available versions.然而使用 nvm ls-remote 只看到 iojs-v1.0.0iojs-v1.0.1iojs-v1.0.2iojs-v1.0.3iojs-v1.0.4iojs-v1.1.0iojs-v1.2.0iojs-v1.3.0iojs…

GPU池化为实现Robotaxi按下快进键

日前&#xff0c;甲子光年智库推出《2022中国Robotaxi行业研究报告&#xff1a;探寻规模化商业落地之路》。Robotaxi&#xff08;无人驾驶出租车&#xff09;是自动驾驶技术发展应用的终极目标之一&#xff0c;新基建下的智慧共享出行将链接贯穿未来数智化生活全场景。 该报告从…

html限制仅有一个音/视频可播放

html限制仅有一个音/视频可播放 /** 多个音频仅能播放一个 */ function audiosPlay() {const audios document.getElementsByTagName(audio);const videos document.getElementsByTagName(video);function pauseAll() {var self this;[].forEach.call(audios, function (i) …

MySQL之对数据库和表的操作

目录 一、创建数据库 二、字符集和校验规则 1、查看系统默认字符集 2、查看系统默认的校验规则 3、查看数据库支持的字符集 4、查看数据库支持的字符集校验规则 5、校验规则对数据库的影响 三、操作数据库 1、查看数据库 2、查看创建语句 ​编辑 3、修改数据库 4、…

从键入网址到显示页面全流程(超详细版)

网络 &#x1f468;‍&#x1f3eb; 小林coding 键入网址到网页显示&#xff0c;期间发生了什么 HTTP【端口&#xff1a;80】 解析URL 协议Web服务器地址目录 文件名 生成请求报文 请求行 请求方法&#xff08;get、post …&#xff09;请求路径协议的版本&#xff08;HTTP/1…

品读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录 【前言】欢迎订阅【品读《Effective Java》】系列专栏java.lang.Math 类的设计经验总结 【前言】欢迎订阅【品读《Effective Java》】系列专栏 《Effective Java》是 Java 开发领域的经典著作&#xff0c;作者 Joshua Bloch 以丰富的经验和深入的知识&#xff0c;全面…

主数据管理系统:KPaaS 集成平台助力企业数据治理

在数字化转型的浪潮中&#xff0c;企业面临着日益复杂的信息技术环境。多系统并存、数据分散的现象普遍存在&#xff0c;这对企业的数据管理和业务协同提出了严峻挑战。主数据管理&#xff08;Master Data Management, MDM&#xff09;作为确保企业核心业务数据准确、一致、完整…

Vite - public目录的图片也会被处理?(public目录的特点)

目录 1&#xff0c;问题描述2&#xff0c;解决3&#xff0c;问题分析3.1&#xff0c;public 目录特点3.2&#xff0c;原因 1&#xff0c;问题描述 复现步骤&#xff1a; 项目为 vite5.0.8 创建的 Vue3 TS 项目。 将图片&#xff08;10kb&#xff09;放到了 public 目录下&a…

设计表时的三大范式(MySQL)

设计表时的三大范式 什么是范式第一范式第二范式不满足第二范式的缺点数据冗余插入异常更新异常删除异常 第三范式 什么是范式 在表的设计中&#xff0c;范式是一种设计规范&#xff0c;用于更好的组织和管理数据。 设计数据表时的范式有第一范式1NF、第二范式2NF、第三范式3…

linux-L8.linux更改文件的拥有者

L8.更改文件的拥有者 Chown root 123.txt xxx_你的用户名_xxxlinux 查看文件的所有者 在Linux中&#xff0c;可以使用ls命令的-l选项来查看文件的详细信息&#xff0c;包括文件的所有者。如下&#xff1a; ls -l

【828华为云征文|轻松搭建蝌蚪聊天室:华为云Flexus X实例实战教程】

文章目录 华为云Flexus X实例概述部署【蝌蚪聊天室】项目准备工作具体操作指南服务器相关环境确认用git拉取项目安装相关依赖运行项目查看效果 总结 华为云Flexus X实例概述 华为云Flexus云服务是一款专为中小企业和开发者设计的高级云产品&#xff0c;提供即开即用的体验&…

动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习

动手学习RAG: 向量模型动手学习RAG&#xff1a;迟交互模型colbert微调实践 bge-m3 1. 环境准备 pip install open-retrievals2. 使用M3E模型 from retrievals import AutoModelForEmbeddingembedder AutoModelForEmbedding.from_pretrained(moka-ai/m3e-base, pooling_meth…

【Windows】获取进程缓解策略设置情况

目录 一、前言 二、主要概念 三、实现步骤 四、总结 原文出处链接&#xff1a;[https://blog.csdn.net/qq_59075481/article/details/142234952] 一、前言 在现代操作系统中&#xff0c;进程缓解策略&#xff08;Process Mitigation Policy&#xff09;提供了一种防御机制…

谷歌创始人谢尔盖·布林回归一线:承认错失先机,每天都在写代码

在科技界&#xff0c;有些名字永远闪耀着创新的光芒&#xff0c;谢尔盖布林就是其中之一。作为谷歌的联合创始人&#xff0c;布林在经历了一段时间的隐退后&#xff0c;宣布重返一线&#xff0c;投身于人工智能&#xff08;AI&#xff09;技术的研发。本周&#xff0c;在洛杉矶…

F12抓包10:UI自动化 - Elements(元素)定位页面元素

​课程大纲 1、前端基础 1.1 元素 元素是构成HTML文档的基本组成部分之一&#xff0c;定义了文档的结构和内容&#xff0c;比如段落、标题、链接等。 元素大致分为3种&#xff1a;基本结构、自闭合元素&#xff08;self-closing element&#xff09;、嵌套元素。 1、基本结构&…

Docker 常用命令(未完待续...)

Docker 常用命令&#xff08;未完待续...&#xff09; 命令的完整名称和别名帮助登录和搜索命令 (Login and Search Commands)其他管理命令 (Other Management Commands)镜像命令 (Image Commands)容器命令 (Container Commands)docker run 从镜像创建并运行一个新的容器docker…

Midjourney中秋特典-12张图附魔咒

第一张 魔咒 A Mid-Autumn Festival poster, a round bright moon, a Chinese-style pavilion with a scene of a reunion from Dream of the Red Chamber, a new Chinese style --ar 3:4 --v 6.1第二张 魔咒 The bright full moon hung in the night sky,clear in outline a…