本ブログの更新は停止しています。更新は新しいサイトの Travellers Tales で行なっています。

RSS を読み込み最近の記事を表示する CGI


RSS/ATOM からデータを取得して、JavaScript で吐き出す CGI を作ってみました。ありそうなスクリプトなのに、検索で見つけられなかったので、自作しました。もしかしたら世の中には、ずっとできのよいスクリプトがあるのかもしれません。

作ってみた、と言っても、大部分は他の方の Perl スクリプトによります。以下のスクリプトを参考にしました。

Perlメモ/RSSの解析 - サイトの更新情報、RSSをパースする簡易的な方法です。
perl から Web ページを読み込む (こちらのスクリプトは、ほぼそのまま利用させてもらっています)

■ ダウンロード:rss.zip

■ インストール方法:

解凍すると以下のファイルができます。
・rss.cgi
・getHTTP.cgi

CGI のお約束ですが、rss.cgi の1行目に利用している CGI サーバの Perl のパスに書き換えて下さい。デフォルトは、#!/usr/local/bin/perl になっています。

また、自分のサイト以外からは呼び出せないように制限がかかっていますので、rss.cgi 内の設定箇所を自分の環境に合わせて書き換えて下さい。

以上が済んだら、2つのファイルをサーバにアップロードして下さい。
アップロード後、各ファイルのアクセス権を 755 等、利用しているサーバにあったアクセス権で設置して下さい。

■ 使い方:

設置する html 内に以下のような JavaScript を設置します。iBlog の場合、Site Navigation に埋め込むとよいでしょう。

<script language="JavaScript" src="http://foo.bar/rss.cgi?url=http://hogehoge.com/rss.xml">

http://foo.bar/rss.cgi の部分は、自分の設置した rss.cgi の URI です。url= に読み込む RSS ファイルの URI を指定します。

他にもパラメータがいくつかあります。& でつなげて書いて下さい。

type=atom ATOM を解析します。指定しないと RSS として解析します。
num=数字  表示する記事の数です。指定しない場合、全て表示します。
desc=1 記事の要約を表示します。今のところ RSS は description 要素、ATOM は summary 要素の内容を表示します。

例)
<script language="JavaScript" src="http://foo.bar/rss.cgi?url=http://hogehoge.com/atom.xml&type=atom&num=10&desc=1">

⇒ http://hogehoge.com/atom.xml にある ATOM を読み込み、記事を10個まで表示、要約 (summary) も表示する

■ サンプル

当ブログの右のナビゲーション部分にある Recent Entries がこの CGI を利用しています。

■ 動作環境

Perl 5 以上。以下の各モジュールが使えること。(通常のサーバは使えますが、Socket の利用を禁止しているサーバもあります)

 Socket;
 FileHandle;
 MIME::Base64;

RSS 0.92/1.0/2.0 および ATOM 0.3 で動作確認。

■ 制限事項

読み込む RSS/ATOM は UTF-8 であること。書き出す文字コードも UTF-8。

未検証ですが、EUC-JP でも動くと思います。文字コードの変換を一切行っていないので、その場合出力文字コードも EUC-JP になると思われます。

■ 今後の予定
・UTF-8 以外のエンコーディングに対応(読み込み/書き出し)
・html での書き出し (あまり実装する気なし。でも iframe に便利か)

■ Tips?

・最終的に JavaScript が吐き出した html では、スタイルシートで記事見出しに class="rtitle"、記事要約に class="rdesc" と指定してあります。それぞれにスタイルを指定したい場合は、rtitle、rdesc をスタイルシートで定義できます。

・80番以外のポートを使っている場合は、http://foo.bar:8080 というように指定して下さい。

■ つぶやき

Perl でソケットというものをはじめて触ったのですが、ローカルでは問題ないのに、利用している interQ のサーバではエラーが出て苦労しました。バージョンの違いからか

foreach my $tag qw(title link description) { }

という書き方でエラーが出ていたのと、

getservbyname

でポート番号を取得できないことにより、エラーが起こっていて悩みました (最初はそれすらもわからなかった)。Perl には明るくないのでわかりませんが、こういうのって、もしかして常識でしょうか。

Posted: 木 - 12月 9, 2004 at 01:00 AM               Hatena Bookmark



©