M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2007年10月21日 16:00

InDesignの勉強部屋BBS移転したのでRSSを301転送かけたよ

このエントリーをはてなブックマークに追加 mixiチェック

http://cgi.www5c.biglobe.ne.jp/~thats/study_bbs/study.cgi?mode=find&word=12461(リファついているとあかんのでコピペでどうぞ)

[12461] BBS移転のお知らせ 投稿者:YUJI 投稿日:2007/10/21(Sun) 13:29
掲示板を以下のURLに移転させていただきました。
http://www2.rocketbbs.com/11/bbs.cgi?id=thats

大変申し訳ありませんが、以後新しい掲示板の方へ書き込みをお願い致します。
なお、この掲示板もしばらくの間は残しておきますが、
書き込みはできませんのでご了承下さい。

よろしくお願い致します。

ということで、新しい掲示板になるそうですけれども、確認したところ、RSSが付いているみたいなんで、僕がオレオレ生成しているRSS(http://dtpwiki.jp/rss/indesign.xml)でアクセスしてきたら、新しいRSSへ転送することにしました。オレオレ、ていっても、古い掲示板についているやつが、僕がお願いしてオレオレRSSをつけていただいたやつなんですけれども。

ちなみに、今どきだと301で転送しないとアメーバブログみたいにつるしあげられそうなので、できる限り301で転送するようにしたよ。

# 転送うんぬん以前に、レンタルサーバの障害が起こっていてらちあかないので急遽うちのサーバにDNSふり直したんだけども大丈夫かな。

今まで使ってたRSS生成スクリプト:

#!/usr/bin/perl
 
use strict;
use LWP::Simple;
use XML::RSS;
use HTML::Entities;
 
use utf8;
use Encode;
 
 
#my $url = $ENV{QUERY_STRING};
my $url = 'http://cgi.www5c.biglobe.ne.jp/%7ethats/study_bbs/study.cgi';
my $html = get($url);
my $length_current = length( $html );
my $length_before;
{
  open my $fh, '<', 'indesign.bytes' or $length_before = 0;
  if ( $length_before ne 0 ) {
    $length_before = <$fh>;
    close $fh;
  }
}
exit 1 if $length_before eq $length_current;
{
  open my $fh, '>', 'indesign.bytes';
  print $fh $length_current;
  close $fh;
}
$html = decode('cp932', $html);
$html =~tr|\x00-\x1f||d;
 
my $rss = XML::RSS->new;
 
$rss->add_module(
  prefix => 'content',
  uri    => 'http://purl.org/rss/1.0/modules/content/'
);
 
$rss->channel(
  title    => 'InDesignの勉強部屋',
  link     => $url,
  description => "InDesignの勉強部屋 最新RSS",
  language => 'ja',
);
 
# HTML から要素抽出
  
(my $Regex = <<'REGEX') =~ tr/\n//d;
<td .+?><font color="#006400"><b>(.+?)</b></font> / (.+?)
<td.+?<blockquote>(.+?)</blockquote></font></td></tr>
</table>.+?<div align='right'>No\..+? (.+?)</div></td></tr></table>
REGEX
 
while ($html =~ m/$Regex/gs) {
  my $title       = $1;
  my $name        = $2;
  my $description = $3;
  my $date        = $4;
  my $temp = normalize(" $description");
  my $dcdate = datecheck($date);
  $rss->add_item(
    link  => encode_entities( $url . "#$dcdate" ),
    title => normalize(" $title"),
    description => normalize2(" $description"),
    dc => {
      date    => $dcdate,
      creator => normalize2($name),
    },
    content => {
      encoded => "<![CDATA[$description]]>",
    },
  );
}
 
# 日付ソート
 
@{$rss->{'items'}} = 
    sort { $b->{dc}->{date} cmp 
           $a->{dc}->{date} } @{$rss->{'items'}};
 
# 表示or出力
 
if ( $ENV{GATEWAY_INTERFACE} ) {
  require CGI;
  print CGI::header('text/xml; charset=utf-8');
  print encode('utf8', $rss->as_string() );
}
else {
  # print encode('utf8', $rss->as_string() );
  $rss->save('indesign.xml');
}
 
exit 0; #正常終了(RSS生成済み)
 
 
sub normalize {
    local $_ = shift;
    s/^ //g;
    tr|\x00-\x1f||d;
    return $_;
}
 
sub normalize2 {
    local $_ = shift;
    tr|\x00-\x1f ||d;
    s/<(?:[^>'"]*|(['"]).*?\1)*>//gs;
    return $_;
}
 
sub datecheck {
    local $_ = shift;
    tr#/#-#d;
    s/\(.+\) /T/g;
    s/$/+09:00/g;
    return $_;
}

このまえRSSの生成が、定時に生成するタイプなんで、BBSへの書き込みがリアルタイムでRSSに反映されないのが問題、という話があったので、1分ごとにcronまわして、getしてきたhtmlの大きさで新しい書き込みがあったかどうかを確認して、そのうえでRSSを生成するコードが入っています。

投稿 大野 義貴 [DTP] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2256

コメントする