RSSの最近のブログ記事

全ては想定の話なのですが、サイト更新の原稿を書くとき、いまどきはフィードでどこかへ流れてぶつ切りにされてしまって意味がわからなくなりがちなので、タイトルと、本文の1行目に気を使って原稿を書くわけです。

そうすると、本文の1行目は、自社の社名を入れておいたほうが、ほかの所で表示されたときにニュースの主体がはっきりするので(いわゆるニュースリリースの本文1行目と同じ書き方)、そうするのですが、その原稿を見せると、「自社の更新情報なのに自社の社名をいちいち入れるのはおかしい」「自社のニュースを見るターゲットはよそのサイトや何とかリーダーの読者ではなくてまずは自社のサイトに来るユーザーだろ」とか言われがちであります。

つまり、更新情報とはいえニュースを放流(リリース)してしまえば、自分の管理しているところ以外でも読まれてしまうから、ニュース単体でも意味がわかるようにしておこうという立場があり、逆に更新情報である以上優先すべきは更新情報が載せられるサイトのユーザーのわかりやすさであろうという立場もあり、それが衝突する場面であります。

となればどうするべきかということを考えた結果、自社サイトに掲載するときには、自社の社名などの情報をCSSで言うdisplay: none;で隠しておく、フィード受信先では、display: none;で隠した部分のインラインスタイルシートが外れてそのまま見える形で表示、なんてことをすればいいことに気付きましたが(結構な数のフィードリーダが、インラインスタイルシート指定は落としてくれる)、

非ネット系の会社ではこういうどうしようもないことって当たり前なんだろうなあとか思いました。

サイトの更新情報を管理するために、PerlでMovableTypeもどきを内製しまして、作った後初めての更新は毎週出している東北電力の計画停電に伴う案内だったりするのですけれども、MovableTypeもどきっていうことは、Feedも出力したほうが便利だよね?ということで、ちょっと考えました。

んで、MovableTypeだとIndex TemplateでRSSを書き出しているのだけれども、いまどきはXML::Feedとか、XML::RSSとかRSS生成に便利なモジュールがたくさんあるので、どっちにしようかと思いました。

なぜMovableTypeはIndex Templateだったのかなあと思い返していると、MovableTypeがはやった2003年~2005年では、まだFeedの規格が複数乱立し、しかもどれかが覇権を取るだろうと思われていた節もあり、複数書き出しておけ、新しい仕様のFeedができても対応できるようにしておけ、ということで、複数のFeedに対応できるよう複数のIndex Templateを用意してRSS 0.91とRSS 1.0とATOMを書き出すようにしていたような記憶があったりしますが、その後、RSSを読む側が複数の形式のFeedに対応するっていうことでFeedの形式はあんまり意味なさなくなったのでした。

つうことを考えて、いまどきはFeedの形式は1種類だけでいいよねーということで、だったらモジュールで生成してしまったほうがらくだよねーと思ってやってみたら、MovableTypeがわざわざIndex Templateにしていた意味を痛感したのです。

それは、Feedをモジュールで書き出そうとするとメタデータの設定箇所がたくさん出てしまいプログラムについついハードコーディングしちゃうっていうことです。MovableTypeのように、Index TemplateでFeedを書き出すようにすると、書き間違えで使えないFeedになる危険性はありますが、メンテナンス面ではMovableTypeのテンプレート編集システムが流用できるのですね。

MovableTypeやるじゃんとか思いました。

