高度に回収頻度を多くした回収型RSSは生成型RSSと見分けがつかない
スポンサードリンク
というわけで、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分ごとに起動するシェルスクリプトから起動するようにしておき、戻り値で、公開サイトにアップロードしたりしなかったり分岐しています。
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2182
コメントする