はてなダイアリー写真画像抽出スクリプト(Perl)。
の続き。
こちらの「はてなダイアリー見出し抽出スクリプト」による、画像抽出がすごく面白いと思ったので、自分も画像抽出スクリプトを作ってみた。
スーパーpreがサポートされたことだし、せっかく(?)なのでスクリプトをコピペしてみるテスト。
#!/usr/bin/perl # -------------------- 使用モジュール列挙 use strict; use Time::Local; use LWP::Simple; # -------------------- 変数初期化 #my @cdays = ( 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31); # うるう年じゃない年用 my @cdays = ( 0 , 31 , 29 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31); # うるう年用 # -------------------- 引数チェック if (!$ARGV[0]) { print STDERR "usage: $0 URL\n"; print STDERR " ex. $0 http://d.hatena.ne.jp/tmx/200307\n"; exit(1); } elsif (!($ARGV[0] =~ m#^http\://#)) { print STDERR "Not URL!\n"; exit(1); } # -------------------- HTMLページ取得&行で分解 my $log = get($ARGV[0]); my @lines = split(/\n/, $log); # -------------------- 全行ループ # <img class="photo" src="/images/diary/tmx/2003-07-31.jpg" alt="tmx2003-07-31" title="tmx2003-07-31"> my @photos; my $title = ''; my $year; my $month; for (my $i = 0; $i <= $#lines; $i++) { if ($lines[$i] =~ m#<h2>.*<span class="title">(.*)</span>.*</h2>#) { $title = $1; } elsif ($lines[$i] =~ m#<h2>.*</h2>#) { $title = ''; } if ($lines[$i] =~ m#<img class="photo" src="/images/diary/(\w+)/(\d+)-(\d+)-(\d+)\.jpg"#) { $photos[$4] = qq(<A HREF="/$1/$2$3$4">\n<IMG SRC="/images/diary/$1/$2-$3-$4.jpg" ALT="$title" BORDER="0"></A>); $year = $2; $month = $3; } } # -------------------- カレンダーを生成 # その月の一日の曜日を計算 my $time = timelocal(0, 0, 12, 1, $month - 1, $year); # 月の値は0〜11なので、-1する my $wday = (localtime $time)[6]; # 日曜日から始まる曜日を、月曜日から始まるように変更(月(0)〜日(6)) $wday = $wday - 1; $wday = 6 if ($wday < 0); print qq(<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">\n); print qq(<TR>\n); for (my $i = 1; $i <= 42; $i++) { print qq(<TD ALIGN="center" VALIGN="middle">); print $photos[$i - $wday] if (($i - $wday) >= 1); print qq(</TD>\n); print qq(</TR>\n) if (($i % 7) == 0); print qq(<TR>\n) if (($i % 7) == 0); if (($i % 7) == 0) { my $day; for (my $j = 0; $j < 7; $j++) { $day = $i + $j - $wday - 6; print qq(<TD ALIGN="center">); print qq(<FONT SIZE="-1">) if ($j < 5); print qq(<FONT SIZE="-1" COLOR="#0000ff">) if ($j == 5); print qq(<FONT SIZE="-1" COLOR="#ff0000">) if ($j == 6); print sprintf("%02d/%02d", $month, $day) if ($day > 0 && $day <= $cdays[$month]); print qq(</FONT>); print qq(</TD>\n); } last if ($day >= $cdays[$month]); print qq(</TR>\n) if ($i < 42); print qq(<TR>\n) if ($i < 42); } } print qq(</TR>\n); print qq(</TABLE>\n);
あ。ファイル名は、imgextract.plでお願いします。(別に何でもいいんだけど。
このスクリプトによる、画像抽出例は、
とか。
このようなページを自動生成してくれる機能があったら良いかも(はてなダイアリーへの要望)。
いわば、calendar2photoモジュールやcalendar2jphotoモジュールの画像が大きいバージョン?
(10/27、追記)の、画像のURL変更に対応する差分。ファイル名は、imgextract2.plで。(何でもいいけど。
$ diff imgextract.pl imgextract2.pl 31c31 < # <img class="photo" src="/images/diary/tmx/2003-07-31.jpg" alt="tmx2003-07-31" title="tmx2003-07-31"> --- > # <img class="photo" src="/images/diary/t/tmx/2003-07-31.jpg" alt="tmx2003-07-31" title="tmx2003-07-31"> 43,46c43,46 < if ($lines[$i] =~ m#<img class="photo" src="/images/diary/(\w+)/(\d+)-(\d+)-(\d+)\.jpg"#) { < $photos[$4] = qq(<A HREF="/$1/$2$3$4">\n<IMG SRC="/images/diary/$1/$2-$3-$4.jpg" ALT="$title" BORDER="0"></A>); < $year = $2; < $month = $3; --- > if ($lines[$i] =~ m#<img class="photo" src="/images/diary/(\w+)/(\w+)/(\d+)-(\d+)-(\d+)\.jpg"#) { > $photos[$5] = qq(<A HREF="/$2/$3$4$5">\n<IMG SRC="/images/diary/$1/$2/$3-$4-$5.jpg" ALT="$title" BORDER="0"></A>); > $year = $3; > $month = $4;ま〜、使ってる人いないと思うけど。(笑