はてなダイアリー写真画像抽出スクリプト(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モジュールの画像が大きいバージョン?

の、画像の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;

ま〜、使ってる人いないと思うけど。(笑

(10/27、追記)