tetsunosukeのnotebook

tetsunosukeのメモです

LDRのpinをdel.icio.usに投げるのを作ってみた

http://d.hatena.ne.jp/kidd-number5/20071205/1196831510の続き。

作ってみた。苦戦したのがApiKeyを投げる部分。cookieのreader_sidを投げるとは。

ポイントは以下。

  • 公式なAPIではないので、認証をWWW::Mechanizeで対応
  • /api/pin/all はJSONで取得
  • /api/pin/clear するときはApiKeyの送信が必要。
    • アクセス時のcookieからreader_sidを抜き出してそれを送信
use strict;
use warnings;
use YAML::Syck;
use WWW::Mechanize;
use WWW::Mechanize::DecodedContent;
use JSON;
use Net::Delicious;

##
my $configFile = 'ldrpin2delicious.yaml';
my $ldr_loginForm = 'http://reader.livedoor.com/reader/';
my $ldr_api = 'http://reader.livedoor.com/api';
my $res;

my $config = LoadFile($configFile) || die $!;

my $mech = WWW::Mechanize->new;

# log in
$res = $mech->get($ldr_loginForm) || die $!;
$res = $mech->submit_form(
    form_name => 'loginForm',
    fields =>{
        livedoor_id => $config->{livedoor_reader}->{id},
        password    => $config->{livedoor_reader}->{pw}
    }
) || die $!;

# get pin content as JSON
$res = $mech->post($ldr_api . '/pin/all') || die $!;
my $json = jsonToObj($res->decoded_content);



# del.icio.us
my $del = Net::Delicious->new(
    {
        user => $config->{del_icio_us}->{id},
        pswd => $config->{del_icio_us}->{pw}
    }
) || die $!;

# POST to delicious
foreach my $ldr (@{$json}){
    $res = $del->add_post({
        url => $ldr->{link},
        description => encode('utf-8',$ldr->{title}),
        tags => $config->{del_icio_us}->{tag}
    }) || warn $!;
}
# get ApiKey from cookie
my $apiKey = $mech->{cookie_jar}->{COOKIES}->{'reader.livedoor.com'}->{'/'}->{'reader_sid'}[1];
# Delete pins
$res = $mech->post($ldr_api . '/pin/clear', { ApiKey => $apiKey} ) || die $!; 

設定のYAMLはこんなで

livedoor_reader:
  id: <id>
  pw: <pw>
del_icio_us:
  id: <id>
  pw: <pw>
  tag: '*ldr'

エンコードを正しくしないとdel.icio.us側に正しく日本語が飛ばないので修正した