chrome书签合并脚本

chrome书签合并脚本

需求背景

鄙人有多个谷歌账号,在不同的电脑里使用。
时间一长,不同账号和电脑的书签就会产生差异,很容易丢书签。
虽然chrome对同一个账号,能在不同电脑之间同步书签。
但是如果有设备长时间未离线后同步,会出现把已经删掉的书签又加回去的情况。
并且我希望书签能在多个账号直接保持同步。

其实找类似的功能的软件,没有一年也有半年了,始终无果。
后来我意识到一个问题,不同账号的书签合并,跟合代码一样,是有可能发生冲突的,这个冲突显然没太多的办法进行自动处理。
便最后还是决定自己写工具来手动定期合并书签罢。

chrome书签结构

从chrome导出的书签html其实只是个xml,折腾xml的结构折腾了好久。
一是chrome的书签xml结构设计就不好解析,二是go的xml工具还是稀烂的。

结构式最核心的是dt标签,dt标签有两种类型,分别是链接类型和文件夹类型。

链接类型

dt标签里面包住一个a标签,a标签就是书签的具体信息。

1
2
3
<dt>
<a href="https://www.google.com/">google</a>
</dt>

文件夹类型

文件夹类型的dt标签里,直接子标签是没有a标签的。
而是第一个表示是h3,记录这个文件夹的名称。
然后再有一个dl标签,包含着文件夹里所包含的内容。
文件夹里既可以包含链接也可以包含文件夹,所以在dl标签所包含的是多个dt标签。

1
2
3
4
5
6
7
<dt>
<h3>搜索引擎</h3>
<dl>
<dt>...</dt>
<dt>...</dt>
</dl>
</dt>

书签解析

书签的xml没有id和class,不能直接映射为结构体,书签也不闭合,还需要递归解析,添加了不少难度。
经过了两天折腾,解析思路是把xml导到github.com/PuerkitoBio/goquery当html解析。
goquery会给xml外面自动包和html、head和body。
然后goquery的选择器都以body绝对的开始标签,往后加定位标签。相当于用“绝对路径”而不是“相对路径”。
一开始递归想用“相对路径”,但是翻遍github,go就没库能支持,浪费了很多时间。

详细看代码吧:https://github.com/cellargalaxy/go_common/blob/main/tool/bookmark.go

使用

将xml转成csv,对全部书签进行排序,输出到csv文件保持到github上。
排序的规则的,不考虑请求协议,将域名倒过来,后面再接上path。
例如https://www.google.com/a?b=c#d ,排序的key是 moc.elgoog.www/a?b=c#d
能让域名相近或者二级三级域名的放在一起。
通过github版本管理管理书签,github上的书签作为冷备份。
需要使用时将csv转回xml,通过floccus来进行热同步。


chrome书签合并脚本
https://cellargalaxy.github.io/posts/折腾/22.chrome书签合并脚本/
作者
cellargalaxy
发布于
2022年4月30日
许可协议