差分表示


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)

&ltitle(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/&/&amp;/g;
    $handle =~ s/</&lt;/g;
    $handle =~ s/>/&gt;/g;
    $handle =~ s/"/&quot;/g;
    return $handle;
}
--)

カスタマイズのポイントは,赤字の箇所です.

カモランドで実際に稼働している例を,以下で確認できます.

-http://kamoland.com/cgi/batch/yybbs2rss.cgi

※ なお,このURLを''RSSリーダに登録して'',定期的に取得するのはやめてください.
(カモランドのサーバ負荷が増大するため)

もしRSSリーダに登録する場合は,[[RSSについて]]で正式に公開しているURLを使用してください.


© 2019 KMIソフトウェア