というわけで、対策を色々考えました。理想は日記の存在/不在を識別して必要な時だけ create_it する事です。しかしその識別には POST のレスポンスで指定されたリダイレクト先をダウンロードして、その HTML を解析しなくてはなりません。
そこで -t オプション付きの時は create_it する前に空の内容で post_it する、というのを試してみました。日記が存在すれば空の post_it で title, body がクリアされます。その状態なら続く create_it で更新がかかってもトラックバックは飛びません(アンテナは上がっちゃうかも?→上がらないぽい)。日記が存在しない場合は空の post_it は何の効果もないので(サーバへの負荷を除けば)無害です。
とりあえず以下のパッチでうまく動作しました。-t なしだとエラーになる…なおりました。
--- /home/nanba/Environment/bin/hw.pl Wed Sep 8 03:02:31 2004 +++ ./hw.pl Thu Sep 9 14:40:55 2004 @@ -302,10 +302,30 @@ # Update entry. sub update_diary_entry($$$$$$) { my ($year, $month, $day, $title, $body, $imgfile) = @_; + my $clear_retry = 0; my $create_retry = 0; my $post_retry = 0; my $ok = 0; +CLEAR_RETRY: + while ($cmd_opt{t} && $clear_retry < 2) { + # clear existing entry. if the entry does not exist, it has no effect. + $ok = post_it($year, $month, $day, "", "", ""); + if ($ok or not $cmd_opt{c}) { + last; + } + print_debug("update_diary_entry: CLEAR_RETRY."); + unlink($cookie_file); + print_message("Old cookie. Retry login."); + login(); + $clear_retry++; + } + + if ($cmd_opt{t} && not $ok) { + error_exit("update_diary_entry: create: Check username/password."); + } + + CREATE_RETRY: while ($create_retry < 2) { # Make empty entry before posting.
しかし一回の更新で三回 POST するのはあんまりですね。日記の不在確認だけでも簡単にできればこんなことしなくていいし、むしろ現状よりも POST を減らせます。せめて存在しない日記にアクセスすると 404 Not Found を返すようにしてもらえないでしょうか。あるいはユーザの日記のトップにリダイレクト(303 See Other が適切?)するとか。[はてなダイアリーへの要望] ということでひとつ。。。> id:hatenadiary 様
(追記) [id:hatenadiary:20040909#1094705150] で、日記の新規作成で「ちょっとした更新」(trivial パラメータ)が可能になったとの告知が… ひょっとして二回目の create_it でトラバ飛ばなくなった? ちょっと実験 [id:rna:20040103]←これには飛ばなかった。でも id:hatenadiary には飛んでる(上にリンクがあるけどこれを書くまで飛ばさないようにしてた)。アンテナも上がってます。謎。。。
もう一度(古い方の hw.pl で) -t 付き更新したら id:rna:20040103 にもトラバ飛びました。やっぱパッチあてないとだめっぽい。