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!