内网IP调整引发的Chrome历史记录修改及ShadowRoot的学习

由于IP经常变动, 导致本地项目的那些存在地址栏的历史记录就都失效了, 突然脑洞大开, 有没有办法修改本地历史记录的方法?

想法是: 假设我原IP是192.168.1.51, 新IP是192.168.1.63, 我历史记录有http://192.168.1.51:8080/test.html, 我通过某种办法强行修改Chrome历史记录将192.168.1.51替换成192.168.1.63, 这样, 下次在地址栏输入test, 他就能自动填充http://192.168.1.63:8080/test.html了.

现实是残酷的, Chrome软件的历史记录貌似是二进制文件, 也可能是出于安全考虑. 为了快速解决问题, 我就不打算去研究如何修改二进制文件了.

于是改了host, 映射了一个Ip到本地域名, 为了方便内网其他小白用户快速修改host, 我就搞了个bat文件给他们, 执行后就追加一条来修改host, 参考批处理文件中ECHO命令显示换行(因为我装了adblocker访问的时候页面展示正常, 后来朋友说看不到, 故划掉).

echo. >> %WINDIR%\system32\drivers\etc\hosts & echo 192.168.1.63 bs.ybj.com >> %WINDIR%\system32\drivers\etc\hosts

当然这样以后如果再换IP, 就要手动就改一下host文件了~ 如果偷懒改这个bat文件, 有追加一条新的同域名指向不同IP, 可能不会出问题, 也可能会导致每次访问页面卡20s左右出来. 当然这里我们不考虑文件修改权限的系统相关的问题~

其他思考一: ShadowRoot探索

关于修改本地历史记录的想法诞生后, 我顺便在历史记录chrome://history/中搜索了一下192.168.1.51, 发现有两百多条, 我打算将他们导出成文本替换(其实没什么意义), 然而我发现, 在Console面板里, 这个历史记录居然无法通过普通的JS方法将所有的地址遍历输出, 通过观察Elements面板的DOM结构, 发现原因在于这个#shadow-root (open)这个节点内的DOM元素不能被直接获取到. 从来没有研究过ShadowRoot的我懵逼了, MDN上查到, 它与主DOM树分开渲染, 那么此时我是否有办法获取到DOM子树的根节点内的元素呢. 当然可以, 参考How to access elements under `shadow-root` at 'chrome://downloads' using jquery and selenium?, 原来有这个神奇的/deep/. 于是试着写了一段:

const HISTORYITEMS = document.querySelectorAll('#history-app /deep/ #content /deep/ #history /deep/ #infinite-list /deep/ history-item /deep/ #title');
for (let i = 0; i < HISTORYITEMS.length; i++) {
let item = HISTORYITEMS[i];
let url = item.getAttribute('href');
let name = item.getAttribute('title');
console.log(`${i}: ${name}'的URL地址是${url}
`);
}

由于默认显示条数不会全部显示出来, 所以可能须要手动滚动至底部加载完成后执行.

其他思考二: 真的可以批量修改Chrome存储的历史记录值

后来, 我还是抱以试试的想法去尝试着修改Chrome历史记录, 没想到居然还是很容易的. 确认及准备好以下工作:

  1. 我的系统Windows 10 64bit
  2. 我的Chrome版本63.0.3239.132(正式版本) (64 位)
  3. 下载HxD编辑工具, 直接下载, 安装并打开软件
  4. 关闭Chrome浏览器, 并打开用户个人配置相关文件的目录, (请修改对应的用户名whidy部分替换)

    C:\Documents and Settings\whidy\Local Settings\Application Data\Google\Chrome\User Data\Default

    备份好History, History-journal, History Provider Cache三个文件(防止误操作造成的Chrome破坏造成的损失)

然后直接用HxD依次打开这三个文件, 使用编辑器的替换功能, 将192.168.1.51全部替换为192.168.1.63, 保存.

完成后, 再次启动Chrome, 如果没有发生什么异常, 我想这个奇葩想法的功能就实现了. 我成功的替换了280多条历史记录~

