TwitterのURLのつぶやき数の取得方法@perl

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;
	}
}