Google の検索結果に delicious のブックマーク数を付け加える GreaseMonkey スクリプト

XMLHttpRequest だとクロスドメインにリクエストできないらしい。
GreaseMonkey の場合は GM_xmlhttpRequest でクロスドメインに非同期的にリクエストできる。
それのサンプルとしてタイトルにあるようなものを書いてみたんだけど、MD5を求めるのにHugeDomains.com - Shop for over 300,000 Premium Domainsを使っているせいで、通信量が多い気がする。


見た目はこんなかんじ。


以下コード。

// ==UserScript==
// @name           Google with Delicious
// @namespace      http://d.hatena.ne.jp/eagletmt/
// @include        http://www.google.*/search?*
// ==/UserScript==

(function(){
  var f = function(a) {
    GM_xmlhttpRequest({
      method: 'GET',
      url: 'http://www.hashserver.com/md5/?info='+encodeURIComponent(a.href),
      onload: function(xhr) {
        if (xhr.readyState == 4 && xhr.status == 200) {
          var md5 = xhr.responseText;
          g(md5, a);
        }
      }
    })
  }

  var g = function(md5, a){
    GM_xmlhttpRequest({
      method: 'GET',
      url: 'http://feeds.delicious.com/v2/json/urlinfo/'+md5,
      onload: function(xhr) {
        if (xhr.readyState == 4 && xhr.status == 200) {
          var info = eval(xhr.responseText)[0];
          if (info) {
            var div = document.createElement('div');
            var link = document.createElement('a');
            link.href = 'http://delicious.com/url/'+md5;
            link.appendChild(document.createTextNode('delicious '+info.total_posts+' users'));
            div.appendChild(link);

            var r = document.evaluate('../../div[@class="s" or @class="s hc"]', a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
            if (r.snapshotLength == 1) {
              var s = r.snapshotItem(0);
              s.parentNode.insertBefore(div, s);
            }
          }
        }
      }
    })
  }

  var res = document.evaluate('//a[@class="l"]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

  for (var i = 0, len = res.snapshotLength; i < len; i++) {
    f(res.snapshotItem(i));
  }
})()