「ReverseHTTPで誰よりも速く...」をブラウザだけで実現してみた。
Big Sky :: ReverseHttpで誰よりも速く「はてなブックマーク」に反応するツール書いた。
おもしろそうだったのでネタをパクってみた。
ただパクるだけじゃ面白くないので、ブラウザ単体(Firefox限定)で動くようにして、お気に入りユーザーのブクマも通知されるようにしてみた。(でも、けっこう取り漏れが発生してるっぽい...)
使い方
まずはてなブックマークの「設定」ページの「WebHook」の設定を行ないます。
- イベント通知を受け取るURL
- 上記例の"snaka-hatebu-hook"の部分を任意の文字列に置き換えます。
- キー
- ここも任意の文字列を入力します。”キーを自動生成する”を選んで自動生成することをお勧めします。
次に、拡張機能側の設定を行ないます。
Firefoxの[ツール]-[アドオン]から"HateBuFavbub"の設定ボタンをクリック、すると設定画面が現れるので、以下のように、はてブの設定ページで入力したのに合わせて入力。
上記の設定が完了したら、ブラウザを再起動して、
あとはじっとブクマされるのを待ちます....
パクリでスミマセン。
追記
ライブラリを除いたメインのロジックのソースを晒しとく。
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
- Growl for Windows に対応した (0.2.0)
- ソースはこの辺に置いてます。→ http://github.com/snaka/HateBuFavbub/tree/master
追記2:2009/8/9
- ブクマコメントもらったので訂正。誤「機能拡張」→正「拡張機能」(単に知りませんでした)