StackStockBooksのCSVをブクログとメディアマーカーにもPerlでGO!
というわけで前回の続きでブクログとメディアマーカーにも突っ込んだ. 基本的にフローは変わってなくて,WWW::Mechanize で実際にアクセスしながら 微調整しただけ.かんたんですね.Socialtunes にも入れようと思ったのですが, ぺたをつけるのが JavaScript だったので断念しました.
bukulog.pl
細かいことはソース見て下さい.状態が特に設定できないので,欲しい本は 登録せずに持っている本だけ並べました.
use strict;
use warnings;
use WWW::Mechanize;
use DateTime::Format::HTTP;
use SSBCSV;
my $url = "http://booklog.jp";
my $user = 'your username';
my $pass = 'your password';
my $mech = WWW::Mechanize->new();
$mech->get($url . "/login.php");
$mech->form_number(2);
$mech->submit_form(
fields => {
account => $user,
pw => $pass,
});
my $ssb = SSBCSV->new("stocks.csv");
my $res = $ssb->get;
foreach my $book(reverse @{$res}){
if($book->{state} ne 'wish'){
$mech->get($url . "/addbook.php");
$mech->form_number(2);
$mech->submit_form(
fields => {
keywords => $book->{isbn},
});
$mech->follow_link(
url_regex => qr{^\./addbook\.php\?},
);
my $dt = DateTime::Format::HTTP->parse_datetime($book->{date});
my $year = $dt->year;
my $month = sprintf("%02d", $dt->month);
my $day = sprintf("%02d", $dt->day);
$mech->form_number(3);
$mech->submit_form(
fields => {
e_year => $year,
e_month => $month,
e_day => $day,
});
sleep(1);
}
}
mediamarker.pl
なんか,結構蹴られたので,いろいろ入ってますが気にせずに. ラジオボタンは選択せずとも,submit で送れるようです.
use strict;
use warnings;
use WWW::Mechanize;
use DateTime::Format::HTTP;
use SSBCSV;
my $url = "http://mediamarker.net";
my $user = 'your name';
my $pass = 'your password';
my %state_hash = (
read => {
own => 'owner',
state => 'fin',
},
reading => {
own => 'owner',
state => 'now',
},
stack => {
own => 'owner',
state => 'yet',
},
wish => {
own => 'wish',
state => 'no',
},);
my $mech = WWW::Mechanize->new(autocheck => 1);
$mech->agent_alias('Mac Mozilla');
do {
$mech->get($url . "/login");
} while(!$mech->success());
$mech->form_number(1);
$mech->submit_form(
fields => {
uname => $user,
pass => $pass,
});
my $ssb = SSBCSV->new("stocks2.csv");
my $res = $ssb->get;
foreach my $book(reverse @{$res}){
my $dt = DateTime::Format::HTTP->parse_datetime($book->{date});
my $year = $dt->year;
my $month = $dt->month;
my $day = $dt->day;
do {
$mech->get($url . "/u/" . $user . '/reg?cat=1&asin=' . $book->{isbn});
} while(!$mech->success());
if($mech->content =~ /この本・雑誌は登録済みです。/){sleep(15);next;}
$mech->form_number(1);
$mech->tick($state_hash{$book->{state}}->{own}, '1');
if($state_hash{$book->{state}}->{own} eq 'owner') {$mech->tick('buy_flag', '1');}
$mech->select('buy_year', $year);
$mech->select('buy_month', $month);
$mech->select('buy_day', $day);
$mech->select('fin_year', $year);
$mech->select('fin_month', $month);
$mech->select('fin_day', $day);
$mech->select('regdate_year', $year);
$mech->select('regdate_month', $month);
$mech->select('regdate_day', $day);
$mech->submit_form(
fields => {
read => $state_hash{$book->{state}}->{state},
regdate_sel => 'edit',
});
sleep(15);
}
というわけで
これで,現状の本については StackStockBooks,ブクログ,読書メーター, メディアマーカーと日付(はある程度ですが)・状態も含めて同期ができました. 続くステップは当然 Plagger です.
とりあえず登録サイトは「メディアマーカー」にしようと思います.理由は 一番いろいろ設定できるから.登録日の他に購入日や読了日,価格や欲しい本なども 登録できるので一番情報量が多いですね.
そして,これをレポジトリにして,他のサービスには Plagger で登録していきます. ただしメディアマーカーの RSS がしょぼしょぼなので,自分でスクレイピング した方が良さそうです.登録の部分は,今回 WWW::Mechanize で書いたのが ほぼそのまま使えるでしょう.StackStockBooks は今作ってますが,OpenID なので どうなるかと思ったけど,ちゃんと OpenID のサイトにリダイレクトしてくれたので 問題なく作れそうです.
この他,登録しておくべき蔵書管理サイトがあれば紹介してくださいませ. どんどんメカっていきますので.それ Mech!