Vastiny

Oct 20, 2017

导出 Safari 历史记录

起因

因为在 iPad 上 Safari 的稍后阅读有问题,我去设置里面清除了 Safari 的缓存,结果把我一百多个已经打开的标签都删掉了,我快速设置 iPad 为飞行模式,然后在 Mac 端把所有 Safari 同步的标签都打开,导致 Safari 有点受不了,卡机。

我就等了老半天,Safari 没响应,把所有其它无关程序都关掉,又等了很久,结果还是切换不了标签,但可以保存所有的标签到收藏夹。于是我想也行,先保存到收藏夹,然后重启点电脑就行了。

结果重启的时候一直重启不能,我就强制关闭了,重启后就像什么都没发生过一样,收藏夹里面没有这一百多个记录,并且也没有自动打开所有内容,也不能通过 Open Last Session 恢复,无语。最后看到历史记录里面还是有的,但是难道还要一个一个打开?然后保存?

于是想到了导出 Safari 历史记录。

操作

找到 Safari 历史记录数据库,~/Library/Safari/History.db , 然后用 [DB Browser for SQLite.app](https://github.com/sqlitebrowser/sqlitebrowser/releases)打开,发现是可以浏览相关的历史记录的。如图1:

![](./_image/Screen Shot 2017-10-20 at 11.41.08.png)

看来是把 历史记录分成了两个表,于是左联一下就可以实现。但有个问题是访问时间一直是 529847145.593902 这种奇怪的东西,不是 unixtimestamp,然后搜索一下发现是以 2001-01-01 00:00:00 为起点计算 timestamp,于是用 JavaScript 写了个转换:

1
2
3
4
5
// 2017 年 10月 16 日
new Date(2017,9,16,0,0,0) - new Date(2001, 0, 1, 0, 0 ,0)
// 529804800000
new Date(2017,9,17,0,0,0) - new Date(2001, 0, 1, 0, 0 ,0)
// 529891200000

算出了两个时间区间,然后写下 SQL:

1
select title, url  from history_visits left join history_items on history_visits.history_item = history_items.id where visit_time < 529891200 and visit_time > 529804800;

看起来跟我在 Safari 的数据是一致的,于是就导出 CSV 格式,算是顺利完成。

保存到待读列表

1
2
3
toread () {
osascript -e "tell application \"Safari\" to add reading list item \"$1\""
}

然后执行 toread http://xxx.xxx 就可以添加到 Safari 的待读列表了,可以自己写个批处理。

总结

其实在 ~/Library/Safari 目录下有 CloudTabs.db ,可以直接导出,不需要在 Safari 重新打开。
解决这种级别的问题,如丝般顺滑。

OLDER > < NEWER