(新)关于修改window.navigator.webdriver代码失效问题

2023-11-01

《前文回顾》

前面写过两篇关于sycm自动化爬取的文章

①关于抓取代码的文章链接

《出师未捷身先死的sycm数据自动化》

②关于chrome版本迭代后,代码失效问题解决方案的文章链接
《关于修改window.navigator.webdriver代码失效问题》

《溯源追根》

问题前文已经说过,这里再明确下:
修改window.navigator.webdriver值的chrom启动配置代码

chrome_options.add_experimental_option('excludeSwitches',['enable-automation'])

在79(含79)以后的版本失效,
前面说的个人猜测chrome后续版本把这个配置都给屏蔽掉了

经过最近时间的研究发现确实如此
谷歌修复了非无头模式下排除“启用自动化”时window.navigator.webdriver是未定义的问题

《解决方案》

上次给过一个退chrome版本的方案,详见前文
《关于修改window.navigator.webdriver代码失效问题》

方法简单粗暴,但是最近公司不让用自己电脑了,公司电脑各种权限,需要it的同事本身不太喜欢麻烦别人,而且退版本也比较麻烦,
所以试图寻找新的解决办法

前面有朋友在评论给出js方法避过验证,通过执行如下 JavaScript 语句来隐藏window.navigator.webdriver的值:

Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })

我前面试了下,继续操作点击链接、输入网址进入另一个页面,或者开启新的窗口,window.navigator.webdriver又变成了true

是因为在网页已经加载完毕以后才运行这段 JavaScript 代码的,可此时网站自身的 js 程序早就已经通过读取window.navigator.webdriver知道你现在使用模拟浏览器,隐藏了没什么用

所以考虑在在浏览器运行网站自带的所有 JavaScript 之前,去执行这段 JavaScript 语句,这也就是今天的新解决方案。

可以通过写 Chrome 浏览器的插件,在 网站刚打开还未运行自带的 JavaScript 之前运行插件里面的 JavaScript 语句(这种方式虽然可以解决问题,但有点儿麻烦,而且重要的是本人不会写插件)

换个简单点儿的方法,使用 GoogleChrome Devtools-Protocol(Chrome 开发工具协议)简称CDP

我们打开 CDP 的官方文档,可以看到如下的命令:
在这里插入图片描述

在每个Frame 刚刚打开,还没有运行 Frame 的脚本前,运行给定的脚本。

通过这个命令,给定一段 JavaScript 代码,让 Chrome 刚刚打开每一个页面,还没有运行网站自带的 JavaScript 代码时,先执行给定的这段代码。

如何在 Selenium 中调用 CDP 的命令?

使用driver.execute_cdp_cmd。根据 Selenium 的官方文档,传入需要调用的 CDP 命令和参数即可:
在这里插入图片描述

代码修正:

from selenium.webdriver import Chrome

driver = Chrome('./chromedriver')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})
driver.get('http://exercise.kingname.info')

运行效果如下图所示:
在这里插入图片描述

完美隐藏window.navigator.webdriver。并且,关键语句:

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})

只需要执行一次,之后只要你不关闭这个driver开启的窗口,无论你打开多少个网址,他都会自动提前在网站自带的所有 js 之前执行这个语句,隐藏window.navigator.webdriver。

值得注意的是:

 #修改windows.navigator.webdriver,防机器人识别机制,selenium自动登陆判别机制
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) 

原先的 这句代码可以带着,如果去掉,也可以正常验证和操作,但是浏览器地址栏会出现自动控制标志,如下图,加上原先这句代码就不会出现这个提示框
在这里插入图片描述

《新登陆代码》

#手动登录
def login(extension_path,tmp_path):
    chrome_options = webdriver.ChromeOptions()
    # 设置好应用扩展
    chrome_options.add_extension(extension_path)
    
     #添加下载路径
    prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory':tmp_path,
             "profile.default_content_setting_values.automatic_downloads":1}#允许多个文件下载
    chrome_options.add_experimental_option('prefs', prefs)

    #修改windows.navigator.webdriver,防机器人识别机制,selenium自动登陆判别机制
	chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) 
	drive = webdriver.Chrome(chrome_options=chrome_options)
 	#CDP执行JavaScript 代码  重定义windows.navigator.webdriver的值
 	drive.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
      "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    url = 'https://sycm.taobao.com/portal/home.htm'
    drive.implicitly_wait(10)
    drive.get(url)
    input("请手动登录,成功后输入【1】:")
    #叉掉页面无关元素后再输入1继续执行
    drive.maximize_window() #窗口最大化
    tm=random.uniform(1,2)
    time.sleep(tm)
    return drive

《写在最后》

上述代码也可以移植旧版本的chrome,
不受影响依然可以正常运行,亲测可用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(新)关于修改window.navigator.webdriver代码失效问题 的相关文章

