今天算是写了第一个Chrome扩展了。早上在点点网上看到东京幻想的一组图,非常喜欢,习惯性地用谷歌类图搜索找大图。但是有个网站被Q了,死活打不开,这样的话就少了两张图,对于我这个强迫症来说是不能忍受的,于是开始酝酿写一个离线下载的玩意,更确切地说是一个代理下载。

在以前的VOA 聚合器项目中使用过一个HTTP 下载类,正好顺手就拿来用。这个类不知道是谁写的,其中有一个 SaveBinFile() 方法没有定义,我也不知道该如何修补,索性直接用 SaveToBin() 方法代替好了,加入一个判断目标文件是否是文本的逻辑,如果是文本的话给特殊扩展名(不是 htmhtml 的)加上 html 后缀。

这样折腾完之后呢,两张图片的地址作为 GET 方法的参数 url 传入进去,返回 json 字符串提示服务器端下载成功了,然后我访问 json 中提示的地址,两张图片轻松到手。

不过这样怎么配叫做不折腾会死星人呢。这种下载方式每次都这么折腾,何不来个舒服点的,做成一个Chrome 扩展,遇到无法访问的资源,直接右击链接就能下载,这样岂不快哉。随后参考了N 多资料(我比较笨),主要是官方的文档,终于做好了。顺便说一下,Chrome扩展程序开发人员文档(非官方中文版)这个站点翻译得不错。

现在的效果就是,右击链接,选择 CrossGet this!,扩展会在后台发送 Ajax 请求,文件下载完成之后,会自动新建一个标签页打开,可以浏览或是下载啦。如果下载失败的话,有桌面通知提示。

最后记一下用到的一些代码神马的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// 右键菜单。
var options = {"title": title, "contexts": contexts, "onclick": genericOnClick}; // genericOnClick 是回调函数。
var context = chrome.contextMenus.create(options);
// 桌面通知。
var notification = webkitNotifications.createNotification(
  'icon.png', 
  'Error!', 
  'Server returned an error.'
);
notification.show(); // 不调用show() 方法的话通知是不会显示的。
// Ajax 的GET 请求。
XmlHttp.open("GET", finalurl, true); // finalurl 中预先将要发送的GET 参数拼接好。
XmlHttp.send();
// 右键菜单的回调中如何获取链接的url。
var genericOnClick = function(info, tab){ // 不需要实际传入这两个参数。
  var link = info.linkUrl; //这样获取链接的url。
  console.log(link); // 可以输出到console 看一下。
}

因为这个用到了我的 kilu.de 免费空间,所以只是个人使用。