自分の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::XPathXPath使うし。XML::DOMとかXML::SAXなんてまともに触ったこともないんじゃないかなぁ。