Skip to content

Instantly share code, notes, and snippets.

@studio3104
Created March 29, 2013 06:24
Show Gist options
  • Save studio3104/5269083 to your computer and use it in GitHub Desktop.
Save studio3104/5269083 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use LWP::UserAgent;
use URI;
use JSON qw/decode_json/;
use Digest::MD5 qw/md5_hex/;
use Path::Class qw/dir file/;
use Encode;
use utf8;
use Proclet;
use Acme::AjiFry::EN;
use Array::Diff;
use Fluent::Logger;
my $proclet = Proclet->new;
my $ua = LWP::UserAgent->new;
my $uri = URI->new('http://api.tumblr.com/v2/blog/mirakui.tumblr.com/posts/photo');
my $api_key = YOUR_TUMBLR_API_KEY;
my $crypt = Acme::AjiFry::EN->new();
my $logger = Fluent::Logger->new(host => "192.168.33.11");
$uri->query_form( 'api_key' => $api_key );
$proclet->service(
code => sub {
while (1) {
&download(&get_url_list);
sleep 10;
}
},
tag => &to_aji('mirakui')
);
sub to_aji {
$crypt->translate_from_ajifry($crypt->translate_to_ajifry(shift));
}
sub logger {
$logger->post( "mirakui.tumblr" => { message => shift } );
}
sub download {
my $urls = shift;
foreach my $url (@$urls) {
my $filename = md5_hex( encode_utf8($url) ) . '.jpg';
my $filepath = dir('./')->file($filename);
next if -f $filepath;
print &to_aji(encode_utf8("Download... $url\n"));
$ua->get( $url, ':content_file' => $filepath->stringify );
}
}
sub get_url_list {
my $req = HTTP::Request->new( GET => $uri );
my $res = $ua->request($req);
die $res->status_line if $res->is_error;
my $ref = decode_json( $res->content );
my $urls = [];
my $items = $ref->{"response"}->{"posts"};
foreach my $item (@$items) {
if ( my $photos = $item->{'photos'} ) {
foreach my $photo (@$photos) {
push( @$urls, $photo->{'original_size'}->{'url'} );
}
}
}
&check_downloaded($urls);
}
my $last_urls = [];
sub check_downloaded {
my $urls = shift;
my $added = Array::Diff->diff( $last_urls, $urls )->added;
push( @$last_urls, @$added );
while ( scalar(@$last_urls) >= 40 ) {
shift $last_urls;
}
$added;
}
$proclet->run;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment