2006/01/19(木)Google Sitemap XML出力 perl スクリプト

はてブ数 2006/01/19 06:06 ソフトウェア::Perlつーさ

というわけで、Googleのサイトマッププロトコルに対応した
サイトマップを生成出力するperlスクリです。

マニュアルとかは作ってませんが、
サイトマップを導入しようなんて考えてるユーザさんには必要ないでしょう(ぇ
以下にそのままペーストしておきます。改変とかも自由。

# 自分のとこではGoogleに登録してValidate待ちなので、まだ動作保証しません。
Valid出ました。というわけで使え^^

#!/usr/bin/perl

#  googleサイトマップ出力スクリ ver 0.01 / 月影とも 2006. 1.19

$basedir = './'; # スクリからみたトップの相対path
$sitetop = 'http://tsu.sakura.ne.jp/'; # $basedirのURL

OutputHead(); #ヘッダ

# 個別URL追加
# 引数は url, 更新頻度, 優先度, 実ファイル名(日付を見るため)
OutputUrl('','daily',0.9,'index.html'); 
OutputUrl('sb.cgi?pid=0','monthly',0.3);

# ディレクトリ単位(サブディレクトリも検索します)
# 引数は ディレクトリ名
OutputDir('article'); 

OutputFoot(); #フッタ

sub OutputDir{
    my $dirname = shift;
    opendir DIR, $dirname;
    @dirlist = readdir DIR;
    closedir DIR;
    
    # .htmlファイル
    foreach(grep { m/\\.html$/ } map {-f "$basedir/$dirname/$_" ? $_ : '' } @dirlist)
    {
        my $cf='',$pr='',$rfn = '';
        
        # 個々の細かいことはここに書く。
        if($_ eq 'index.html')
        {
            $rfn = $_;
            $_ = '';
            $cf = 'weekly';
            $pr = '0.8';
        }
        
        OutputUrl("$dirname/$_",$cf,$pr,$rfn);
    }
    # ディレクトリを掘る
    foreach(grep { m/^[^\\.]/ } map {-d "$basedir/$dirname/$_" ? $_ : '' } @dirlist) 
    {
        OutputDir("$dirname/$_");
    }
}

sub OutputHead {
    print "Content-Type: text/xml\\n\\n";
    print '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="[http://www.google.com/schemas/sitemap/0.84:">http://www.google.com/schemas/sitemap/0.84">]
';
}
sub OutputFoot {
    print "</urlset>\\n";
}

# URLを出力
sub OutputUrl {
    my $fn = shift;
    my $cf = shift;
    my $pr = shift;
    my $realfn = shift;
    
    my $t = $realfn ? (stat($realfn))[9] : (stat($fn))[9];
    print "<url>";
    my $url = "$sitetop/$fn";
    $url =~ s![http://!!;]
    $url =~ s!//!/!g;
    $url =~ s!\\&!\\&!g;
    $url =~ s!\\'!\\'!g;
    $url =~ s!\\"!\\"!g;
    $url =~ s!\\<!\\<!g;
    $url =~ s!\\>!\\>!g;
    print "<loc><a href="http://$url</loc>";">http://$url</loc>";</a>
    if($t){
        my ($sec,$min,$hour,$mday,$mon,$year,$wno) =  gmtime($t);
        print "<lastmod>".sprintf("%04d-%02d-%02dT%02d:%02d:%02d+00:00",
            ($year+1900),($mon)+1,$mday,$hour,$min,$sec)."</lastmod>";
    }
    print "<changefreq>$cf</changefreq>" if($cf);
    print "<priority>$pr</priority>" if($pr);
    print "</url>\\n";
}