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

#javascript, #jquery

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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引数にはコールバック関数を記述する。

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

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

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

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