X-Git-Url: http://lab.mitty.jp/git/?a=blobdiff_plain;f=Dev%2Ftwitter%2Ftwitterbot.pl;h=1aa5bbd5f0d0db4b8d6cd96f09e1190770800ec2;hb=HEAD;hp=9b9e2d888630eeff7d69bc37b2704320f30dfce8;hpb=702399e09a32025f7dfed289735b064361263a6b;p=lab.git diff --git a/Dev/twitter/twitterbot.pl b/Dev/twitter/twitterbot.pl index 9b9e2d8..1aa5bbd 100755 --- a/Dev/twitter/twitterbot.pl +++ b/Dev/twitter/twitterbot.pl @@ -9,10 +9,12 @@ use utf8; # it throws a Net::Twitter::Lite::Error object. # You can catch and process these exceptions by using eval blocks and testing $@ ## from http://search.cpan.org/perldoc?Net::Twitter::Lite#ERROR_HANDLING -use Net::Twitter::Lite; +use Net::Twitter::Lite::WithAPIv1_1; use FindBin qw($Bin); use YAML::Tiny; use Date::Parse qw(str2time); +use Mail::Sendmail; +use Encode; my $_execmode = $ARGV[0] || 0; sub VERBOSE () { $_execmode eq 'verbose' }; @@ -51,10 +53,10 @@ foreach my $id (sort keys %$tweets) { my $skip; if ($tweets->{$id}{type} eq 'retweet') { DEBUG and warn "skipping $id that was already retweeted\n"; - $skip = $id; + $skip = 'retweet'; } if (defined $conf->{allow}) { - $skip = $id; + $skip = 'allow'; foreach my $screen_name ( @{ $conf->{allow}{screen_name} } ) { if ($tweets->{$id}{screen_name} eq $screen_name) { DEBUG and warn "$id was allowed by screen_name\n"; @@ -71,7 +73,40 @@ foreach my $id (sort keys %$tweets) { } } + if (defined $conf->{mail}) { + my $send; + foreach my $pickup ( @{ $conf->{mail}{pickup} } ) { + if ($tweets->{$id}{type} eq $pickup) { + $send = 1; + last; + } + } + if ($conf->{mail}{ignore_allowed}) { + if (defined $conf->{allow} and ! defined $skip) { + # this tweet was allowed to retweet, so that be ignored on mail + undef $send; + } + } + + if ($send) { + if (! exists($conf->{mail}{body}) ) { + $conf->{mail}{body} = + "[localtime(date)] http://twitter.com//status/ text\n" . + "----------------------------------------\n" + ; + } + $conf->{mail}{body} .= + "[" . localtime($tweets->{$id}{date}) . "] " . + "http://twitter.com/" . + $tweets->{$id}{screen_name} . "/status/" . + $tweets->{$id}{status_id} . " " . + $tweets->{$id}{text} . "\n" + ; + } + } + if ($skip) { + $stat->{$tweets->{$id}{type}} = $id; next; } @@ -92,7 +127,23 @@ foreach my $id (sort keys %$tweets) { $stat->{$tweets->{$id}{type}} = $id; } -if ($tweets) { +if ($conf->{mail}{body}) { + my $body = encode("iso-2022-jp", $conf->{mail}{body}); + + my %mail = ( + Smtp => $conf->{mail}{server}, + From => $conf->{mail}{from}, + To => join(", ", @{ $conf->{mail}{to} }), + Subject => $conf->{mail}{subject}, + "Content-Type" => $conf->{mail}{contenttype}, + Body => $body, + ); + DEBUG and warn "sending mail => ", Dumper(\%mail); + + DEBUG or sendmail(%mail) or warn "Error sending mail: $Mail::Sendmail::error\n"; +} + +if (ref $tweets and keys %{$tweets}) { # save last status to yaml file DEBUG or YAML::Tiny::DumpFile("$Bin/status.yml", $stat); DEBUG and warn "status.yml => ", Dumper($stat); @@ -118,15 +169,17 @@ sub loadconf { } sub login { - # make Net::Twitter::Lite object and login + # make Net::Twitter::Lite::WithAPIv1_1 object and login # param => hash object of configration - # ret => Net::Twitter::Lite object + # ret => Net::Twitter::Lite::WithAPIv1_1 object my $conf = shift @_; - my $bot = Net::Twitter::Lite->new( + my $bot = Net::Twitter::Lite::WithAPIv1_1->new( consumer_key => $conf->{consumer_key}, consumer_secret => $conf->{consumer_secret}, + legacy_lists_api => 0, + ssl => 1, ); $bot->access_token($conf->{access_token}); @@ -137,7 +190,7 @@ sub login { sub or_search { # search tweets containing keywords - # param => Net::Twitter::Lite object, ArrayRef of keywords, since_id + # param => Net::Twitter::Lite::WithAPIv1_1 object, ArrayRef of keywords, since_id # ret => HashRef of status_id (timeline order is destroyed) # or undef (none is found) @@ -168,8 +221,8 @@ sub or_search { ); } VERBOSE and warn Dumper($res); - if ($res->{results}) { - foreach my $tweet (@{$res->{results}}) { + if ($res->{statuses}) { + foreach my $tweet (@{$res->{statuses}}) { my $res = $bot->show_status($tweet->{id}); VERBOSE and warn Dumper($res); @@ -201,7 +254,7 @@ sub or_search { sub mentions_ids { # return status_ids mentioned to me - # param => Net::Twitter::Lite object, since_id + # param => Net::Twitter::Lite::WithAPIv1_1 object, since_id # ret => HashRef of status_id (timeline order is destroyed) # or undef (none is found) @@ -249,12 +302,18 @@ sub evalrescue { if (blessed $@ && $@->isa('Net::Twitter::Lite::Error')) { warn $@->error; if ($@->twitter_error) { - my %twitter_error = %{$@->twitter_error}; - map { - $twitter_error{"$_ => "} = $twitter_error{$_} . "\n"; - delete $twitter_error{$_} - } keys %twitter_error; - warn join("", %twitter_error); + my $twitter_error = $@->twitter_error; + if (defined $twitter_error->{errors} && ref($twitter_error->{errors})) { + foreach my $error (@{$twitter_error->{errors}}) { + warn "code => " , $error->{code}, "\n"; + warn "message => ", $error->{message}, "\n"; + } + } + else { + # unknown HASH structure + use Data::Dumper; + warn Dumper $twitter_error; + } } } else {