2006/01/19(木)Google Sitemap XML出力 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";
}