「ReverseHTTPで誰よりも速く...」をブラウザだけで実現してみた。

Big Sky :: ReverseHttpで誰よりも速く「はてなブックマーク」に反応するツール書いた。

おもしろそうだったのでネタをパクってみた。
ただパクるだけじゃ面白くないので、ブラウザ単体(Firefox限定)で動くようにして、お気に入りユーザーのブクマも通知されるようにしてみた。(でも、けっこう取り漏れが発生してるっぽい...)

拡張機能のインストール

拡張機能として実装してみました。
以下よりダウンロードできます。

Mac + GrowlWindows + Growl for Windows で動作確認済み。

使い方

まずはてなブックマークの「設定」ページの「WebHook」の設定を行ないます。

イベント通知を受け取るURL
上記例の"snaka-hatebu-hook"の部分を任意の文字列に置き換えます。
キー
ここも任意の文字列を入力します。”キーを自動生成する”を選んで自動生成することをお勧めします。
※上記の文字列は平文でInternet上に流れるので、重要なアカウントのパスワードみたいな人に知られたらマズいようなものは避けた方がいいです。

次に、拡張機能側の設定を行ないます。
Firefoxの[ツール]-[アドオン]から"HateBuFavbub"の設定ボタンをクリック、すると設定画面が現れるので、以下のように、はてブの設定ページで入力したのに合わせて入力。
http://gyazo.com/00a589aff7ac4b51843245ce87651a9f.png

上記の設定が完了したら、ブラウザを再起動して、

あとはじっとブクマされるのを待ちます....













http://gyazo.com/b68aeabf114738d03d962ca9420db6cd.png
デタ━━━゚(∀)゚━━━!!





パクリでスミマセン。

追記

ライブラリを除いたメインのロジックのソースを晒しとく。

window.HateBuFavbub = (function() {
 
  let debug = function(msg) dump("HateBuFavbub: " + msg + "\n");
 
  debug("load subscripts ...");
  loadSubscripts([
    "chrome://HateBuFavbub/content/lib/jquery-1.3.2.js",
    "chrome://HateBuFavbub/content/lib/httpd.js"
  ]);
 
  function startHttpServer(label, key) {
    debug("start httpd...");
    switchAccessPoint("http://www.reversehttp.net/reversehttp");
    new HttpServer(
        label,
        function(req) {
            req.respond(200, "OK", {}, "ok");
            var param = parse_qs(req.body);
            dump(param.toSource());
 
            if (param.key != getPref("key")) {
              debug("*** REJECTED ***");
              return;
            }
 
            if (param.status != "favorite:add"
            && param.status != "add"
            && param.status != "update")
                return;
            Growl.notify(
                formatTitle(param.username),
                formatComment(param.title, param.comment),
                getUserIcon(param.username),
                param.url,
                function(cookie) {
                  getBrowser().loadOneTab(cookie);
                }
            );
        }, {
            debug: debug
        }
    );
  }
 
  function formatTitle(user) {
    return user + " \u3055\u3093\u304C\u30D6\u30AF\u30DE\u3057\u307E\u3057\u305F\u3002";
  }
 
  function formatComment(title, comment) {
    var formatted = convert(title);
    if (comment.length > 0)
      formatted += "\n\"" + convert(comment) + "\"";
    return formatted;
  }
 
  let Growl = (function() {
    return {
      notify: function (title, message, icon, url, callback) {
        debug("icon:" + icon);
        Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService)
        .showAlertNotification(icon, title, message, true, url, {
          observe : function(subject, topic, url) {
            if (topic != "alertclickcallback") return;
            callback(url);
          }
        });
      }
    };
  })();
 
  function loadSubscripts(scripts) {
    const loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]
                   .getService(Ci.mozIJSSubScriptLoader);
    scripts.forEach(function(script) {
      debug("load subscript " + script + "...");
      loader.loadSubScript(script);
    });
  }
 
  function convert(source) {
    return source.replace(/\+/g, " ");
  }
 
  function getUserIcon(user) {
      var result = "http://www.hatena.ne.jp/users/" + user.substr(0, 2) + "/" + user + "/profile.gif";
      dump(result + "\n");
      return result;
  }
 
  function getPref(key) {
    var prefs = Components.classes["@mozilla.org/preferences-service;1"]
                          .getService(Components.interfaces.nsIPrefService);
    prefs = prefs.getBranch("extensions.hateBuFavbub.");
    return prefs.getCharPref(key);
  }
 
  return {
    start : startHttpServer,
    get label() getPref("label"),
    get key() getPref("key"),
    restart : function() {
      this.start(this.label, this.key);
    },
  };
})();
 
// startup
if (HateBuFavbub.label != "" && HateBuFavbub.key != "")
  HateBuFavbub.start(HateBuFavbub.label, HateBuFavbub.key);

追記:2009/8/9

追記2:2009/8/9

  • ブクマコメントもらったので訂正。誤「機能拡張」→正「拡張機能」(単に知りませんでした)