M.C.P.C.

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


| トップページ |

2009年6月14日 17:22

DTP駆け込み寺新BBS稼働開始! 当方生成野良更新停止/RSS自動転送

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

DTP駆け込み寺の掲示板(BBS)が新BBSシステムに切り替わりました。

DTP駆け込み寺 掲示板 [www.dtptemple.org]

■新掲示板の主な変更点
・画像の張り込みができます。
・RSSの機能があります。
・URLはリンクになります。
・システムが変わりますので掲示板のデザインやユーザービリティは今のものと少し変わります。
■2009/6/14(日)に移行しました。
旧掲示板から新掲示板に移行しました。
新掲示板の利用方法をご覧いただいて、全体表示、ツリー表示、トピック表示などの画面からご利用ください。
■データの引き継ぎ
新掲示板には旧掲示板のデータを引き継ぎました。 投稿番号のつき方のルールが違いますので、移植にあたって困りましたが、ご寛容をお願いいたします。
■旧掲示板
閲覧だけできるように残す予定ですが、新規投稿をできなくすることや、新掲示板へのリンクを付ける改修などをしようとしていますが、ちと、作業中でして、現在はエラーになってしまいます。(2009/6/14 15:00)

とのことです。RSS生成をしているとのことで、2006-04-18より3年にわたり当方で生成していたRSSの更新を停止し、301リダイレクトによる転送をかけました。

Filename: .htaccess

redirect 301 /rss/dtpkakekomidera.xml http://www.dtptemple.org/imgbbs/index.php?mode=rss1

RSSの生成をしていたスクリプトはこんな感じです。DTP駆け込み寺の掲示板の解析は非常に困難で、人のふんどしで相撲をしているようなもんではありますが、スクリプト自体にはすげえ愛着があります。確か、掲示板上では書き込み日付は年がない日付しか書かれていないのが困った記憶がある。

Filename: dtpkakekomidera.pl

#!/usr/bin/perl -w
 
use strict;
use LWP;
use XML::RSS;
use HTML::Entities;
use utf8;
use Encode;
use Data::Dumper;
 
#my $url = $ENV{QUERY_STRING};
my $url = 'http://gande.co.jp/cgi-momoco/2chview.cgi';
 
my @headers = ( 
  'User-Agent' => 'DTPWiki.jp html2RSSbot(http://dtpwiki.jp/rss/dtpkakekomidera.xml)',
);
my $browser = LWP::UserAgent->new;
my $response = $browser->get($url, @headers);
exit 1 unless $response->is_success;
my $html = decode('cp932',$response->content);
 
$html =~ s/\x0D\x0A|\x0D|\x0A/\n/g; 
$html =~ s|^.+次のページ</a>\n\t</div>\n</div>\n\n||sgo;
$html =~ s|\n\n<div class="linkmenu">.+$||sgo;
$html =~ s|\t|<tab />|g;
$html =~ tr/\x00-\x1f//d;
$html =~ s|<tab />|\t|g;
 
#print $html;
#exit;
 
my $rss = XML::RSS->new(version => '1.0', encode_output => 0);
 
	$rss->add_module(
		prefix=>'content',
		uri=>'http://purl.org/rss/1.0/modules/content/',
		);
	$rss->add_module(
		prefix=>'annotate',
		uri=>'http://purl.org/rss/1.0/modules/annotate/',
		);
 
$rss->channel(
    title    => 'DTP駆け込み寺 掲示板',
    link     => 'http://gande.co.jp/cgi-momoco/momoco.cgi?btype=pc&amp;page=1',
    description => 'DTP駆け込み寺 掲示板 最新書き込み(50件)',
    language => 'ja',
    dc => {
      publisher    => 'DTP駆け込み寺',
      contributor  => 'DTPWiki.jp',
    },
    syn => {
      updatePeriod => 'hourly',
      updateFrequency => '1',
    },
);
 
my ($filesize,$link,$date,$title,$description,$platform);
 
my (%item,@items);
 
(my $Regex = <<'REGEX') =~ tr/\n//d;
<div class="comment">
\t<h4><a id="t_(..............)">(.+?)</a></h4>
\t<p>名前:<strong>(.+?)</strong>............
<span class="small"> \[(.+?)\]</span><br>
\t(.+?)
\t</p>\t(.+?)</div class="comment">
REGEX
 
my $i;
 
$html =~ s|</div><div class="comment">|</div class="comment"><div class="comment">|g;
$html =~ s|</div>$|</div class="comment">|;
 
