朝顔日記

RSSを作ってみた

2003-07-26

アンチポップ (2003-07-25)の Hatena RSS Machine の素晴らしさに感動して、ぜひこの日記でも RSS を発信したいと思い、手軽に RSS を作る方法はないものかと、あれこれ検索してみました。

で、ありました、ありました。意外と身近な (?) ところに。我らが神崎先生が、RSS 生成スクリプトのサンプルなるリソースを公開しておられるではないですか! 早速見てみたところ、ほとんどそのままの形でうちんくの最新の日記、latest.html に適用できることがわかりました。以下、うちんくの日記用に書き換えたperlスクリプトです。


$item_title = "h3";     #タイトルとリンクを抜き出す要素
$item_descr = "p";     #説明文を抜き出す要素
$host = "http://diary.noasobi.net/";

#ソースからタイトル、リンク、説明文を抽出
while(<>){
  if(m|<${item_title}.*?><a href="(.*?)">(.*?)</a>|){
    $link[++$items] = $1;
    $items_list .= qq(    <rdf:li rdf:resource="$host$1"/>\n);
    $title[$items] = $2;
    $isItem = 1;
  }elsif(m|<${item_descr}.*?>(.*?)</${item_descr}>| and $isItem){
    $str = $1;
    $str =~ s/<.*?>//g; #不要なマークアップを削除
    $descr[$items] = $str;
    $isItem = 0;        #説明文は1要素だけにしておく
  }
}

#以下、RSSの構文に従って出力
print <<EOF;
<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xml:lang="ja">
 <channel rdf:about="http://diary.noasobi.net/rss.rdf">
  <title>朝顔日記 最近の記事</title>
  <link>http://diary.noasobi.net/</link>
  <description>のりの日々のあれこれを綴った朝顔日記の最近の記事</description>
  <image rdf:resource="http://diary.noasobi.net/img/asagao-p.png"/>
  <items>
   <rdf:Seq>
$items_list
   </rdf:Seq>
  </items>
 </channel>

EOF

for $i (1..$#link){
  print <<EOF;
 <item rdf:about="$host$link[$i]">
  <title>$title[$i]</title>
  <link>$host$link[$i]</link>
  <description>$descr[$i]</description>
 </item>

EOF
}

print "</rdf:RDF>\n";

これを rss.pl と名付けて、こんな感じで、latest.html に適用させてみました。


Perl rss.pl latest.html > rss.rdf

見事に、rss.rdf が出力されました。しかし、ここで問題発生。(w

日記は、Shift-JIS で書いているので、当然出力される RSS も文字コードは Shift-JIS です。これをなんとか utf-8 に変換しなければなりません。どうせ perl で生成させているんだから、perl で変換すればよかろうと思ってググってみたら、perljp - 日本語 Perl ガイドなるページを発見。さっそく変換してみる。が、うまくいかない。何故に? と考えることしばし。うちの perl は 5.6 で、件のページに書いてあるのは、5.8 によるものでした。:p)

気を取り直して ActivePerl 5.8.0 に入れ替えます。入れ替え後はうまく変換されるようになりました。:-) rss.pl の吐き出すファイル名をとりあえず、rss.sjis として、以下を実行。


perl -Mencoding=shiftjis,STDOUT,utf8 -pe1 < rss.sjis > rss.rdf

これだと一時ファイルができて、邪魔くさいので、パイプ処理することにして、最終的にはバッチファイルにしてみました。以下が、実行するだけで latest.html から utf-8 な rss.rdf を吐き出すバッチファイルです。


@echo off
Perl c:\web\noasobi\diary\rss\rss.pl c:\web\noasobi\diary\latest.html | Perl -Mencoding=shiftjis,STDOUT,utf8 -pe1 > c:\web\noasobi\diary\rss.rdf

まぁ、日記を書く度に手動で実行しないといけないところがアレですが、そもそも、最新の日記と月別の日記を作るのに、コピペという原始的な方法をとっているわけで、まぁ、そこらあたりも含めて、一発であれこれするというのは今後の課題とします。:p)

「RSSを作ってみた」へコメントをつける

書き込み時の挙動について
URI らしき文字列には自動的にリンクが張られます。また "<" や、">" は実体参照化されます。
スパム対策のため、リファラを切っていると投稿できません。

この記事の永続的 URI ならびに トラックバック ping URI
http://diary.noasobi.net/2003/07/diary_030726a.html