URLのつぶやかれ数をperlで取得する方法メモ。

↑最近よく見るこれの数値をperlで取り出す方法
HTMLでは
<div class="textwidget"> <a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-lang="en" data-url="http://satoru.net">Tweet</a> <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
結論
http://urls.api.twitter.com/1/urls/count.jsonに
引数url(?url=http://satoru.netとか)投げたらjsonにcountが返ってくる
つまり、http://urls.api.twitter.com/1/urls/count.json?url=http://satoru.net こんなかんじ。
ソース
#!/usr/bin/perl
use WebService::Simple;
use Data::Dumper;
binmode STDOUT, ":utf8";
my $ws = WebService::Simple->new(
base_url => 'http://urls.api.twitter.com/1/urls/count.json',
response_parser => 'JSON'
);
my $json = $ws->get( { url => 'http://satoru.net/' } )->parse_response;
print Dumper(\$json);
結果
$VAR1 = \{
'count' => 4,
'url' => 'http://satoru.net'
};なんだ簡単なのねえ
おまけ(with memcached)
$memはmemcachedを宣言してね。
はてブ数とTwitter数を取得するための関数。URLを投げると値がかえってくる。
繰り返し使う場合を想定してurlをキーにmemcachedにキャッシュ。
sub get_hatena{
my $url = shift;
my $key = "hatena:$url";
if($mem->get($key)){
return $mem->get($key);
} else {
my $service = WebService::Simple->new(
base_url => 'http://api.b.st-hatena.com/entry.count?url=http://www.hatena.ne.jp/',
);
my $res = $service->get( { url => $url } );
my $count = $res->is_success && $res->content || "0";
$mem->set($key,$count,60*60*20);
return $count;
}
}
sub get_twitter{
my $url = shift;
my $key = "twitter:$url";
if($mem->get($key)){
return $mem->get($key);
} else {
my $service = WebService::Simple->new(
base_url => 'http://urls.api.twitter.com/1/urls/count.json',
response_parser => 'JSON'
);
my $res = $service->get( { url => $url } );
my $count = $res->is_success && eval{$res->parse_response->{count}} || "0";
$mem->set($key,$count,60*60*20);
return $count;
}
}