JavaScript でソーシャルカウントを非同期で取得する

,

Tweet Buttonなどを独自にデザインしたかったので作った。
まぁ、Twitter、Facebook、はてぶしか取れないんだけど。。

var socialCount = (function() {

'use strict';

var _url = window.location.href,
_api = {
twitter: 'http://urls.api.twitter.com/1/urls/count.json',
facebook: 'https://graph.facebook.com/',
hatena: 'http://api.b.st-hatena.com/entry.count?callback=?'
};

function _getParameter(vendor) {
if ( vendor === 'facebook' ) {
return {'id':_url};
}
return {'url':_url};
}

function _getPromise(vendor) {
if ( ! _api[vendor] ) return;

var defer = $.Deferred();
$.ajax({
url: _api[vendor],
dataType: 'jsonp',
data: _getParameter(vendor),
success: defer.resolve,
error: defer.reject
});
return defer.promise();
}

var socialCount = {
get: function(vendors, callback) {
if ( typeof callback !== 'function' ) return this;
if ( ! $.isArray(vendors) ) vendors = [vendors];
var promises = $.map(vendors, function(vendor) {
return _getPromise( vendor );
});
$.when.apply($, promises).then(function() {
var ret = {};
$.each(arguments, function(i, res) {
var data = res[0];
ret[vendors[i]] = data.shares != null ? data.shares : data.count != null ? data.count : data;
});
callback.call(socialCount, ret);
});
return this;
},
url: function(url) {
if ( url ) _url = url;
return this;
}
};

return socialCount;
}());

カウントを取るには、socialCount.get()を呼び出す。
第1引数にはカウントを取得したいサービスを配列で書く。第2引数にはコールバック関数を記述する。

$(function() {
socialCount.get(['twitter', 'facebook', 'hatena'], function(res) {
console.log(res);
});
});

デフォルトはlocation.hrefのカウントを取得するようになっているが、socialCount.url()で任意のURLのカウントを取ることもできる。

$(function() {
socialCount.url('http://www.yahoo.co.jp/').get(['twitter', 'facebook', 'hatena'], function(res) {
console.log(res);
});
});

こんな感じでまぁなんとか。。
PocketとGoogle+を追加したい。