How many people Dugg it

dキーで現在のエントリーが何人にdiggられてるかをウィジェット部分に表示します。Fastladderでも動きます。

DiggAPIを使うときに何らかのアドレス*1をクエリに付けなきゃいけないので、LDRのユーザページのアドレス*2を付けて送信してます。なので、それが嫌な場合はappkeyのところをlocation.hrefとかに変えてください。

APIさわって分かったのは、DiggAPITwitterAPIと同じでcallbackに.が使えない。エンドポイントは大量に用意されてるのになぁ。あとAPIに関してではないけど、Diggは一つのURLに複数のエントリー(Diggではストーリーって言うらしい)が作れるって初めて知った。

// ==UserScript==
// @name           How many people Dugg it
// @namespace      http://shinten.info/
// @include        http://reader.livedoor.com/reader/*
// @include        http://fastladder.com/reader/*
// ==/UserScript==
(function () {
    var w = typeof unsafeWindow != "undefined" ? unsafeWindow : window;
    var _onload = w.onload;

    var diggCount = 0;
    var dugg = {};
    var appkey = w.$('welcome').childNodes[1].href;

    var onload = function () {
        w.Keybind.add('d', function () {
            var item = w.get_active_item(true);
            if (!item || dugg[item.id]) return;
            dugg[item.id] = true;
            diggCount++;
            var url = item.link;
            var param = {
                link     : url,
                type     : 'javascript',
                count    : 3,
                appkey   : appkey,
                callback : '_digg' + diggCount
            };

            w['_digg' + diggCount] = function (res) {
                var r = w.$('_digg' + item.id);
                if (res.total != '0') {
                    res.stories.forEach(function (story) {
                        var span = document.createElement('span');
                        var a = document.createElement('a');
                        a.href = story.href;
                        a.style.textDecoration = 'none';
                        span.innerHTML = story.diggs + 'diggs';
                        span.title = story.title;
                        a.appendChild(span);
                        r.appendChild(a);
                    });
                } else {
                    r.appendChild(document.createTextNode('0diggs'));
                }

                delete w['_digg' + diggCount];
                document.body.removeChild(s);
            };

            var s = document.createElement('script');
            s.type = 'text/javascript';
            s.charset = 'utf-8';
            s.src = ['http://services.digg.com/stories', query(param)].join('?');
            document.body.appendChild(s);
        });
    };

    w.entry_widgets.add('ldc_counter', function(feed, item){
        return [
            '<span id="_digg', item.id,
            '"><img src="http://digg.com/favicon.ico" style="vertical-align:middle;border:0px;margin-right:5px;"></span>'
        ].join('');
    }, 'How many people Dugg this entry');

    w.onload = function () {
        _onload();
        onload();
    };

    function query(param) {
        var buf = [];
        for (var key in param) {
            var value = param[key];
            buf.push([
                encodeURIComponent(key),
                encodeURIComponent(value)
            ].join('='));
        }
        return buf.join('&');
    }
})();

*1:利用実態を調査するためらしい。詳しくはhttp://apidoc.digg.com/ApplicationKeys

*2:たとえば[]http://reader.livedoor.com/user/watrty[]