同步Chrome标签页

标签:Google Chrome

自从又买了台电脑后,我一直对如何同步2台电脑的Chrome标签页感到苦恼,最终还是决定自己写个插件了。

最初的想法是直接在一台电脑上发送请求,另一台电脑立刻接收到并打开标签。不过发现Chrome并不能这样通信,而且有时并没同时开2台电脑,那就比较无语了。
于是只能弄台服务器来中转了,能支持web socket或HTTP长连接的比较理想,只不过成本太高,别人也不一定敢用。
那么只好用Google的服务了。最简单的就是用Google Docs了,因为API都提供出来了,可惜被墙了…然后想到了Google Bookmarks

研究了一番后发现Google书签并没有公布API,但是用firebug抓一下包就能搞懂了。
它的API一共有2套,分别是XML和JSON形式,我想也没想就选择了JSON。

使用前需要获得cookie,由于是浏览器插件,直接让用户登录就行了,我也就不需要处理了~

然后就可以获取书签了。直接使用整个书签容易影响用户的正常使用,于是我用了“Sync My Tabs”这个标签名,获取地址是https://www.google.com/bookmarks/api/threadsearch?q=label%3A%22Sync%20My%20Tabs%22%20&nr=25。那个“nr=25”就是获取数目了,我估计这个数目也足够了,没人会一次同步那么多标签吧…
要注意的是拿到的结果并不能直接当成JSON来解析,前面多了几个字符,可以用JSON.parse(text.substr(5))来处理。

而添加和删除书签就需要token和threadId了。打开https://www.google.com/bookmarks/api/bookmarklet这个页面,然后查看源码不难找到,用代码表示就是:
var result = /SL.xt = '([^']+)'/.exec(text);
if (result) {
    token = result[1];
}

result = /a.threadID\):"([^"]+)"/.exec(text);
if (result) {
    threadId = result[1];
}

添加书签非常诡异,要构造一个td参数。这个参数虽然看上去是个JSON对象,但是得写成字符串形式。然而又不能使用JSON.stringify()方法,因为如果包含中文的话,得用unicode来表示。
找了下没发现有这种函数,于是自己写了个繁琐的实现:
function unicode(string) {
	if (string) {
		var length = string.length;
		var unicode_array = [];
		for (i = 0; i < length; ++i) {
			var charCode = string.charCodeAt(i)
			if (charCode < 256) {
				unicode_array.push(string[i]);
			} else {
				unicode_array.push('\\u');
				unicode_array.push(charCode.toString(16));
			}
		}
		return unicode_array.join('');
	} else {
		return string;
	}
}
然后将这串数据post到'https://www.google.com/bookmarks/api/thread?xt=' + encodeURIComponent(token) + '&op=Star'即可:
'td=' + encodeURIComponent('{"results":[{"threadId":"' + threadId + '","elementId":0,"authorId":0,"title":"' + unicode(title) + '","timestamp":0,"formattedTimestamp":0,"url":"' + url + '","signedUrl":"","previewUrl":"","snippet":"","threadComments":[],"parentId":"' + threadId + '","labels":["Sync My Tabs"]}]}')

删除就简单多了。在获取和添加书签时可以拿到书签的elementId,将要删除的书签的elementIds构造成如下数据:
'td={"deleteAllBookmarks":false,"deleteAllThreads":false,"urls":[],"ids":' + JSON.stringify(elementIds) + '}'
再post到'https://www.google.com/bookmarks/api/thread?xt=' + encodeURIComponent(token) + '&op=DeleteItems'即可。

其他还有list和搜索等功能,但我用不到,也就懒得研究了。

最终花了1天多的时间,Sync My Tabs这个插件终于诞生了,界面如下:



代码就不列出来了,自己打开看就知道了。

18条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?