はてダラ実験

http://www.hyuki.com/techinfo/hatena_diary_writer.html

にある「はてダラ」を実験してみました。この「はてダラ」はずいぶん前から
Perlの本などでお世話になっている結城浩さんの作品なんですね。

さてさて

perl -MCPAN -e 'install Crypt::SSLeay'

で必要なモジュールをインストールしておいて、適当なディレクトリーにこの
サイトにあるPerlのプログラムをhw.plとして保存し、に2012-11-18.txtのよう
なファイルを作成し、ここに書いてあるような文章を書いて

perl hw.pl

でしっかり登録できました。

ただ、僕の場合、一度最終的にブラウザで確認したので(Facebookへ通達するこ
ともあり)、下書き機能がこの「はてダラ」にはないので、このプログラムに次
のような関数を追加してみました(相当いい加減なので参考にしない方が良いと
思う・汗)。

sub draft_it($$$$$$) {
    my ($year, $month, $day, $title, $body, $imgfile) = @_;

    print_debug("draft_it: $year-$month-$day.");

    $user_agent->cookie_jar($cookie_jar);

    my $r = $user_agent->simple_request(
        HTTP::Request::Common::POST("$hatena_url/$username/edit",
            Content_Type => 'form-data',
            Content => [
                mode => "draftenter",
                timestamp => get_timestamp,
                year => $year,
                month => $month,
                day => $day,
                trivial => $cmd_opt{t},
                rkm => $rkm,
		draft => "下書き保存",
                # Important:
                # If (entry does exists) { append empty string (i.e. nop) }
                # If (entry does not exist) { create empty entry }
                title => "testtttttttttt",
                body => "*temporary\nsakai",
                date => "",
#                date => "$year-$month-$day",
            ]
        )
    );

    my $r = $user_agent->simple_request(
        HTTP::Request::Common::POST("$hatena_url/$username/edit",
            Content_Type => 'form-data',
            Content => [
                mode => "draftenter",
                rkm => $rkm,
		dummy => 1,
                timestamp => get_timestamp,
                year => $year,
                month => $month,
                day => $day,
                trivial => $cmd_opt{t},
		section => 0,
		draft => "下書き保存する",
                title => $title,
                body => $title . "\n" . $body,
                date => "$year$month$day",
                image => [
                    $imgfile,
                ]
            ]
        )
    );
}

です。

最近Javascriptだらけで、なかなかうまく行かなかったのと、はてなダイアリー
でUTF-8場合とEUCの場合のページが混在していて---僕がはてなダイアリー
初心者だからあまりルールを知らないせいかもしれませんが---下書き保存のペー
ジはEUCだったので、EUCでプログラムを保存しておかなければダメでした。

オプションにD(Draftの意味)も追加し、

getopts("Dtdu:p:a:T:cg:f:Mn:", \%cmd_opt) or error_exit("Unknown option.");

Dオプションの場合は対象のファイルを下書き保存するようにしました。

そして、update_diary_entry関数を

sub update_diary_entry($$$$$$) {
    my ($year, $month, $day, $title, $body, $imgfile) = @_;

    if(!$cmd_opt{D}){
	if ($cmd_opt{t}) {
	    # clear existing entry. if the entry does not exist, it has no effect.
	    doit_and_retry("update_diary_entry: CLEAR.", sub { return post_it($year, $month, $day, "", "", "") });
	}

	# Make empty entry before posting.
	doit_and_retry("update_diary_entry: CREATE.", sub { return create_it($year, $month, $day) });

	# Post.
	doit_and_retry("update_diary_entry: POST.", sub { return post_it($year, $month, $day, $title, $body, $imgfile) });
    } else {
	doit_and_retry("draft_diary_entry: POST.", sub { return draft_it($year, $month, $day, $title, $body, $imgfile) });
    }
}

とし

perl hw.pl -D

で、ドラフト保存ができました。

ただ、僕は画像ファイルをつけたものを下書き保存したかったり、AtomPubを
利用しないとその辺実現できそうにない感じなので、この結城さんの「はてダ
ラ」の仕様を参考にしつつ、自分で作ってみようかな、と思う今日この頃でし
た。