Read It Later からはてブに登録する

多くの iPhone アプリでは、あとで読む系は Read It Later (以下 RIL) が多いので、RIL に流しているが、通常ははてブを使っているため、RIL に登録した URL をはてブに集約したい。というか、仕事から現実逃避したいので、コード書きたい。

というわけで、以下のようなスクリプトを作り、cron で回して、昨日以降に RIL に登録した URL を自動的にはてブに登録するようにしたった。なお、RIL の API にアクセスするため、API Key を取得する必要がある。

#!/usr/bin/perl

# Read It Later に昨日以降登録されたものを
# Hatena Bookmark に登録する

use 5.010;
use strict;
use warnings;
use utf8;
use Data::Dumper;
use JSON;
use DateTime;
use DateTime::TimeZone;
use LWP::Simple;
use LWP::UserAgent;
use WebService::Hatena::Bookmark::Lite;

my $ril_url  = 'https://readitlaterlist.com/v2/get?username=%s&password=%s&apikey=%s&since=%s';
my $ril_user = 'user';
my $ril_pass = 'password';
my $ril_key  = 'apikey';
my $hatena_user = 'user';
my $hatena_pass = 'password';

my $tz = DateTime::TimeZone->new(name => 'Asia/Tokyo');

# 昨日のエポック秒
my $yesterday = DateTime->today(time_zone => $tz)->subtract(days => 1);
my $ril_since = $yesterday->epoch();

# RIL から JSON を取得する
my $ril = sprintf($ril_url, $ril_user, $ril_pass, $ril_key, $ril_since);
my $json = get($ril);

# こんな JSON が返ってくる
#my $json = '{"status":1,"list":{"74006":{"item_id":"74006","title":"Google","url":"http:\/\/www.google.co.jp\/","time_updated":"1325814579","time_added":"1325814579","state":"0"}},"since":1325737324,"complete":0}';

my $data = decode_json($json);
my $list = $data->{list};

my $bookmark = WebService::Hatena::Bookmark::Lite->new(
    username  => $hatena_user,
    password  => $hatena_pass,
);

# time_added でソート
for my $key ( sort { $list->{$a}{time_added} <=> $list->{$b}{time_added} } keys %$list ) {
    my $url = $list->{$key}{url};
    $url = expand_uri($url) if $url =~ m|^http://t\.co/|; # t.co は展開する

    # 登録された日時をコメントにする
    my $dt = DateTime->from_epoch(
        epoch => $list->{$key}{time_added},
        time_zone => $tz,
    );
    my $comment = $dt->strftime('%Y-%m-%d %H:%M:%S');

    $bookmark->add( url => $url, comment => $comment );
    say $comment;
    say $url;
}

# 短縮 URL を展開する
sub expand_uri {
    my $uri = shift;

    my $ua = LWP::UserAgent->new;
    my $res = $ua->head($uri);
    return $res->request->uri;
}