はてダロ(CSVエクスポート版)

はてなの管理→日記のエクスポート→CSV形式をダウンロードするように、はてダロ(0.6.0)を改造してみた。
2005-02-26.txtみたいな日付の引数がない場合は、CSVファイルをダウンロードする。2005-02-26.txtをつけた場合はオリジナルと(ほとんど)同じ動作。あ、そうそうこのpatchには、id:ha-tan:20050225のpatchも含まれています。

--- hl.pl.orig.0.6.0	Sat Feb 26 08:42:27 2005
+++ hl.pl	Sat Feb 26 18:50:50 2005
@@ -122,18 +122,24 @@
 # Main sequence.
 sub main {
 
-    # Check -s option format.
-    error_exit("Illegal argument.") if $ARGV[0] !~ /(\d\d\d\d)-(\d\d)-(\d\d)/;
-    my ($year, $month, $day) = ($1, $2, $3);
-
     # Login if necessary.
     login unless ($user_agent);
+	
+    if ($ARGV[0] =~ /(\d\d\d\d)-(\d\d)-(\d\d)/) {
+	my ($year, $month, $day) = ($1, $2, $3);
+	
+	# Load
+	print_message("Load $year-$month-$day.");
+	load_diary_entry($year,$month,$day);
 
-    # Load
-    print_message("Load $year-$month-$day.");
-    load_diary_entry($year,$month,$day);
-    print_message("Load OK.");
+    } else {
+	# Load
+	print_message("Load source.");
+	load_source();
+    }
 
+    print_message("Load OK.");
+    
     # Logout if necessary.
     logout if ($user_agent);
 }
@@ -319,7 +325,7 @@
     # Get title and body.
     $form_data =~ /<input .*?class="field" .*?name="title" .*?value="(.*?)".*?>/;
     my $title = $1 . "\n";
-    $form_data =~ /<textarea .*?>(.*)<\/textarea>/s;
+    $form_data =~ /<textarea .*?>(.*?)<\/textarea>/s;
     my $body = $1;
     
     # Escape string.
@@ -353,6 +359,67 @@
     close(OUT);
     
     print_debug("load_it: returns 1 (OK).");
+    return 1;
+}
+
+# Load source.
+sub load_source() {
+    my $load_retry = 0;
+    my $ok = 0;
+
+LOAD_RETRY:
+    while ($load_retry < 2) {
+        # Load.
+        $ok = load_it_source();
+        if ($ok or not $cmd_opt{c}) {
+            last;
+        }
+        print_debug("load_source: LOAD_RETRY.");
+        unlink($cookie_file);
+        print_message("Old cookie. Retry login.");
+        login();
+        $load_retry++;
+    }
+
+    if (not $ok) {
+        error_exit("load_source: get: Check username/password.");
+    }
+}
+
+# Load.
+sub load_it_source() {
+    print_debug("load_it_source:");
+
+    $user_agent->cookie_jar($cookie_jar);
+
+    my $r = $user_agent->simple_request(
+        HTTP::Request::Common::GET("$hatena_url/$username/source"));
+
+    print_debug("load_it_source: " . $r->status_line);
+
+    if (not $r->is_success()) {
+        error_exit("Load: Unexpected response: ", $r->status_line);
+    }
+
+    # Check if file is exist.
+    if(-f "source") {
+        my $bakext = 0;
+        while(-f "source.$bakext") {
+            $bakext++;
+        }
+        if (not rename("source", "source.$bakext")) {
+            error_exit("$!:source");
+        }
+    }
+    
+    if (not open(OUT, ">source")) {
+        error_exit("$!:source");
+    }
+    
+    print OUT $r->content;
+    close(OUT);
+    
+    print_debug("load_it_source: returns 1 (OK).");
     return 1;
 }
 

はてダロ(0.6.0)にpatchを当ててuuencodeしたデータはこちら。(はてなでは添付ファイルを扱えないのかしら。)

begin 755 hl.pl.gz
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
5X4\47O/YY/1D/N_\%_83RXIX-0``
`
end