vimperator の copy.js で短縮 URL を取得できるようにした

twitter とかで短縮 URL を使いたくなることがある。でも僕の使ってる twitter クライアントはそういうのをサポートしてない。http:// ... って書いたらそのまま出てくる。長い。

というわけで、vimperator の copy.js を使って、今見てるページの短縮 URL をクリップボードにコピーできるようにしてみた。

短縮 URL を取得する Web API

「常識で考えて bit.ly だろ」と思って bit.ly の API ドキュメントを読んでみたら、どうやらユーザー登録がいるもよう。むう、なんかめんどくさそう。やめ。

代わりに Google URL Shortener(goo.gl) を使うことにした。API のドキュメントを読んでみる。うん、簡単そうだ。ユーザー登録とかいらない。

普通に http://ggl-shortener.appspot.com/?url=encodeURIComponent(URL) で GET リクエストを投げればよさげ。

で、レスポンスとしてこんな感じの JSON が返ってくる。

{"short_url": "http://goo.gl/fbsS"}

いいよー、いいよー。

copy.js 側の設定

copy.js の方は「copy.js をアップデート よりカスタマイズ可能になりました - hogehoge」の記事を参考に書いてみた。

ポイントは custom ってとこ。そこに関数を登録しておくと、関数を呼び出した戻り値の文字列がクリップボードにコピーされるようになる。

結局こんな感じで .vimperatorrc に書いた。

js <<EOF
liberator.globalVariables.copy_templates = [
    { label: 'goo.gl', value: 'get goo.gl short url',
        custom: function() {
            var ret = "";
            var url = 'http://ggl-shortener.appspot.com/'
            url += '?url=' + encodeURIComponent(content.location.href);

            var xhr = new XMLHttpRequest();
            xhr.open("GET", url, false); // 同期的に処理する
            xhr.send(null);
            if (xhr.status === 200) {
                ret = JSON.parse(xhr.responseText).short_url;
            }

            return ret;
        }
    }
];
EOF
2010/01/19 追記

コメントで紹介してもらったページを参考に、 util.httpGet を使って書き直してみた。短くなってすっきり。

js <<EOF
liberator.globalVariables.copy_templates = [
    { label: 'goo.gl', value: 'get goo.gl short url',
        custom: function() {
            var ret = "";
            var xhr = util.httpGet(
                "http://ggl-shortener.appspot.com/?url=" + encodeURIComponent(buffer.URL));
            if (xhr && xhr.status === 200) {
                ret = JSON.parse(xhr.responseText).short_url;
            }
            return ret;
        }
    }
];
EOF

試してみる

これで :copy goo.gl で今表示してるページの短縮 URL がコピーされるはず。早速このブログのトップページで試してみる。

よしよし、ちゃんとできてる。

最新の copy.js は CodeRepos にあるので、みんなも参考にしてね。

2010/01/16 追記

よく考えたら goo.gl のサービスはまだ一般に公開されていない。上にあげたドキュメントも Google 公式のものじゃない。なので、今後 API の仕様が変わるかもしれない、ってことに注意。