差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
Perlによる,YY-BOARDからのRSS生成処理
//parent=掲示板ツール
*YY-BoardからのRSS生成 (掲示板)
カモランドのRSS化に伴い,掲示板(&link(YY-BOARD,http://www.kent-web.com/);)の投稿もRSS化する必要性に迫られた.
そこでスクリプトを作ったので,紹介してみます.
----
**前提
-YYBBS ver 4.8
-Jcode.pm (http://openlab.jp/Jcode/index-j.html)
-Yuki::RSS (http://www.hyuki.com/techinfo/yukirss.html)
上記のように,Jcode.pmモジュールとYuki:RSSモジュールを入手しておく必要があります.
Jcode.pmは,全角文字を考慮した文字列切り捨て処理と,UTF-8への変換に使用しています.
Yuki:RSSは,rss(1.0)の生成に使用しています.
YY-BOARDはver 4.8を対象としています.他のバージョンでログの形式が異なる場合は,使用できません.
**生成プログラム(PerlのCGI)
<itle(yybbs2rss.cgi);
--(
&verb(#)!/usr/bin/perl
&verb(#) yybbsの投稿ファイルからRSSを生成するCGI
&verb(#) 2005.06.05
use Jcode;
use Yuki::RSS;
$maxcount = 15; # &color(#ff0000){最大出力件数};
&verb(#) ----- &color(#ff0000){編集すべき箇所}; -----
&verb(#) YY-BOARDのログファイルのフルパス
$logfile = 'xxx/yybbs.log';
&verb(#) 掲示板CGIのURL
$url = '&verb(http://)xxx/yybbs.cgi';
&verb(#) RSSチャネルのタイトルと説明
$ch_title = 'xxx掲示板';
$ch_desc = 'xxxの掲示板です';
&verb(#) ---------------------------
&verb(#) yybbsの全投稿データを,メモリに読み込む
&verb(#) スレッド投稿の場合,子投稿が親投稿の後の行にくるので,
&verb(#) 先頭15件のみというわけにはいかない
my(@y_lines) = ();
my($first) = 1;
open (LOGFILE, "$logfile");
while (<LOGFILE>) {
if ($first == 1) {
$first = 0;
} else {
push(@y_lines, $_);
}
}
close (LOGFILE);
my(%metadata) = {};
foreach (@y_lines) {
my($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$icon) = split(/<>/);
my($title, $desc, $dcdate) = ();
$sub = filterstr($sub, 60); # 60バイトまでに制限する
$name = filterstr($name, 60); # 60バイトまでに制限する
$comment =~ s/<br>//g;
$comment = filterstr($comment, 300); # &color(#ff0000){300バイトまでに制限する};
&color(#ff0000){# titleの編集};
$title = "$sub 投稿者:$name";
# descriptionの編集
$desc = $comment;
# dc:dateの編集
$date =~ /^(\d+)\/(\d+)\/(\d+)\(\w+\) (\d+):(\d+)$/;
$dcdate = $1 . '-' . $2 . '-' . $3 . 'T' . "$4:$5" . ':00+09:00';
$metadata{"$dcdate$no"} = "$title<>$desc<>$dcdate<>$no";
}
my($rss) = new Yuki::RSS(
version => '1.0',
encoding => 'utf-8',
);
$rss->channel(
title => $ch_title,
link => $url,
description => $ch_desc,
);
&verb(#) 日付の降順でソートして,先頭15件を出力する
my($count) = 0;
foreach (reverse(sort(keys(%metadata)))) {
last if ($count >= $maxcount);
my($title, $desc, $dcdate, $no) = split(/<>/, $metadata{$_});
if ($no ne '') {
$rss->add_item(
title => $title,
link => "$url#$no",
description => $desc,
dc_date => $dcdate,
);
$count++;
}
}
&verb(#) ヘッダを出力する
print "Content-type: text/xml\n\n";
&verb(#) 本文を出力する
print jcode($rss->as_string)->utf8;
exit 0;
&verb(#) 文字列を無害化する
sub filterstr {
my($handle, $maxlen) = @_;
if (length($handle) > $maxlen) {
$handle = (jcode($handle)->jfold($maxlen))[0];
$handle = jcode($handle)->sjis;
$handle .= '...';
}
$handle =~ s/&/&/g;
$handle =~ s/</</g;
$handle =~ s/>/>/g;
$handle =~ s/"/"/g;
return $handle;
}
--)
カスタマイズのポイントは,赤字の箇所です.
カモランドで実際に稼働している例を,以下で確認できます.
-http://kamoland.com/cgi/batch/yybbs2rss.cgi
※ なお,このURLを''RSSリーダに登録して'',定期的に取得するのはやめてください.
(カモランドのサーバ負荷が増大するため)
もしRSSリーダに登録する場合は,[[RSSについて]]で正式に公開しているURLを使用してください.