Google的图片代理

前天Google Buzz开通了,发现它会把Google Reader的文章都显示出来,折叠起来的话,文章里的图片会缩小,无聊看了一下地址,就是我上篇文章里的Ghost图片,发现地址如下

https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2Fdl.dropbox.com%2Fu%2F2992664%2Fblog%2Fcod6_ghost.jpg&container=focus&gadget=a&no_expand=1&resize_h=120&rewriteMime=image%2F*

并非用图片的原始地址,也不是用CSS来缩小的,也就是Google自己去原始地址抓取后,缩放一下再传过来。看到地址里有两个参数值得注意

  • 一个是“url”,看样子原始图片地址了,我随便找其它的图片地址替换一下,结果提示下载“p.txt”的文件,保存,改扩展名为“jpg”,果然是张图片。
  • 还有把“resize_h”,看来是缩放图片的宽度,改为0试试,再下载,果然表示不缩放,对比一下原始图片的md5,一样的。

哈哈,这下有得玩了,可以利用这个功能来做个图片代理,Google的高速服务器,不需要用户验证,还支持https的,爽!方法就是写个脚本,把网页里面的图片地址全部改写一下,几行代码而已,不过这方法不支持在css里引用的图片。实现了3种脚本,各有优劣,按需使用吧。经测试,还可以反反图片盗链的,哈哈。

Greasemonkey

最先想到就用Greasemonkey来实现,上传到userscript了,安装页面猛击这里。匹配启用网页比较粗暴地写成“http://*”,改成你需要的网址,或者你手动来启用。
更新:Greasemonkey版本加入自动执行支持,详情请看这里

Bookmarklet

也可以弄成书签,需要时点击一下就行了,不用刷新,随叫随用。新建一个书签,名称为“Google图片代理“,粘贴下面代码到地址一栏。

javascript:(function(){prefix = "https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url="; suffix = "&container=focus&gadget=a&no_expand=1&resize_h=0&rewriteMime=image%2F*"; images = document.getElementsByTagName("img"); for (var i = 0; i < images.length; i++) {     if (images[i].src.indexOf(prefix) == -1) {         images[i].src = prefix + encodeURIComponent(images[i].src) + suffix;     } }})();

FireGestures

也写一个FireGestures脚本,猛击这里看代码,复制粘贴为新脚本就可以了。因为我也使用了Noscript这个扩展,如果没把网站加进白名单的话,Bookmarklet是无效的,所以改用FireGestures。

嵌入到网页里

有些人的把图片放在Picasa上,转移起来太麻烦。对于wordpress博客,建立一个文本widget,把Greasemonkey代码用“<script type=”text/javascript”></script>”包围粘贴进去,这样就让访客自动执行这个脚本了。如

<script type="text/javascript">prefix = "https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url=";
suffix = "&container=focus&gadget=a&no_expand=1&resize_h=0&rewriteMime=image%2F*";
images = document.getElementsByTagName("img");
for (var i = 0; i < images.length; i++) {
    if (images[i].src.indexOf(prefix) == -1) {
        images[i].src = prefix + encodeURIComponent(images[i].src) + suffix;
    }
}</script>

普通链接

相当于bookmarklet的变种,就像我这个博客,之前的图片用的flickr上,有些人是看不到或者打开过慢,可以在侧边栏放一个链接让访客去点,同样把Greasemonkey代码用“javascript:(function()“和“)()”包围,双引号要转义掉,粘贴到href属性里,html代码如下

<a href='javascript:(function(){prefix = "https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url="; suffix = "&container=focus&gadget=a&no_expand=1&resize_h=0&rewriteMime=image%2F*"; images = document.getElementsByTagName("img"); for (var i = 0; i < images.length; i++) {     if (images[i].src.indexOf(prefix) == -1) {         images[i].src = prefix + encodeURIComponent(images[i].src) + suffix;     } }})();'>这个链接</a>

WordPress插件

也写了WordPress插件版本,不修改数据库,仅在预览、发布和输出RSS改写,可随时切换为原始地址,详情请看这篇文章

秒掉Opera Turbo的方法就是把脚本中的地址参数“resize_h”后面的值改成你想要的图片宽度,Google服务器会替你缩放图片。用这方法能对付放在Picasa上的图片,或者干脆在服务端添加改写代码,应该也不难。

注:原来我以为Greasemonkey的脚本是在网页加载完成后才执行的,就是原始地址图片都显示出来后,再用代理下载一次,重复浪费资源了。这说法不正确,脚本应该是DOMContentLoaded事件后执行,即HTML代码已经解析好,Firefox同时执行脚本和加载图片(这时地址还未改变)。脚本很快就执行完,地址已经被改变,Firefox就发现图片地址改变了,就放弃加载原始地址,改加载新地址,即Firefox刚下载了页面前几张的图片的一小段数据就放弃下载,所以不算是重复下载的。

This entry was posted in 浏览器 and tagged , , , , . Bookmark the permalink.

8 Responses to Google的图片代理

  1. harnack says:

    这个代理好,就是不知能存活多久。

    回复回复
  2. Terrence says:

    代码有一处问题:参数中的原始地址需要用URL编码表示

    回复回复
  3. muzuiget says:

    确实,已经添加上了,多谢提示。

    回复回复
  4. ABitNo says:

    善于观察的孩子

    回复回复
  5. ajxy183 says:

    楼主好聪明,我刚安装了FireGestures,试用了下你的脚本,挺好使的。就是好像不能从需要用户名密码登陆的网站取图片?有什么办法可以实现吗

    回复回复
  6. muzuiget says:

    是不能的,无办法,只能用传统的代理方式。

    回复回复
  7. 雅蠛蝶 says:

    怎么把这个图片代理和Greader结合起来呢?
    这个Greasemonkey对Greader没效果

    回复回复
  8. muzuiget says:

    已经加入这对GR的支持,详情请看我的新文章。

    回复回复

发表评论

您的电子邮箱不会被公开。 标记为 * 的区域必须填写

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">