批量修改谷歌浏览器(Chrome)地址栏保存的历史记录及导出功能探索研究的更多相关文章

  1. nodejs 批量修改、删除

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4AAAAQhCAIAAABDaAVHAAAgAElEQVR4nOydeXxU5aH359733vd9b/ ...

  2. 批量修改vss工作目录

    vss作为源代码版本控制工具,可以针对不同的文件夹设置不同的本地工作目录,这样可以方便我们不同的个性化需求.但是往往实际情况是,我们设置了不同的工作目录,后来却发现导致引用混乱,每个人每次获取项目文件 ...

  3. 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧

    Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...

  4. MathType中如何批量修改公式字体和大小

    MathType中如何批量修改公式字体和大小 关于MathType : MathType 是由美国Design Science公司开发的功能强大的数学公式编辑器,它同时支持Windows和Macint ...

  5. 怎么批量修改Word表格的宽度

    怎么批量修改Word表格的宽度 怎么批量修改Word表格的宽度呢.Word表格可根据窗口自动调整表格宽度,使得所有的表格宽度和页面宽度一样.当页面设置了新的页边距后,所有的表格都需要调整新的宽度.或者 ...

  6. 批量修改文件名(Python)

    和上篇博文经历类似, 批量修改文件名字. : ) 不多说, 看图, 程序运行之前: 程序要做的事情呢, 就是挖出"[]"中的集数, 并用 “第[]集”来修改文件名字. 下面是Pyt ...

  7. 如何在Protel99se中批量修改元件的封装

    有时候需要批量修改元件的封装,可在原理图和PCB中批量修改.本文以批量修改电阻AXIAL0.3 的封装为AXIAL0.4 为例. 1. 在原理图中批量修改1.1. 方法1双击需要修改封装的其中一个元件 ...

  8. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

    转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...

  9. photoshop 修改pdf文件并保存为pdf

    1.CTRL + O   打开要编辑的pdf文件 按住shift 选中每一页,点击确定. pdf文档每一页以一个psd文件显示在工作区, 分别进行修改, 2.批量修改同一个元素(比如加个图标) 在一页 ...

随机推荐

  1. LeetCode 172:阶乘后的零

    给定一个整数 n, 返回 n! 结果中尾数为零的数量. 示例 : 输入: 输出: 解释: ! = , 尾数中没有零. 示例 : 输入: 输出: 解释: ! = , 尾数中有个零. 说明:算法的时间复杂 ...

  2. Entity Framework:三种开发模式实现数据访问

    原文地址 http://blog.csdn.net/syaguang2006/article/details/19606715 前言 Entity Framework支持Database First. ...

  3. HttpClient的GET请求(post)请求

    一.不带参数的GET请求 // 创建Httpclient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建ht ...

  4. 04-【servlet转发和重定向】

    转发: //forward(将 数据传给下一个资源(servlet,jsp ,html等 ,把请求和响应的数据和参数设置带过去 ) request.getRequestDispatcher(" ...

  5. (十二)Linux Kernel suspend and resume

    一.对于休眠(suspend)的简单介绍   在Linux中,休眠主要分三个主要的步骤:   1) 冻结用户态进程和内核态任务   2) 调用注册的设备的suspend的回调函数, 顺序是按照注册顺序 ...

  6. 微信小程序开发(二)创建一个小程序页面

    为了方便讲解,我们将上篇博客创建的小程序除了project.config.json和sitemap.json两个文件保留,其他全部删除(这两个文件存的是小程序的创建信息,删掉会有报错提示). 接下来我 ...

  7. Redux应用多人协作的思路和实现

    先上Demo动图,效果如下: 基本思路 由于redux更改数据是dispatch(action),所以很自然而然想到以action作为基本单位在服务端和客户端进行传送,在客户端和服务端用数组来存放ac ...

  8. Spring下的@Order和@Primary与javax.annotation-api下@Priority【Spring4.1后】等方法控制多实现的依赖注入(转)

    @Order 可以作用在类.方法.属性. 影响加载顺序. 若不加,spring的加载顺序是随机的. @Primary 当注入bean冲突时,以@Primary定义的为准. @Order是控制配置类的加 ...

  9. centos 6.5 解压 zip

    只查看 zip 文件内容而不解压 unzip -l filename.zip 解压到指定目录(不指定则为当前目录) unzip filename.zip -d /usr/file 压缩文件或目录为 z ...

  10. WTL自定义控件:edit输入响应

    自定义的edit控件,获取edit输入响应的消息: 头文件部分: BEGIN_MSG_MAP(CCheckEditEx) MESSAGE_HANDLER(WM_CHAR, OnChar) END_MS ...