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/&/&/g; $handle =~ s/</</g; $handle =~ s/>/>/g; $handle =~ s/"/"/g; return $handle; } カスタマイズのポイントは,赤字の箇所です. カモランドで実際に稼働している例を,以下で確認できます.
※ なお,このURLをRSSリーダに登録して,定期的に取得するのはやめてください. (カモランドのサーバ負荷が増大するため) もしRSSリーダに登録する場合は,RSSについてで正式に公開しているURLを使用してください. |