chrome书签合并脚本
需求背景
鄙人有多个谷歌账号,在不同的电脑里使用。
时间一长,不同账号和电脑的书签就会产生差异,很容易丢书签。
虽然chrome对同一个账号,能在不同电脑之间同步书签。
但是如果有设备长时间未离线后同步,会出现把已经删掉的书签又加回去的情况。
并且我希望书签能在多个账号直接保持同步。
其实找类似的功能的软件,没有一年也有半年了,始终无果。
后来我意识到一个问题,不同账号的书签合并,跟合代码一样,是有可能发生冲突的,这个冲突显然没太多的办法进行自动处理。
便最后还是决定自己写工具来手动定期合并书签罢。
chrome书签结构
从chrome导出的书签html其实只是个xml,折腾xml的结构折腾了好久。
一是chrome的书签xml结构设计就不好解析,二是go的xml工具还是稀烂的。
结构式最核心的是dt
标签,dt
标签有两种类型,分别是链接类型和文件夹类型。
链接类型
dt
标签里面包住一个a
标签,a
标签就是书签的具体信息。
1 |
|
文件夹类型
文件夹类型的dt
标签里,直接子标签是没有a
标签的。
而是第一个表示是h3
,记录这个文件夹的名称。
然后再有一个dl
标签,包含着文件夹里所包含的内容。
文件夹里既可以包含链接也可以包含文件夹,所以在dl
标签所包含的是多个dt
标签。
1 |
|
书签解析
书签的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来进行热同步。