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側に正しく日本語が飛ばないので修正した