前回の続き。
ブログに投稿するのであれば、XML-RPCがほとんど全てのブログサービスに共通に対応してていいかなーと思ったのですが、これだとブログサービスのIDとパスワードを預からないといけなくて、このご時世にリスクが高すぎるのでTumblrだけに対応させることにしました。
最初はWWW::Tumblrを使用して実装を始めたのですが、マルチバイト文字使用圏ガン無視の素敵なモジュールだったので諦めました。
(モジュール、マルチバイトに対応させようと思って途中まで直したんですが、直すんだったら自分で作りなおしたほうが早いレベルであんまりな実装だったのでやめました。エアギアでモリガンと対峙したベンケイさんの気分です。)
githubを検索したら以下のモジュールが良さげだったので使用することにしました。
tumbperl/API.pm at master · cedriczirtacic/tumbperl · GitHub
ちなみに上記モジュールはそのまま使用するとWebアプリケーション化できないため、get_authorization_url系のメソッドを実装した上で使用します。
(実装自体は終わったのでWebアプリケーションにした時に公開します。)
スクリプトは続きから。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Net::Twitter::Lite::WithAPIv1_1;
use Date::Manip;
use Tumblr::API;
Date_Init("TZ=JST");
# twitter
my $consumer_key = '***';
my $consumer_key_secret = '***';
my $access_token = '***';
my $access_token_secret = '***';
my $twit = Net::Twitter::Lite::WithAPIv1_1->new(
consumer_key => $consumer_key,
consumer_secret => $consumer_key_secret,
ssl => 1
);
$twit->access_token($access_token);
$twit->access_token_secret($access_token_secret);
# Tumblr.
my $tb_consumer_key = '***';
my $tb_consumer_secret = '***';
my $tb_oauth_token = '***';
my $tb_oauth_token_secret = '***';
my $tb = Tumblr::API->new(
consumer_key => $tb_consumer_key,
consumer_secret => $tb_consumer_secret,
token => $tb_oauth_token,
token_secret => $tb_oauth_token_secret,
base_hostname => 'xxxretrorocketxxx.tumblr.com'
);
#出力対象タッシュタグ
my $target = "たんぶら";
#取得開始起点になるID
open (DATA, "< id_str.txt ");
my $id_str = <DATA>;
chomp($id_str);
close(DATA);
my $array;
#ついーと取得
#eval {
$array = $twit->user_timeline({count => 200,
screen_name=> "retrorocket", #自分でも他人でも
include_entities => 'true',
since_id => $id_str
});
#};
#if ( my $error = $@ ) { warn "$error"; }
my @post_array=();
my $counter = 0;
foreach my $hash (@$array){
if($counter == 0){
open (DATA, "> id_str.txt ");
print DATA $hash->{id_str};
close(DATA);
$counter = 1;
}
#since_idより古いツイートは読まない
if($id_str eq $hash->{id_str}) {
last;
}
foreach my $hashtag (@{$hash->{entities}{hashtags}}) {
my $hashtag_text = $hashtag->{text};
if($hashtag_text eq $target) {
my $date = ParseDate($hash->{'created_at'});
my $text = $hash->{'text'};
my $tag = "#".$hashtag_text;
$text =~ s/$tag//;
my %temp_hash = ();
$temp_hash{body} = $text;
$temp_hash{title} = UnixDate($date,"%Y/%m/%d %H:%M");
unshift (@post_array, %temp_hash);
last;
}
}
}
foreach my $entry (@post_array){
my %post_entry = %$entry;
$tb->post(
'text',
{body => $post_entry{body} },
{title=> $post_entry{title}},
);
sleep 5;
}