#!/usr/bin/perl -w use strict; use utf8; use Encode; use LWP::Simple; use XML::RSS; use Digest::MD5 qw(md5_hex); use IO::File; use Fcntl qw(:flock); use Net::Twitter; use HTTP::Lite; # # login for Twitter # our $twit = Net::Twitter->new( username=>'hotentry', password=>'xxxxxxx' ); # # get hotentry # our $cacheDir = '/path/to/.cache/rss'; mkdir $cacheDir, 0755 unless -e $cacheDir; my $url = 'http://b.hatena.ne.jp/hotentry?mode=rss'; my $rss_cache = $cacheDir . '/' . md5_hex($url) . '.xml'; my $history_cache = $cacheDir . '/' . md5_hex($url) . '.post'; my $status = LWP::Simple::mirror($url, $rss_cache) ; if($status == RC_NOT_MODIFIED || is_error($status)){ die "NOT modified"; } # # get history # my @histories = (); if(-f $history_cache){ my $ior = IO::File->new($history_cache, 'r'); @histories = $ior->getlines; $ior->close; } # # parse rss # my $rss = XML::RSS->new(); $rss->parsefile($rss_cache); my @rss_items = @{$rss->{items}}; my @rss_links = (); my %rss_hash = (); for my $item (@rss_items){ utf8::encode($item->{title}); utf8::encode($item->{link}); push(@rss_links, $item->{link}); $rss_hash{$item->{link} . "\n"} = $item->{title}; } # # update twitter # my $iow = IO::File->new($history_cache, 'w+'); my @diff_links = &lookup(\@rss_links, \@histories); for my $link (@diff_links){ &update_twit($rss_hash{$link}, $link); } # # update history # my @new_history = (@diff_links, @histories); for my $item (@new_history){ $iow->print($item); } $iow->close; # # update message for twitter # sub update_twit(){ my($title, $link) = @_; my $hatena_url = &trim('http://b.hatena.ne.jp/entry/' . $link); my $http = new HTTP::Lite; my $http_res = $http->request('http://tinyurl.com/api-create.php?url=' . $hatena_url) || die('unable to get tiny url'); my $tiny_url = $http->body(); my $msg = $title . ' ' . $tiny_url; print $msg . "\n"; $twit->update($msg); } # # get diff array # sub lookup (\@){ my ($target, $base) = @_; my %seen = (); my @diff= (); foreach my $item (@$base) { $seen{$item} = 1; } foreach my $item (@$target) { $item = $item . "\n"; unless ($seen{$item}) { push(@diff, $item); } } return @diff; } # # trim # sub trim { my $val = shift; $val =~ s/^\s*(.*?)\s*$/$1/; return $val; }