はてダロ(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 M'XL("-))($(``VAL+G!L`-4::W/;-O)S]"M06HVH1J+LW&,ZE.W&M=4TT\3. M67(ZG;C5T"0DL:9(EB#MJ!GGM]\N`((`13I.F][TE-:V@,7N8M\`=N>+4<&R MT548CU*:19V=S@Y914X:D2'YWLMI[)&3T,LVY&7B!31S.,!QDFZR<+G*B7W< M)T]W=_])KC8`ON+_`(;L9V$\C^FSJW#I))GS:WJ(>/,\=4>CV]O;I[N.FAE] M$+`C1#TT/K#F#.B$L1>Y9'7;P-6/69A_A*LP2]@J)#\5UR'G;+6!OY[QGXZ? MK$W&'#4^RJF_"N-%,EIQ@O,`"<YO!<%5OHZVN054LU7(2)HER\Q;$_ASD5%* M6++(;[V,CLDF*8COQ22C0<CR++PJ<DK"G'AQ,$HR6+].@G"QP:$B!GF3?`7+ MO34E0'7-B,?(:U`3S#,:+9Q.IV`P#XC\?-Q9;TCWS>1\^N+LE!P0:]?YM[-K MC07,RQ]?N^X%H]G1DL8`BV/?SV8P>$Y_*RC+7?<X6:^36)\Z3I+KD#(Q]%T8 M4=?]UF,@C#458\]IGJ2P=)H'0`?IP^151.<T]I.``A?TQHOL'L).^-"8[/7Z M`+M#7F=)GN2;E#*GPXHK$B6@:!OFY)>DR*MO7B#E#\QG&[O;[>I38:Z-,"\. M\_!W:I<#*=A7/@_H5;&TGQEC:\J8MZ1JE&99DLWI.\#W3,?O)_$B7-J";VE_ ML*6,A`&QPP6AZS3?#,@+<AM&$>CHFNLY`L"L[W"Q(#2*#232ZXTK+*G'V&V2 M/12-`J^A669)D1).P%XD&5GIPYS3)(XV$@D?U9@!-"=TX1513A:@8XZ&"5"? M&\"<#P.P^.KD[_+>6,ZC8+1Y_"KG`2V8#/!.P)O68.#H?=19.J07`N`-&<*. M"W_X:TJ&8.WY8O@U^9+U`.AV13,*?W/_`=3(T("`/:1%CF,L#^"+X'#!2<PE MB6I'8%WO-H31/`_CI0!%+T_YL(+B-JD`_+DTVI[@2VZ2;0]CS!`BOCA_*;&+ M*%&`<P*DC"B!(X:=F#H*GX1D+,KH$J(`L*^M8F4@TA:.--B><+0O"V\.KA<F M,2RT.P0^'GHV.3@DEK`*'B%%V!Z5<<$:D!UBO4I^!POS1O^"^##@:_-P34&F MN'KOZ]U!IR_=61K`KUXV5G8\]T0(X>87!Z!Z*?UA%,:4"*ZX4+[TUP%RJ5CL M!3TDL3N`OX$/[I,6640>:(#/%WS>`C9QOO0:2R'E0*D!5/I$#<@S@#C+-8B9 M`2$E4(/Q#7Z%-`R&EP82Y5HU-+$!Y2>GX";<M&MP4PZW)\E-IR_5O$@L\)\7 MW7H;1O8<,J4YV25Y(B(G22+,%](L07`WF!=1CUTM2L./V='IR='YR?S[R<O7 M\RI=[(T[2P[';"LHW-3UW)GK+]W8!:XO2TWV"407+4Q:%_%UG-S&)9L6$H10 M9G?E@O?!79^\Y[O3X[!U@K^X((E<M@4BLH\&0P"QPNO?B26/Y1;FKR;3Z='S M"4;I.]BT&9K4LOC.P!+?<3L^`V%E(3CY,DJNO(C<>!F#*)ROB$##=>5TC&2` M>(:0931"_8\BV_(3"+1Z<E",%2:?!?"I1W\UD9IP*<+I`5[-+$W`)0*J&/*> M^\>=#N^9\)X)+[W%6#$S5\R$:(]77KRD1GP$DS7R%L10PFVF8AP,/:`+$%,` M2<N<*\W)C+B6C+@5'&0:/89:W"QVR#3W,L@=C]=>&',&XV3(#9J@03L=;M:[ M0I.O``9<">JCV*>B2L%EP`#G8`>*8O0\X"^F/M82V48XLO#((HY@$'BOHB;@ M?<0A^)Z.SI^_>;O[,SGX0$;V92#^]8>V_FN$^WT$P=3N;JB7#4@7BK1\!;\# M;]/'R-J%>-%]"O__@V-_M,-K]<XCL\:Q<)!P'$.!8H@8N.L]VBZP."U)BE,: MBSW?$1I!,??^?C(L*3*06(5;#-C2S>\ZFK>;*\]^4,&@DC%FID8ARXF:A+F> MN6J,RK*TFPH6I&?6Q</#F-[:56Z5G&A+AH<TOIGS,F)<*5*5%B61K55\UN89 MOC?0:A%)82OX<9Y=(NH57M*A?6L++6UE&R7VQTFQ)EIWI=T?06VJHA9J)LFQ MUA)Z,<Q>]UA%F5@7<LHE5L65OTK6J:V'P_WI[.3%Z6&=_(N%F8LQ7"3Q`$]1 MQ)=9`^,^^#++V8`$"><P$B:AM%:E$KY2!'-5\/:WV*X)#.T5:L>2(M1((OTI MK53%$VS%.%%Q.QLW00X/T5],1C2<37Q<FH0LXI@(/3;'$V*\W$:D?&]Z':92 M/L8>,IH76=R@?96+6K5?0C1H_[6<:M*^EN0:M8]E)1CI6GHF_OG^FFYX)BHM M1Y\K\7&`\LNX)0!AU*ZR$QRV*_Q"+CN2A6Y6TBO=CH7K%`Z^F3A-VQT%.`:) MG5.60JZG#<8WO=,%A"M$')9I3<MR([6_D:6;&6?QRO.O`8;O4B$8UX#6<(Y! M"&$YFNQK[J!S5*WVBCSA"SF*/6WY7:M=*9&VG7H:9*RH/DC&Y:?Q,L-U7Y]- M9[;50IU7MDB]KU!]S-FX=X%3L=S+"S;'2N[C_JG<$A9"N0BLY'9?7P8^!4>P M>`/ENW_MD!<Y65'O)HPV4`6E-`XPO)6E?48U4Q*+`9Z^2ZF?TX#LOYK,CK@T MAI/_7+QX<V"=TT5&V<HBQV>GL\GI[,#:&T/)=5#9B75H6H+.)OGB`UG;'*OS MI,3@/#$1],.ZR30)X@5>?6&P@,).,GK($P[>AF7`/IYFT5847D?/<OC1CQXO M!=:+6.T]DVX&:AHT:*DR5_ZSK&0J.7X'O(AC%)3PC!_+'FS8S<;\%]HR1@3A MQY_=BM$(4$\($K)YJ9ZZCC^G,NX)R+(DW#X@RLV\\J[;TO##4K"1+>F[///\ M?"[&&#A#OP&*>3>T,4G_V01=UJ[\@DN_"96R%PFYS++F?8P,!G^X..(T51#X MY.IHJYA`?+H3-!03?VTVQ^/!(DO6]R1TCEKWRTHQMJ8DN8O&S+^D^997XDU2 MTYV&F+K7`5N<CRM!&V>%CZ<A70TU?^2$/LTAI5;`NL+X^A[[K@M9NJ@T7CC& M\5.DTWYY+[F^YUC[;%Z)G*,`Z\GPZG:W&D^NQ??.R[.CD_GY9';^D\LG;U=H MX;:^<)\\[1O!'OFLDJC`I5X3&GBJ54L`#]F"*Z2]<(H\EM=#78--F`*"DX7: MCN$_S6II<<*SJ'1W!\I/E$!5WBOVRB<7)85*8$^>&":AK#*Y;C.Y[7V`9[CD M>$7]ZK0X*IW6J0Z5RFR<K2>=A]E)DY]Q'&[+A<<GN'V[W[=E\);L_7Q22]Y5 M.0\NGG\3P,P!9U=PB\Q:_9:\(G?W\#`BPX7=;P\87O`'P\6.U#'7NL@KPK&T M0I+?<>UC\"7.5]]XO-8[L"Z=2[YY"P</;>>K_<M1#AG8RZAWV!^QRM5QY1Q$ MY*$6]DH-:J.(/HSQA0A0X;/B@;4*@X#&'#>*^<!"$?.O-UY4P'=UYZ;NWJS# MD1;I00*(G>HTPX6M3<04CFAUG=TKX=,D%R*2,;)R`_PIY?F<YG`>R"&&8=2_ M2@)YY=6Z81\B#3NP%B&-`FW#'(>Q8_BS;Z&PM7T*2KA',"?KLCP8UHF5BBEU M]4U?UY:N+&18RDS;U(3Y7BI>JV/Y?*)(5X^V?*0LN22B:A8'].M!'HK--V>4 MF%V^Y8%^Y/N=8?CB+=IUL3B8YXFD.I"@`[E:"XQ;"Y"1%O@[N=\IU(C2)^"< M(%X02@D%/`SP.RYK*T19AMB$;\%&>=4&Q9SF8&",0RCW%#I\>K7J]PE7WC4H MJ<J<^.$)LK96`EI;IW\Q7B:$:HMZF,DX#KO&RJ`1_WWGB.X7;FTWVT<%0_M( M/($SLGUV,0-RA[75;<[81D?#+BZK`*TTTW%]%&U`#/I1PBARH-MF<\@613`C M>\0^^Z&OW%_6]7MZ$25OT:ND6-ZB5UGQ?UX:U6[RE0]^YG)(4/F_KH3*+?RI M(JBN\B:;*BG]#0L;P=G]58P2U-^KF+DWX);[^J1(*]WYLX19R<!@&^M'@FO) M^2=&5:7(]G!J8FZ.HU4]^(EQ4QG)P\+G5!8,3KTC3(N<4(>@X<_?[OY<.<,S MRHL4>1^C^E;P8SV.\O&^[)<1`\M\?&@,_%8D^?C2,L;B*Y:.B1S2]PGEE6W2 MJ]F3W<5R`^PU3_"DP]((1#T:C_0PQ7?Q@;`1AQV/`';$EELZJ.`>[T#5^Z0_ M'ODKB`A[4&13":[!>.MT/'JL$.DB1JA2RJODMKPI)3+<5HTJOA=%X'E7&R+[ M2H0R:NT:>EPC^_O6Y.P$RI^&'D_R1A(J6YDZ#^GW!'2"5]%OPLDX#5V!DHV6 MSI6*0^MD\NW%<QY%GLT'6K$L`_AK#E7*HK'5T-AQA80OGVB-"%L-B<9":W)^ M?G;>P$A[:N1H]OJZ\E8T2A^L.=XP=*_:.A>(R"7824RZN^3MF>AQ^;G3D7^) M&F0X+*U&?'1#<B0$9TU].$2._"G9<K"`&!^N98=<,"J`V6V8^RO^Q@#HKR#8 M8*:7:XOJ"1L_Y9.T0Z:0-+`)MYR6\&GUZ(F?\A&S@E=97<![LB-/?A"_&'%4 MOR4_E:'(M8X]8>ZJ8T\BFQ%&(70&3"";B?Z;!DQ[7^_*);XIFV-9`E5/O:.J M@\+H]!0WPQ++DE1=.?!YKMIKU+:KCANQ(N9-4QR3H%MU4*DU)833Z6CS0-G# MTL/EK=38<&RVF(:`NL@R%*JX%$T@/,">05$!GK$$;)%1T2R.;>%AX&X@=81! MI]0._UY^Z8A]NU5G*Q!><A"^+=D<SKL@7/X31L1IS_6C$#@1QTX(WC`ACH.N M:+[3)G:X!5[$X3OL@14MJ^X]3;!5V.+G`*,';:LIN:DRK%H3*MF:G6HJ<QK9 M_OCL]+N!(?/6C'_LQ3VQRH"OW6?(T\8^(C[44?'7?O,,,?KE<F=4+U]`J&BO MV#D'PF95U8*O=V)5MVW15>3%UP1+O*9E8!GVVU_<GY_TMQ$8+7E[YA/D=GDB MMN\2P*@6&A56171Y#TVC;>_!1)=NM;"%J+)\V_FJB;#>5[C7B$%Z2<MZLTL< MNQZQL!C7@*KG)&PV%0]5^GL4AFL>'4(:#,@18P5(HC?T>SBS#&]H[#Q0))); MG:\6R4A7;-G75F_YP[4B$==0M.F'1Y<6)O2N]8?3%RB;N\5TO9HAK%7!90?\ MPQFH8Y8X6OBH1<PV/MBG\U''+'%L\4'O.3:9/<ZDUYWW,!4UACV.4`N`XH2# 5X4\47O/YY/1D/N_\%_83RXIX-0`` ` end