(旧ジャグラBBの時の記事はこちら


社団法人日本グラフィックサービス工業会(JaGra)さんのウェブサイト

社団法人日本グラフィックサービス工業会 [JaGra] [www.jagra.or.jp]

には、RSSがあるのに、新ジャグラBB

ジャグラBB - 印刷業のためのWebラーニングサイト:HOME [www.jagrabb.net]

には、RSSがなくて、とても残念です。

~~~

そこで、新ジャグラBBのページをRSSに変換しました(野良RSSです)。

新ジャグラBB 動画コンテンツ [dtpwiki.jp]

1時間に1回の間欠取得です。

JaGraさんが、RSS配信を始めるまでお使いください。無理な気がしますが。

RSS 2.0を、XML::Feedにぶっこむと、たまに日付がうまく処理できないRSSがあって、表示の順序が制御できなくなったりします。

原因を調べたら、日付の表記が、RSS 2.0ではRFC 822に従う必要があるのですが、RSS生成プログラムがRFC 822に従っていない書式で書き出してしまうことが原因でした。

過去にも、

M.C.P.C.: 「RSS 簡単一発作成 『RSS 生成 CGI』」から書き出されるRSS 2.0の日付情報が不正なので直すパッチ

で取り上げたりもしましたが、生成元のプログラムを直していただくことって実際には難しいですよね……

というわけで、RSSを受信した場所で、直す方法をとりたいと思います。

「ものかの」さんがWordPressに移行して「monokano」 [tama-san.com] になっていたので、うちで「ものかの」さんのトップページをクローリングして生成していたRSSを停止し、今までのアドレスでアクセスしてきた人へは301リダイレクトで「monokano」さんのRSSに転送しました。

こんな感じにした。

filename: .htaccess

redirect 301 /rss/monokano.xml http://tama-san.com/?feed=rss2

いままでは、せっかくいい情報出ているのに、Permalinkが無いのがとってもとっても残念で、RSSを生成し、無理やりパーマリンクを付けていたのですが(URLに#とフラグメント識別子を使って無理やり日付を付けて、他の日付の書き込みと区別していた)、やっとPermalinkができたことになります。なにはともあれ、よかった。

このHTMLからRSSを生成するっていうのは、HTMLを解析し、取得できる構造を発見し、データを取得し、整理するというスクレイピングの知識、書き出すときの形式としてのXMLの知識、RSSリーダで利用しやすいメタデータを意識するというRSSの知識などがいっぺんに必要になって、身につけるとかなり(印刷物の製作業務にも!)応用が利きまして、「これは流行る!」と思ったが流行らなかった。どうやら、業界的なネットへの接続時間が実は少ないから、という推論があるんだけどどうだろう。

コメント欄で問い合わせがあって、mixiの自分の日記をRSSに書き出すスクリプトが欲しいって言うんですけれども、3年半前のエントリであったため、すでにスクリプトの賞味期限が切れていたので、2009年8月現在でちゃんと動くスクリプトに直しました。

ユーザーID、パスワードはConfig:Pitで管理する方式です。

パスワード設定をコードに書かない(Config::Pit) - モダンなPerl入門 - モダンなPerl入門 [perl-users.jp]

スクリプトを動かす前に、上記リンク先を参照して、コマンドラインからアカウントとパスワードをセットしておこう。こんな感じでいいのでは。

$ perl -MConfig::Pit -e 'Config::Pit::set("mixi.jp", data=>{ email => "ABC12345", password => "password" })'

filename: miximydiary2rss.cgi

#!/usr/bin/perl 
 
use strict; 
use warnings;
use WWW::Mixi::Scraper;
use XML::Feed;
use DateTime::Format::HTTP;
use Config::Pit;
 
my $config = pit_get( 'mixi.jp' );
die "not preset account data in Pit." if !%$config;
my $email    = $config->{email}    or die 'email not found.';
my $password = $config->{password} or die 'password not found.';
 
my $mixi = WWW::Mixi::Scraper->new(
  email    => $email,
  password => $password,
);
my @list = $mixi->parse( 'http://mixi.jp/list_diary.pl' );
 
my $rss = XML::Feed->new( 'RSS',
          version => '1.0', encode_output => 0 );
$rss->title( 'mixi My Diary RSS' );
 
foreach my $item ( @list ) {
  my $entry = XML::Feed::Entry->new( 'RSS' );
  $entry->title  ( $item->{subject} );
  $entry->link   ( $item->{link   } );
  $entry->content( $item->{description } );
  my $dt = DateTime::Format::HTTP
           ->parse_datetime( $item->{time} )
           ->set_time_zone( 'Asia/Tokyo' );
  $entry->issued ( $dt );
  $rss->add_entry( $entry );
}
 
print "Content-Type: text/xml; charset=UTF-8;\n\n"; 
print $rss->as_xml,"\n";
 
exit;
 
__END__

もしかしたら、mixiの隠しAPIで一発で出せるのかな?

とあるRSSを、XML::Feedでパースしたら、うまくいきませんでした。そのRSSを

RSS Validator - feedAnalyzer RSSの構文チェック [feedanalyzer.com]

で調べてみたら、

"lastBuildDate" の日付の表記が間違っています。
"pubDate" "lastBuildDate" などではRFC 822の表記方法を使用します。
○正 > "Fri, 01 Jun 2005 03:00:00 +0900" (一例です 文字の間のスペースに注意してください)
○誤 > "Fri, 01 Mar 2009 03:00:00 +09:00"

とか出まして、RFC 822に従っていないので、XML::Feed(が使っているDateTime)が日付として認識できなかったようです。

ということで、これを生成しているのはなにかと思って調べてみたら、

<generator>http://www.futomi.com/library/rss/index.html?1.1.0</generator>

と書いていたので、該当するアドレスに飛んでみたら、RSS生成スクリプトでした。

RSS簡単一発作成『RSS 生成 CGI』 - futomi's CGI Cafe [www.futomi.com]

というわけで、シェアウェアだそうなので、インストールすることはとりあえずせずに、問題箇所を探してみました。

Filename: admin.cgi.patch

*** admin.cgi.orig      2006-07-25 11:57:00.000000000 +0900
--- admin.cgi   2009-03-10 11:46:26.000000000 +0900
***************
*** 876,882 ****
        if($CONF{'TIMEZONE_OFFSET'} =~ /^\-/) {
                $tz_sign = '-';
        }
!       my $tz = $tz_sign . sprintf("%02d", abs($CONF{'TIMEZONE_OFFSET'})) . ':00';
        my $channel_pub_date = "$pubdate[6], $pubdate[3] $pubdate[4] $pubdate[5] $pubdate[2]:$pubdate[1]:$pubdate[0] ${tz}";
        #image::title
        my $image_title = $CONF2{'IMAGE_TITLE'};
--- 876,882 ----
        if($CONF{'TIMEZONE_OFFSET'} =~ /^\-/) {
                $tz_sign = '-';
        }
!       my $tz = $tz_sign . sprintf("%02d", abs($CONF{'TIMEZONE_OFFSET'})) . '00';
        my $channel_pub_date = "$pubdate[6], $pubdate[3] $pubdate[4] $pubdate[5] $pubdate[2]:$pubdate[1]:$pubdate[0] ${tz}";
        #image::title
        my $image_title = $CONF2{'IMAGE_TITLE'};

このスクリプトを使っている人は、上のパッチを当てるといいんじゃないでしょうか。

フィードアグリケータを作っている僕としてはこれどうすればいいんでしょうね。

昨日のLibXML2を入れ替えたあと、CPANからXML::Feedをいれたら、依存モジュールとしてXML::RSSのバージョンも新しくなってしまったせいで、XML::RSSの出力が文字参照になってしまって、それで出力していたfeedを受信していたThunderbirdが、すべてのエントリを毎回違うエントリと認識してしまい、大変なことになってしまいました。

Nix::WebLab: XML::RSS で文字化け [lab.z-nix.jp]

で、解決。XML::RSS->new(encode_output => 0);ていうふうにしたら直った。

こうしてみると、ネットにあふれているXML::RSSのサンプルはこれはいっていないのが多いから、あたらしめのXML::RSSを使ってしまい、うまくいかんと思っている人も多そうだな。

会社で作っていたfeedを一覧にするやつなんですけれども、いつもは自分で集めたRSSなんでRSS 1.0だけ集めてたんで、XML::RSSで用事が済んでいたのですが、今回はユーザにfeedのURLを入力してもらっていたので、atomに対応できないXML::RSSだと不足と相成りました。

というわけで、いまどきは、

RSS(XML::Feed) - モダンなPerl入門 - モダンなPerl入門 [perl-users.jp]

がいいらしいので、CPANから入れようと思って、とりあえずうちのサーバで試そうと思ったら、あちゃー、うちのFedora Core 4 PPCなんですけれども、LibXML2が古いーて出るし、パッケージはねえし、しょうがねえので、本家からtarとってきてビルド。

$ wget ftp://xmlsoft.org/libxml2/libxml2-2.7.3.tar.gz
$ tar zxvf libxml2-2.7.3.tar.gz
$ cd libxml2-2.7.3
$ ./configure --prefix=/usr
$ make
$ su
# make install

このあと、CPANからXML::Feed入れたらちゃんと入った。

これでatomもいけるね! でも、ちらっと、LibXML2使わないでXML::Feed動くってどっかで見たよなあ。

Quark:テクニカルサポート: 8テクノロジーデータベース [japan.quark.com]

RSS作りやすい構造。本文配信までやるとちょっと苦労かも。

PAGE2009までいそがしーので誰か作って

月別 アーカイブ

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.7

このアーカイブについて

このページには、過去に書かれたブログ記事のうちRSSカテゴリに属しているものが含まれています。

前のカテゴリはQuarkXPressです。

次のカテゴリはScriptです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。