#!/usr/bin/perl use strict; use warnings; use WWW::Mixi; use Jcode; use LWP::Simple; use XML::RAI; use Date::Parse; use Lingua::JA::Jtruncate qw(jtruncate); my $logdir = '/home/nekoana/perl/'; my $mixi_id = 'xxx@xxx.jp'; my $mixi_pass = 'xxxx'; my $feed_url = 'http://xxx'; # 最終更新日時を保存するファイル名 my $truncate_body_size = 100; my $debug = 0; my $logfile = $logdir . 'blog_to_mixi.log'; my $update_time_file = $logdir . 'blog_to_mixi_update'; sub WriteUpdateTime { my($time) = @_; open my $fh, ">" . $update_time_file or die "Failed to write last_update"; print $fh $time; close $fh; } sub ReadUpdateTime { open my $fh, $update_time_file or die "Failed to read last_update"; my $last_time = <$fh>; close $fh; chomp $last_time; return $last_time; } open my $log, '>>' . $logfile or die "Failed to write log file"; if (! -f $update_time_file) { # 最終更新日時ファイルが存在しないので作る my $init_time = 0; WriteUpdateTime($init_time); } my $last_update = ReadUpdateTime(); my $rai = XML::RAI->parse_string(get($feed_url)); my $mixi = WWW::Mixi->new( $mixi_id, $mixi_pass ); my $response = $mixi->login; my $most_recent_time = 0; my @raiItems = @{$rai->items}; my $itemNum = @raiItems; # 配列数取得 my $maxItem = 7; # MIXIでは同時に7個までしか入らないらしい for(my $i = 0; $i < $itemNum - $maxItem; $i++) { pop @raiItems; # 7を越える場合は後ろから順に削除 } @raiItems = reverse @raiItems; foreach my $item ( @raiItems) { my $item_time = str2time($item->created); if($item_time > $last_update){ my $message = "続きは以下のリンクをクリックしてください。"; my $itemBody = Jcode->new($item->content)->euc; # タグ外す $itemBody =~ s///gs; $itemBody =~ s/<.*?>//gs; # 改行も外す $itemBody =~ s/\n//gs; $itemBody = jtruncate($itemBody, $truncate_body_size) . "...\n"; my $body = Jcode->new($itemBody)->euc . "\n" . Jcode->new($message)->euc . "\n" . $item->link . "\n"; my %diary = ( 'diary_title' => Jcode->new($item->title)->euc, 'diary_body' => $body, ); foreach my $key ( keys %diary) { print $log $item_time . "\n"; print $log "$key : $diary{$key}" . "\n"; } my $result = $mixi->get_add_diary_confirm(%diary); if($item_time > $most_recent_time){ $most_recent_time = $item_time; } } } if($most_recent_time > $last_update){ WriteUpdateTime($most_recent_time); } close($log); exit;