M.C.P.C.

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


| トップページ |

2007年8月19日 15:53

高度に回収頻度を多くした回収型RSSは生成型RSSと見分けがつかない

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

というわけで、InDesignの勉強部屋のRSS生成を1分ごとにしてみました。

ついでにソース

#!/usr/bin/perl
 
use strict;
use LWP::Simple;
use XML::RSS;
use HTML::Entities;
use utf8;
use Encode;
 
 
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('Shift_JIS', $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 $_;
}

これを、cronで1分ごとに起動するシェルスクリプトから起動するようにしておき、戻り値で、公開サイトにアップロードしたりしなかったり分岐しています。

投稿 大野 義貴 [Script] | |

トラックバック(0)

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

コメントする