随机推荐

  • 基于单片机的语音风扇的设计与实现

    写在前面 因为偶尔会有人问 所以对之前做的这个小玩意进行一个小小的总结 把资料也放在这里来吧 作品展示 https www bilibili com video BV1iV411C722 spm id from 333 999 0 0 vd
  • xdp测试例子

    牛刀小试 linux内核协议栈实现了一个虚拟机 允许用户程序向内核注入二进制字节码 注入的程序 就可以做一些有趣的事情 比如 负载均衡 数据包检测 加速容器网络转发 做个网损仪 本篇 运行一个测试程序 丢弃网卡收到的icmp包 xdp dr
  • Matlab自带的数据标准化方法(mapminmax和mapstd)详细解析

    转自 http blog sina com cn s blog b3509cfd0101bt9u html Matlab神经网络工具箱自带了两个数据标准化处理命令 一个是mapminmax 另一个是mapstd 下面 分别对这两个命令进行解
  • 目录操作命令

    文章目录 目录操作命令 ls命令 命令格式 常用用法 cd命令 命令格式 常用用法 pwd 命令 命令格式 常用用法 mkdir命令 命令格式 常用用法 rmdir命令 命令格式 常用用法 tree命令 命令格式 常用用法 目录操作命令 l
  • 详细讲解插入排序(JavaScript实现)

    function insertSort alist let preindex current for let i 1 i
  • webpack打包原理解析

    文章目录 webpack打包是如何运行的 webpack对CommonJS的模块化处理 webpack对es6 Module模块化的处理 webpack文件的按需加载 按需加载输出代码分析 总结 webpack打包是如何运行的 也可以称为
  • Nacos框架服务主动下线原理及源代码讲解

    原理 Nacos没有想eureka一样 在服务端提供API供调用进行服务下线 Nacos的实现方式是通过在客户端提供方法 我们自己封装API进行调用 然后客户端会进行2个步骤 1 如果是临时服务 客户端会把自己发送续约保活心跳的缓存实例给删
  • window.open对storage有没有影响?

    首先在浏览器开发者模式打印如下信息 设置storage存值 sessionStorage setItem aaa 111 localStorage setItem bbb 222 新开一个浏览器窗口 在开发者模式打印窗口获取上一个窗口存储的
  • JAVA算法(分糖果)

    题目描述 有n个小朋友围坐成一圈 老师给每个小朋友随机发偶数个糖果 然后进行下面的游戏 每个小朋友都把自己的糖果分一半给左手边的孩子 一轮分糖后 拥有奇数颗糖的孩子由老师补给1个糖果 从而变成偶数 反复进行这个游戏 直到所有小朋友的糖果数都
  • 版本记录总结

    对构建中使用的版本进行记录
  • 【vue】this.$router.replace跳转不起作用 Router push or replace not working

    项目场景 商城APP底部导航切换对应页面 问题描述 提示 这里描述项目中遇到的问题 Just sit there clicking the home btn watching log show me home but never getti
  • Git远程库代码回退

    一 首先认识两个回退过程中很重要的命令 1 git log 显示所有提交过的版本信息 不包括已经被删除的 commit 记录和 reset 的操作 空格向下翻页 b 向上翻页 q 退出 git log pretty oneline git
  • 华为od机试 C++ 【计算最少步数】

    题目 小明计划在周末去爬山 他有一份包含山峰高度的地图 其中 0 代表平地 而 1 到 9 表示不同的山峰高度 小明可以向上 下 左或右移动一步 但是 由于他不想爬得太累 他决定只在高度差不超过 k 的地方移动 现在他站在地图的左上角 你能
  • 做好五年不跳槽的准备

    入职半年了 我觉得这里可以长久发展 其一 工作能胜任 我感觉找回自信了 甚至有些傲娇了 说明osg确实比较对口 做擅长的工作 会越做越有信心 其二 老大靠谱 老大十几年经验 并且很有耐心 工作方式也对 比如 先给你代码 在这个基础上改 并且
  • 超长整数相加

    链接 https www nowcoder com questionTerminal 5821836e0ec140c1aa29510fd05f45fc orderByHotValue 1 mutiTagIds 640 643 page 6
  • Python数据挖掘 数据预处理案例(以航空公司数据为例)

    Python数据预处理 一 内容 1 数据清洗 2 数据集成 3 数据可视化 二 实验数据 根据航空公司系统内的客户基本信息 乘机信息以及积分信息等详细数据 依据末次飞行日期 LAST FLIGHT DATE 以2014年3月31日为结束时
  • go build遇见“module *** found, but does not contain package ***”

    在实际项目中编译版本时遇见以下问题 common middleware sentinel go 4 2 module github com alibaba sentinel golang latest found v1 0 2 but do
  • SSH项目所需jar包下载地址

    struts2下载地址 http pan baidu com s 1c0joXbi hibernate下载地址 http pan baidu com s 1c0ues1a spring下载地址 http pan baidu com s 1b
  • JS学习篇(一)—— 数据类型篇

    JS学习篇 一 数据类型篇 JS的有八种数据类型 七种基本类型 undefined null Boolean number string symbol bigint 一种引用类型 object 七种基本类型 1 undefined 定义 通
  • (新)关于修改window.navigator.webdriver代码失效问题

    文章目录 前文回顾 溯源追根 解决方案 新登陆代码 写在最后 前文回顾 前面写过两篇关于sycm自动化爬取的文章 关于抓取代码的文章链接 出师未捷身先死的sycm数据自动化 关于chrome版本迭代后 代码失效问题解决方案的文章链接 关于修