Twitter の Archive から KML

via ttp://movatwitter.jugem.jp/?eid=60
モバツイの写ツがジオタグを付加できるようになったようなので時々試していたんだけど、私のやり方が悪いのか携帯が悪いのか全く付加されない。ExifTool がなんか警告だすのでこれが怪しいと思っている。
くやしいので Twitter の Archive から KML を生成して Google マップで表示してみた。うーん…。

http://maps.google.co.jp/?q=http://hetappi.pm.googlepages.com/hetappi-location-log.kml

一応のっけとくけど使い捨てなので。

#!/usr/bin/perl
use strict;
use warnings;
use utf8;

use URI;
use LWP::UserAgent;
use Web::Scraper;
use Geo::Coder::Google;
use Geo::GoogleEarth::Document;

my @statuses = get_twitter_archive('hetappi');

my $geocoder = Geo::Coder::Google->new( apikey => 'Your API Key' );
my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0', keepalive => 1 );
$geocoder->ua($ua);

my $doc = Geo::GoogleEarth::Document->new;
foreach my $s(@statuses) {
  next
    unless $s->{status} =~ /L:(.+?)[\[\s]/;

  my $name = $1;
  my $location = $geocoder->geocode( location => $1 );
  next
    unless $location;

  my $status = $s->{status};
  if ($status =~ m!<a href="http://f\.hatena\.ne\.jp/twitter/((\d{8})\d{6})"!) {
    my $img = sprintf '<img src="http://f.hatena.ne.jp/images/fotolife/t/twitter/%s/%s.jpg">', $2, $1;
    $status =~ s!http://f\.hatena\.ne.jp/twitt\.\.\.!$img!;
  }

  $doc->Placemark(
    name => $name,
    lat => $location->{Point}->{coordinates}[1],
    lon => $location->{Point}->{coordinates}[0],
    address => $location->{address},
    description => $status . '<br>' . $s->{date}
  );
}

binmode STDOUT, ':utf8';
print $doc->render();

sub get_twitter_archive {
  my $id = shift;

  my $scraper = scraper {
    process '//table[@id="timeline"]/tr', 'statuses[]' => scraper {
      process '//.', 'id' => ['@id', sub { $_[0] =~ /status_(\d+)/; $1; }];
      process '//span[@class="entry-content"]', 'status' => 'HTML';
      process '//abbr', 'date' => '@title';
    };
  };

  my $ua = LWP::UserAgent->new( keepalive => 1 );
  $scraper->user_agent($ua);

  my @statuses;
  for (my $page = 1; ; ++$page) {
    my $uri = URI->new(sprintf 'http://twitter.com/%s?page=%s', $id, $page);
    my $res = $scraper->scrape($uri);
    last
      unless $res->{statuses};
    push @statuses, @{$res->{statuses}};
  }

  @statuses;
}