Skip to content

Instantly share code, notes, and snippets.

@kkobayashi
Last active October 29, 2016 05:58
Show Gist options
  • Save kkobayashi/69d42392557d10e0ac64dfdc1697c5a5 to your computer and use it in GitHub Desktop.
Save kkobayashi/69d42392557d10e0ac64dfdc1697c5a5 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
use strict;
use warnings;
use Net::Twitter;
use FindBin;
use JSON::XS;
use Path::Class qw/file dir/;
use POSIX qw/strftime/;
use Scalar::Util qw/blessed/;
use utf8;
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
my $my_id = 'your_screen_name';
my $user = shift || $my_id;
### $user
my $dir = dir($FindBin::Bin);
my @files = reverse sort grep { !$_->is_dir and /$user\.\d+-\d+\.json$/ } $dir->children;
### files : map { "$_" } @files
my $last_data = (@files) ? decode_json($files[0]->slurp) : {};
### $last_data
my $nt = Net::Twitter->new(
traits => [qw/API::RESTv1_1/],
consumer_key => $consumer_key,
consumer_secret => $consumer_secret,
access_token => $access_token,
access_token_secret => $access_token_secret,
);
my $su_args = ($user =~ /^\d+$/) ? {id=>$user} : {screen_name=>$user};
my $result = eval { $nt->show_user($su_args) };
### $result
twiter_error($@);
my @updated = ();
my $cnt = 0;
foreach my $k (keys %$result){
my $type = ref($result->{$k});
if(!ref($result->{$k}) and (exists $last_data->{$k} and !ref($last_data->{$k}))){
$cnt++;
### $k
{
no warnings 'uninitialized';
push(@updated, $k) if($result->{$k} ne $last_data->{$k});
}
}
}
### $cnt
### @updated
if(@updated){
my $msg = '@' . "$result->{screen_name} profile updated.\n";
$msg .= "$cnt elements checked : " . scalar(@updated) . " updated.\n";
foreach(@updated){
$msg .= "$_ (old) : " . ($last_data->{$_} || 'undef') . "\n";
$msg .= "$_ (new) : " . ($result->{$_} || 'undef') . "\n";
}
$nt->new_direct_message({screen_name=>$my_id, text=>$msg});
twiter_error($@);
print "$msg\n";
}
else{
print "$cnt elements checked : nothing updated.\n";
}
# save new data or updated data to JSON
if(@updated or !%$last_data){
my $json_file = sprintf("%s.%s.json", $user, strftime("%Y%m%d-%H%M%S",localtime()));
### $json_file
my $ofh = $dir->file($json_file)->open('w') or die "$@";
print $ofh encode_json($result);
close $ofh;
}
sub twiter_error{
my $err = shift || return;
### $err
my @args = %$su_args;
my $msg = "[$args[0]=$args[1]] ";
### $msg
if(blessed $err && $err->isa('Net::Twitter::Error')){
$msg .= sprintf("Code %s : %s", $err->twitter_error_code, $err->twitter_error_text);
}
else{
$msg .= "$err";
}
warn $msg;
$nt->new_direct_message({screen_name=>$my_id, text=>$msg});
exit;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment