はじめてぐりもん書いた
初めてのGreasemonkeyにチャレンジ。
Livedoor Readerからソーシャルブックマークへのクリップ機能を拡張するために書いた。既にあるとか言うな。練習なんだから。
やりたかったこと
- 一発クリップ(はすでにある)
- 特定のタグをつける
- タグを指定できるようにする
って感じ。名前がLDR2SBMのくせに今のところdel.icio.usだけ対応。しかも作りかけ。
おいおい勘違いしまくってるよとかあったらおしえてほしい!
// ==UserScript== // @name LDR2SBM // @namespace http://d.hatena.ne.jp/kidd-number5/ // @include http://reader.livedoor.com/reader* // ==/UserScript== // この(function(){}();が作法のひとつくさい) (function() { var w = unsafeWindow; var _onload = w.onload; var add_api_url = "https://api.del.icio.us/v1/posts/add?"; // この関数もお決まりくさい。なぜかみんな最後に書いてるけど理由あんのかな。 w.onload = function(){ _onload(); onload(); }; // Keybindを設定して、ショートカットキーを作った。 // キーがおされるとコールバック関数が起動する var onload = function() { with(w) { Keybind.add("D", call_del_icio_us); Keybind.add("T", call_del_icio_us_w_tag); Keybind.add("N", call_del_icio_us_nsfw); } }; // del.icio.us にadd // ここらへんにコールバック関数を列挙。 // まだ作ってないけど、カスタマイズバージョン的には // タグをつけるためのプロンプトが出てくるバージョンと、 // 自動的にnsfw(職場で見るには不適切)タグをつけようかなと。 // nsfwについては、URLで自動判別までしたいのだけどね。 function call_del_icio_us() { // このget_active_itemはLDR内で使われている関数を勝手につかっちゃってるらしい。 var item = w.get_active_item(true); // これもLDRの関数。噴出しの中に何か表示。ちょっとしたデバッグに使った。 w.message("del.icio.us"); // setTimeoutで囲うのが最近の流儀らしい window.setTimeout(function() { // ぐりもんによる外部へのHTTPリクエスト。 // あえてAuthorizationヘッダーは送らないで、ブラウザに任せる。 // もし認証済みでなければ普通にベーシック認証のWindowが出てくるので、 // そこでいれればいいやと思った。 GM_xmlhttpRequest({ method: 'POST', url: add_api_url, data: 'url=' + encodeURIComponent(item.link) + '&tags=' + 'test' + '&description=' + encodeURIComponent(item.title), headers: { 'Content-type' : 'application/x-www-form-urlencoded', }, onload: onloadHandler }); }, 0); }; function call_del_icio_us_w_tag() { var tag_string = w.prompt("tag?"); w.message(tag_string); }; function call_del_icio_us_nsfw() { w.message("nsfw"); }; // XHRしたあとのお作法っぽい。 // DOM ParserやらXPathやら。 // ぐりもんのXHRはresponseTextじゃないと取れないらしく // responseXMLとかはないらしい。 function onloadHandler(detail) { var wp = new XPCNativeWrapper(window, "DOMParser()"); var parser = new wp.DOMParser(); var res = parser.parseFromString(detail.responseText, "text/xml"); var result = res.getElementsByTagName("result"); w.message(result[0].getAttribute("code")); }; })();