# 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' };
foreach my $id (sort keys %$tweets) {
# $tweets->{$id}{type} eq 'search' => found by search API
# eq 'mention' => found by mention API
+ my $skip;
if ($tweets->{$id}{type} eq 'retweet') {
DEBUG and warn "skipping $id that was already retweeted\n";
- next;
+ $skip = 'retweet';
}
if (defined $conf->{allow}) {
- my $flag;
+ $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";
- $flag = $id;
+ undef $skip;
last;
}
}
foreach my $user_id ( @{ $conf->{allow}{user_id} } ) {
if ($tweets->{$id}{user_id} eq $user_id) {
DEBUG and warn "$id was allowed by user_id\n";
- $flag = $id;
+ undef $skip;
last;
}
}
- if (! $flag) {
- next;
+ }
+
+ 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/<screen_name>/status/<status_id> 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;
+ }
+
DEBUG or sleep($conf->{sleep});
# do retweet found 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);
}
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});
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)
);
}
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);
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)
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 {