livedoor Readerの24時間以内の未読をカウントするスクリプト
「一日当たりどれだけの数のエントリを処理しているのか」を調べたくなって、livedoor Readerの24時間以内の未読エントリを数えるスクリプトを書いてみました。
注意ですが、このスクリプトは実行環境にも、livedoorにも優しくありません。ヘビーです。ただ、実際にこうしたことが知りたいという状況があったということと、このまま使うわけにはいかなくても、Perlでlivedoor ReaderのAPIを利用するためのサンプルスクリプトにはなるでしょう。
use WWW::Mechanize;
use JSON;
use Jcode;my $id = ""; # livedoor ID
my $pass = ""; # livedoorパスワード
my $mech = WWW::Mechanize->new;
my %subs = ();{# ログイン
my $uri = URI->new('http://member.livedoor.com/login/index');
$uri->query_form(['livedoor_id' => $id, 'password' => $pass]);
my $res = $mech->post($uri);
}{# 未読subscribeのidを取得
my $uri = URI->new('http://reader.livedoor.com/api/subs');
$uri->query_form(['unread' => 1]);
my $res = $mech->post($uri);
my $obj = JSON::jsonToObj($res->content);
foreach my $sub (@{$obj}) {
$subs{$sub->{'subscribe_id'}} = {'id' => $sub->{'subscribe_id'}, 'title' => $sub->{'title'}};
}
}{# 各未読subscribeの未読エントリを取得
my $from = time - (24*60*60);
my $count = 0;
foreach my $sub (values(%subs)) {
$sub->{'count'} = 0;
my $uri = URI->new('http://reader.livedoor.com/api/unread');
$uri->query_form(['subscribe_id' => $sub->{'id'}]);
my $res = $mech->post($uri);
my $obj = JSON::jsonToObj($res->content);
foreach my $item (@{$obj->{'items'}}) { $sub->{'count'} += 1 if ($item->{'created_on'} >= $from); }
$count += $sub->{'count'};
printf("%s : %d\n", jcode($sub->{'title'}, 'utf8')->sjis, $sub->{'count'});
}
print "----\ntotal : $count\n";
}
今回は受け取るデータ形式がJSONなので、HTML解析やXML/Feed解析は不要で、JSONモジュールを使用。mech+TreeBuilder+XML::*PPではなくmech+JSONという組み合わせになります。
livedoor ReaderのAPIの叩き方は「pybigi: PythonでLivedoor Readerから未読の記事を取得する」を参考にしました。ありがとうございました。