美文网首页
如何把 Safari 的“阅读列表”转换为 Chrome 的书签

如何把 Safari 的“阅读列表”转换为 Chrome 的书签

作者: ZuraX | 来源:发表于2017-04-22 00:36 被阅读625次

对过程不感兴趣的小伙伴请直接戳这里看使用方法

0. 剧情

某小伙伴平常用 Safari ,收藏了很多网页在“阅读列表”里,现在换成了 Chrome ,想要把“阅读列表”里的收藏作为书签导入到 Chrome 里,但是 Safari 没有提供这个功能,搜索了一番也没找的解决方案。所以作为程序猿,本着“自给自足丰衣足食”的精神,没有的功能咱就自己写。

1. 列需求

  • 找到 Safari 的“阅读列表”的 URL 和标题
  • 将 URL 和 标题导入到 Chrome

2. 探索一番

刚看到这个需求的时候,我搜索了一下“阅读列表”的作用:将网页内容保存到本地供离线使用。显然,找到保存网页离线数据的文件夹或者数据库就有可能找到 URL 列表,在目录下搜索包含safari的文件夹,结果并没有什么帮助。

然后换个思路,能不能找到 Safari 的历史记录文件。用safari 历史记录 路径做为关键字搜索,找到了这个:Safari 的历史记录文件保存在/Users/你的用户名/Library/Caches/Metadata/Safari/History目录下,扫了一眼也没有什么帮助。但是发现在/Users/你的用户名/Library目录下有个safari文件夹,打开一看,很有帮助。

很有帮助的图1

我们发现了什么?ReadingListArchives,保存“阅读列表”离线文件的目录,打开一看,目录下文件夹数量刚好和我的“阅读列表”里网页数量相同,然而目录名是一堆 UUID ,并不是 URL ,文件夹里的文件也只有网页的离线文件。

ReadingListArchives目录下内容

我想这些 UUID 一定是和 URL 有对应关系,于是又看了看 Safari 目录下的文件和文件夹,锁定这几个数据库文件和 plist 文件。首先用 SQLite 工具浏览几个数据库文件,还是没有帮助。再看 plist 文件。首先用Xcode打开Bookmarks.plist文件,展开Children,和那几个Item,发现了有用的东西:WebBookmarkTypeProxyBookmarksBarBookmarksMenucom.apple.ReadingList

Bookmarks.plist

展开com.apple.ReadingList所在的那级Item 3 -> Children,点开几个Item我发现了我想要的东西:“阅读列表”的 URL 和 标题。

URLString和title就是我们想要的

其实到这里已经解决最难的问题了,剩下的是导入到 Chrome 的书签里。本身 Chrome 提供了书签导入/导出功能,我们先导出一份书签看看。

导出的书签 html 文件

结构一目了然,先写个例子。

简单的🌰

然后导入测试一下。

测试结果

成功导入,完成了需求。

3. 上代码

有了上面的探索,代码部分就简单多了。我本是 iOS 堆码猿,考虑到用 ObjectiveC 写还要发个工程压缩包给小伙伴,不如脚本来的轻快,于是我就用 Python3 来写。

我的环境:

  • Mac 10.11.6
  • Safari 10.0.1(11602.2.14.0.7)
  • Chrome 57.0.2987.133 (64-bit)
  • Python 3.6.1

用法:

  1. 把 plist 文件复制到一个文件夹
  2. 打开终端,cd 到那个文件夹
  3. 在终端输入python3 safari2chrome.py来运行脚本
  4. 脚本运行完会在当前目录生成个 html 文件,导入到 Chrome 齐活

代码如下:

from plistlib import *

# read plist file and get URLs and titles
with open('./Bookmarks.plist', 'rb') as fp:
    plist = load(fp)

urlArray = plist['Children'][3]['Children']
marks = []

for dict in urlArray:
    marks.append((dict['URLString'], dict['URIDictionary']['title']))

# create Chrome bookmark html file
fileHeader = '''<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
     It will be read and overwritten.
     DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
'''

rowHeader = '<DL><p>\n'
rowFooter = '</DL><p>'
bookmarkFolderLine = '<DT><H3 ADD_DATE="" LAST_MODIFIED="">Safari Web Bookmark</H3>\n'

f = open('chrome-bookmark.html', 'w')
f.write(fileHeader)
f.write(rowHeader)
f.write(bookmarkFolderLine)
f.write(rowHeader)

for target in marks:
    str = u'<DT><A HREF="' + target[0] + u'" ADD_DATE="" ICON="">' + target[1] + u'</A>' + '\n'
    f.write(str)

f.write(rowFooter)
f.write(rowFooter)

4. 改进

改进的地方有几个吧,比如全程自动导出导入,弄个小小的 GUI ,支持更多版本的 Mac / Safari / Chrome / Python 。小伙伴已经用上面的脚本完成导入,后续我会继续完善这个小工具,让它更简单更好用吧。

已经上传到 Github :https://github.com/GintokiS/Safari2Chrome

# EOF

相关文章

网友评论

      本文标题:如何把 Safari 的“阅读列表”转换为 Chrome 的书签

      本文链接:https://www.haomeiwen.com/subject/juhjzttx.html