while($html =~ m|$Regex|gsio) {
 
  my $link        = $1;
  my $title       = $2;
  my $name        = $3;
  my $ua          = $4;
  my $description = $5;
  my $html2       = $6;
  
  $name =~ s|<a href=".+?">(.+?)</a>|$1|;
  $ua   = normalize2( $ua );
  $date = datecheck2($link);
 
  push @items ,{
    title => normalize2("$title"),
    description => normalize2("$description --$name\[$ua\]"),
    link => "http://gande.co.jp/cgi-momoco/momoco.cgi?btype=pc&amp;mode=tp&amp;ord=new&amp;page=1&amp;file=$link",
    date => $date,
    creator => normalize2($name),
    content => "<![CDATA[<p>$description</p><p>$name\[$ua\]</p>]]>",
    annotate => '',
  };
 
#  (my $year = $link) =~ s|(....).*|$1|;
 
  (my $Regex2 = <<'REGEX') =~ tr/\n//d;
<hr>
\t<p>(...) 名前:<strong>(.+?)</strong> (../.. ..:..)
<span class="small"> \[(.+?)\]</span><br>
\t(.+?)\t</p>
REGEX
 
  my $date_before = $date;
 
  while ($html2 =~ m/$Regex2/gsio) {
 
    my $number = $1;
    $name        = $2;
    $date        = $3;
    $ua          = $4;
    $description = $5;
    (my $year = $date_before) =~ s|(....).*|$1|;
    my $date2 = "$year-$date:00";
    $date2 =~ s|(..) (..)|$1T$2|;
    $date2 = datecheck($date2);
    if ($date2 lt $date_before) {
      #$year++;
      $date2 = "$year-$date:00";
      $date2 =~ s|(..) (..)|$1T$2|;
      $date2 = datecheck($date2);
    }
    $date_before = $date2;
    $name =~ s|<a href=".+?">(.+?)</a>|$1|;
    $ua   = normalize2( $ua );
 
   push @items ,{
      title => normalize2("re\[$number\]:$title"),
      description => normalize2("$description --$name\[$ua\]"),
      link => "http://gande.co.jp/cgi-momoco/momoco.cgi?btype=pc&amp;mode=tp&amp;ord=new&amp;page=1&amp;file=$link#$number",
      date => $date2,
      creator => normalize2($name),
      content => "<![CDATA[<p>$description</p><p>$name\[$ua\]</p>]]>",
      annotate => "http://gande.co.jp/cgi-momoco/momoco.cgi?btype=pc&amp;mode=tp&amp;ord=new&amp;page=1&amp;file=$link",
    }
  }
}
 
my @sort = sort { $b->{date} cmp $a->{date} } @items;
splice (@sort, 50);
 
foreach my $item (@sort) {
 
  $description = $item->{'description'};
  if ($item->{'annotate'} eq '') {
    $rss->add_item(
      link  => $item->{'link'},
      title => $item->{'title'},
      description => $item->{'description'},
      dc => {
        date       => $item->{'date'},
        creator    => $item->{'creator'},
      },
      content => {
        encoded => $item->{'content'},
      },
    );
  }
  else {
    $rss->add_item(
      link  => $item->{'link'},
      title => $item->{'title'},
      description => $item->{'description'},
      dc => {
        date       => $item->{'date'},
        creator    => $item->{'creator'},
      },
      content => {
        encoded => $item->{'content'},
      },
      annotate => {
        reference => $item->{'annotate'},
      },
    );
  }
}
 
if ($ENV{GATEWAY_INTERFACE}) {
    require CGI;
    print CGI::header(
      -type    => 'text/xml', 
      -charset => 'utf-8',
    );
}
 
print encode('utf8', $rss->as_string() );
 
sub normalize {
    local $_ = shift;
    tr/ \r\n//d;
    return $_;
}
 
sub normalize2 {
    local $_ = shift;
    tr|\x00-\x1f ||d;
    s/<(?:[^>'"]*|(['"]).*?\1)*>//gs;
    return $_;
}
 
sub datecheck {
    local $_ = shift;
    tr#/#-#d; 
    s/\(.+\) /T/g;
    s/^: //g;
    s/$/+09:00/g;
    return $_;
}
 
sub datecheck2 {
    local $_ = shift;
    s/^(....)(..)(..)(..)(..)(..)/$1-$2-$3*$4:$5:$6+09:00/;
    tr/*/T/;
    return $_;
}

新しい掲示板になって、もっとDTP関連の人の情報交換が進むといいなあと思っています。

投稿 大野 義貴 [DTP] | |

トラックバック(0)

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

コメントする