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

一、无头检测简介:

  • 无头检测(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版的是搞不了了。
知乎对于Selenium无头模式进行了检测Selenium无头模式是指在运行测试时,浏览器不会显示出来,所有的操作都在后台进行。根据引用\[2\],Playwright支持Headless模式,这种模式可以在CI/云平台上运行,并且运行速度更快。然而,根据引用\[3\],知乎可能会检测Selenium无头模式,并采取一些措施来阻止登录。具体来说,你需要关闭Chrome开发者模式,关闭自动测试状态,并将window.navigator.webdriver设为"undefined"。这些措施可以帮助你绕过知乎的检测,成功登录。 #### 引用[.reference_title] - *1* *2* [爬虫教程( 5 ) --- Selenium、PhantomJS、selenium检测、Playwright、DrissionPage](https://blog.csdn.net/freeking101/article/details/107969524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [selenium爬虫之跳过淘宝滑块验证,这个有点难!](https://blog.csdn.net/weixin_43881394/article/details/108360408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王辉辉的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值