Opera で Google Web History を使えるようにする UserJS

新年一発目のエントリ。あけましておめでとうございます。


Google Web HistoryをOperaで使うにはどうすればいいのか。 - あまたの何かしら。
面白すぎたのでアイディアを丸ごともらってスクリプトを書いてみた。


enablegooglewebhistory.user.js

// ==UserScript==
// @name EnableGoogleWebHistory
// @author mallowlabs
// @namespace http://mallowlabs.s206.xrea.com/
// @version 0.0.2
// @license public domain
// @description : Enable Google Web History
// @published 2007-01-05
// @modified 2006-01-05
// @include *
// ==/UserScript==

// see also
// http://www.scss.com.au/family/andrew/opera/panels/pagerank/
// http://d.hatena.ne.jp/amatanoyo/20080104/1199450996
// =========================================
(function(){

    // avoid frame
    if (window.self != window.parent) return;

    var r=function(x,y){
        return Math.floor((x/y-Math.floor(x/y))*y+.1);
    },
    ch=function(url){
        url='info:'+url;
        var c=[0x9E3779B9,0x9E3779B9,0xE6359A60],i,j,k=0,l,f=Math.floor,
        m=function(c){
            var i,j,s=[13,8,13,12,16,5,3,10,15];
            for(i=0;i<9;i+=1){
                j=c[r(i+2,3)];
                c[r(i,3)]=(c[r(i,3)]-c[r(i+1,3)]-j)^(r(i,3)==1?j<<s[i]:j>>>s[i]);
            }
        };
        for(l=url.length;l>=12;l-=12){
            for(i=0;i<16;i+=1){
                j=k+i;c[f(i/4)]+=url.charCodeAt(j)<<(r(j,4)*8);
            }
            m(c);
            k+=12;
        }
        c[2]+=url.length;
        for(i=l;i>0;i--)
            c[f((i-1)/4)]+=url.charCodeAt(k+i-1)<<(r(i-1,4)+(i>8?1:0))*8;
        m(c);
        return'6'+c[2];
    };
    var url=document.location;

    /* create image element */
    new Image().src = 'http://www.google.com/search?client=navclient-auto&ch='+ch(url)+'&features=Rank&q=info:'+escape(url);
})();

仕組み

クロスドメイン制約がとにかく面倒なので
表示されない img タグ Image の src 属性に指定して
PageRank API の URL を直接叩いている。

PageRankを叩けばいいっていうことは、ブラウザ上に表示させなくてもいいよなぁと思ったり。

http://d.hatena.ne.jp/amatanoyo/20080104/1199450996

というアイディアの丸パクリ。


PageRank API の URL の算出には
Google PageRank Button - Panels - Opera - Andrew Gregory's Web Pages
をそのまま利用した。


お試しあれ。

2008/01/05 追記

2点つっこませてください。
まず、img要素を追加しなくてもnew Image().src="〜"で行けるはず。
あと、変数urlがグローバルになってます。

http://del.icio.us/BNJ

有益なアドバイスありがとうございます。
ご指摘いただいた点をスクリプトに反映しました。

2008/01/11 追記

id:edvakf のおかげで海外のサイトでも取り上げられているみたいなので
Userscript.org にアップロードしてみました。
どうやら Opera だけじゃなくて IE / Firefox / Safari / Konqueror でも動くみたいです。
Google Toolbar 無しで Google Web History を使いたい人は使ってやってください。