Perlによる,YY-BOARDからのRSS生成処理

YY-BoardからのRSS生成 (掲示板)

カモランドのRSS化に伴い,掲示板(YY-BOARD)の投稿もRSS化する必要性に迫られた.

そこでスクリプトを作ったので,紹介してみます.


前提

上記のように,Jcode.pmモジュールとYuki:RSSモジュールを入手しておく必要があります.

Jcode.pmは,全角文字を考慮した文字列切り捨て処理と,UTF-8への変換に使用しています.

Yuki:RSSは,rss(1.0)の生成に使用しています.

YY-BOARDはver 4.8を対象としています.他のバージョンでログの形式が異なる場合は,使用できません.

生成プログラム(PerlのCGI)

yybbs2rss.cgi

#!/usr/bin/perl

# yybbsの投稿ファイルからRSSを生成するCGI
# 2005.06.05

use Jcode;
use Yuki::RSS;

$maxcount = 15;  # 最大出力件数

# ----- 編集すべき箇所 -----
# YY-BOARDのログファイルのフルパス
$logfile = 'xxx/yybbs.log';

# 掲示板CGIのURL
$url = 'http://

# RSSチャネルのタイトルと説明
$ch_title = 'xxx掲示板';
$ch_desc = 'xxxの掲示板です';
# ---------------------------


# yybbsの全投稿データを,メモリに読み込む
# スレッド投稿の場合,子投稿が親投稿の後の行にくるので,
# 先頭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); # 300バイトまでに制限する

    # 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,
);

# 日付の降順でソートして,先頭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++;
    }
}

# ヘッダを出力する
print "Content-type: text/xml\n\n";

# 本文を出力する
print jcode($rss->as_string)->utf8;

exit 0;


# 文字列を無害化する
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;
}

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

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

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

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

kamolandをフォローしましょう


© 2021 KMIソフトウェア