自分のfollowingsをLast Updateでソートする
via 自分の全FollowingをLast Update日付毎にソートするPerl Script - smokeymonkey@ついったー部 - はてなグループ::ついったー部
これを見て、自分でも書いてみた。そのまま書いてもアレなので、Web::Scraperでスクレイピングするのと違って、私のはAPIを叩く版。UTF-8で出力してるので、Windowsな人はコマンドプロンプトからファイルにリダイレクトするとか、ファイルに書き出すようにするとか、パイプでiconvに繋ぐとか。まあ、適当に。
#!/usr/bin/perl use strict; use warnings; use DateTime::Format::HTTP; use Encode qw/encode/; use HTTP::Request; use LWP::UserAgent; use XML::XPath; my $USERNAME = 'USERNAME'; my $PASSWORD = 'PASSWORD'; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => "http://twitter.com/users/show/$USERNAME.xml"); $req->authorization_basic($USERNAME, $PASSWORD); my $res = $ua->request($req); $res->is_success or die "err: ", $res->status_line; my $tree = XML::XPath->new(xml => $res->content); my $following = $tree->findvalue('/user/friends_count')->value; my $pages = sprintf '%d', 1 + $following / 100; my @followings; for (my $p = 1; $p <= $pages; $p++) { warn "Getting page No.$p...\n"; $req = HTTP::Request->new(GET => "http://twitter.com/friends?page=$p"); $req->authorization_basic($USERNAME, $PASSWORD); my $res = $ua->request($req); if ($res->is_success) { my $xp = XML::XPath->new(xml => $res->content) or die "err: $!"; my $ns = $xp->find('/users/user'); foreach my $node ($ns->get_nodelist) { my $name = $node->findvalue('./name')->value; $name = encode 'utf8', $name; my $created_at = $node->findvalue('./status/created_at')->value; $created_at =~ s/\+0000//; $created_at = DateTime::Format::HTTP->parse_datetime($created_at)->epoch; my $screen_name = $node->findvalue('./screen_name')->value; push @followings, { name => $name, created_at => $created_at, screen_name => $screen_name, }; } } else { die "err: ", $res->status_line } sleep 2; } my @sorted = sort { $b->{created_at} <=> $a->{created_at} } @followings; foreach (@sorted) { print "$_->{screen_name}, $_->{name}, ", scalar localtime $_->{created_at}, "\n"; }
というかだね、私はXPath以外の扱い方も覚えるべきだと思うんだ。XML扱うときはXML::XPath使うし、HTMLのときもHTML::TreeBuilder::XPathでXPath使うし。XML::DOMとかXML::SAXなんてまともに触ったこともないんじゃないかなぁ。