use strict; use warnings; use XML::RSS; use LWP::UserAgent; use WebService::Hatena::Diary; use Config::Pit; use DateTime; use DateTime::Format::DateParse; use HTML::Element; # get twitter feed my $ua = LWP::UserAgent->new; $ua->env_proxy; my $feed = XML::RSS->new; my $twitterauth = pit_get("twitter.com", requires => { username => "Your username on Twitter", } ); $feed->parse( $ua->get( 'http://twitter.com/statuses/user_timeline/' . $twitterauth->{username} . '.rss')->content ); # login to hatena diary & get draft list my $hatenaauth = pit_get("hatena.ne.jp", requires => { username => "Your Hatena ID", password => "Your Password on Hatena", }); my $hateda = WebService::Hatena::Diary->new({ mode => 'draft', username => $hatenaauth->{username}, password => $hatenaauth->{password}, $hatenaauth->{dusername} ? (dusername => $hatenaauth->{dusername}) : () }); my @entrylist = grep { $_->{title} =~ m{^Twitter \d+-\d+-\d$} } $hateda->list; my $now = DateTime->now(time_zone => 'Asia/Tokyo'); print Dumper([$feed]); my %bag = map { $_->{title} => $_ } $hateda->list; my %dirty; for my $item ( @{$feed->{items}} ) { my $itemdate = DateTime::Format::DateParse($item->{pubDate}); $itemdate->set_time_zone('Asia/Tokyo'); next if $itemdate->ymd ne $now->ymd; my $hatedatitle = "Twitter " . $itemdate->ymd; my $entry = do { if ( exists $bag{$hatedatitle} ) { $bag{$hatedatitle}; } else { my $newentry = { date => $itemdate->ymd, title => $hatedatitle, content => '' }; $newentry->{edit_uri} = $hateda->create($newentry); $bag{$hatedatitle} = $newentry; $newentry; } }; if ( index($entry->{content}, $item->{'link'})<0 ) { # append my $tweet = $item->{title}; $tweet =~ s/^[^:]+:\s*//; my $anchor = HTML::Element->new('a', href => $item->{link}); $anchor->push_content($itemdate->hms); my $para = HTML::Element->new('p'); $para->push_content($tweet, '[', $anchor, ']'); $entry->{content} .= $para->as_HTML; $dirty{$entry} = 1; } } # update! $hateda->update($_->{edit_uri},$_) for keys %dirty;