blue

RSSを購読されている方へ(フィードの統合)

  • Posted by: SOMA Hitoshi
  • July 19, 2007 8:56 PM
  • mt | web | whatsnew

「HOME」タブ内にあるここのブログ──そんなこと言われてもって感じだとは思いますが、個別記事のURLにひっそり示されるとおり一応「blue」という呼び名になります──と、日記である「Yellow」とで、いままでは別々のRSSフィードを用意していましたがそれを統合しました。いずれは「Pink」なども統合しようと思いますが、実質いまは更新休止中のようなものなのでひとまず「blue」と「Yellow」のみ。

今後はひとつのRSSフィードをチェックすることで、「blue」「Yellow」両方の更新情報を受け取ることができます。人によっては〈ありがた迷惑〉な場合もあるかと思いますが、まあ、そうさせてもらいます。

それぞれの旧フィードから新しい統合フィードへはリダイレクトをかけてあり、すでに購読されている方は特段意識することなく移行しているかと思いますが、一応、リンクを張ったのが統合フィードのアドレス。FeedBurner(日本語版)を使ってます。

で、以下は統合フィードを用意するにあたっての技術的なメモ。

  1. 複数のサイトのRSSを一本にまとめるにあたっていろいろネットの情報にあたったが、選択肢があるようでない。はじめはFeedBurnerだけでもってそういうこともできるのかと思っていたがどうもそれはできない様子。あるいはTumblrに全部のフィードをインポートさせ、そのTumblrが吐き出すRSSを用いるという手もあるかと考えたが、それは私の場合のTumblr用途(およびサイト構成)に合わないから却下。「サーバー負荷」というものが頭にあって、自サーバーにそれ用のCGIを置いてやる方法は避けたいなあと思っていたものの、いろいろ検索した挙げ句に出会った次の記述に説得された。

    mixiに外部RSSを登録する際に複数のRSSをまとめたRSSを作る要求があって、いくつかのサービスを使ってきたが、はてなRSSは時系列に並ばず、FEMiXはいつの間にか消滅しており、mixfeedは最近信用できなくなってきた(更新が遅いのは許せるとして、特定のアイテムがいつまでも取得されない)。
    なので自分で作ることにした。
    worris' 複数のRSSをまとめるCGI

  2. で、オリジナルCGIも上記サイトを含めいくつかのソースが公開されているが、私は「複数のRSSをまとめるCGIスクリプト - アキラのITメモ」を参照。ここにあるソースほとんどそのままだが、RSSの出力形式をAtomにだけ変えた(赤字部分)。──といって私の場合、後述のとおり最終的にFeedBurnerを通してしまうので、FeedBurnerの「スマート・フィード」機能を利用するかぎりここでの形式指定には意味がなくなるが。

    #!/usr/bin/perl
    
    use XML::TreePP;
    use XML::FeedPP;
    
    my $feed = XML::FeedPP::Atom->new();
    $feed->merge( "統合対象とするフィードのURL1" );
    $feed->merge( "統合対象とするフィードのURL2" );
    $feed->merge( "統合対象とするフィードのURL3、その他、行を増やしていくつでも" );
    $feed->sort_item();
    my $now = time();
    $feed->title( "フィードのタイトル" );
    $feed->description( "フィードの説明" );
    $feed->link( "親サイトのURL" );
    $feed->pubDate( $now );
    
    my $xml = $feed->to_string( "UTF-8" );
    
    print "Content-type: application/xml\n";
    print "Pragma: no-cache\n";
    print "Cache-Control: no-cache\n";
    print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n\n";
    print "$xml";
  3. このソースをたとえば「rss.cgi」として保存(「フィードの説明」等で日本語を使う場合にはファイルの文字コードも「UTF-8」に揃える)、それからFeddPP.pmTreePP.pmというPerlモジュールをそれぞれダウンロードして、「rss.cgi」と同階層に作る「XML」フォルダのなかに置く。「rss.cgi」にはもちろん実行パーミッション(「755」等)を。

  4. 「rss.cgi」にアクセスすると統合フィードが出力される仕組みなので、この「rss.cgi」のアドレスがそのまま統合フィードのアドレスになる(私の場合はさらにそれにFeedBurnerをかませている)。この場合環境によっては、「.cgi」ファイルが吐き出すものをRSSとして認識してくれないといった可能性があるかと思うが、さしあたり私はそこまで対処していない。

  5. 追加で、リダイレクト。リダイレクトの効果についてはこちらが説得的だ。

    というわけで FeedBurner の導入に踏み切ったわけですが、従来からの Feed 読者がいるわけで、それらの人々のための対策として、.htaccess で mod_rewrite を使って、古い Feed の URI から新しい Feed の URI へとリダイレクトをかけました。すると驚いたことに、はてな RSSでは、従来の3つの Feed に分散していたフィード登録ユーザーが、すべて新しい Feed の URI に自動的に統合されました。これには驚きです。

    追記: Livedoor Reader では以下のような感じで新しい Fedd の URL に統合されるらしいです。一週間くらい待ってみろ、ということですね。

    フィードのURLを変更したい場合

    • フィード取得の際に「301 Moved Permanently」ステータスを返された場合、巡回対象のフィードのURLを書き換えます。
    • フィードの移転は即座に反映されず、定期的に処理されます。
      • 現在のところ、一週間に一度、一括で処理しています。

    フィードのリダイレクト処理について - livedoor Reader まとめサイト - livedoor Wiki(ウィキ)

    Movable Type に FeedBurner を導入してみました | 住 太陽のブログ

  6. 基本的には旧フィード(個々のフィード)から統合フィードへリダイレクトをかけるのだが、私の場合、「rss.cgi」が取得しに行った場合にまでリダイレクトされてはだめなので、たとえば従来の「atom.xml」があるとして、MTの新規テンプレートでまったく同じものを複製し、「atom2.xml」として出力するように設定、「rss.cgi」はこちらの「atom2.xml」を読みに行くようにする。

    リダイレクトの設定についてはFeedBurnerのヘルプに詳しく、「mod_rewriteが使える場合」「使えない場合」というふうにそれぞれ解説されているが、私の場合のようにもとより「atom2.xml」のようなものを作っている場合には、「mod_rewrite」を利用することに用途上の意味はなくなる(たぶん)ので、たとえば次のように .htaccessに書き加えればよい。

    Redirect permanent /atom.xml http://feeds.feedburner.jp/web-conte

    これでクライアントには「301」が返る。

以上。

関連記事

トラックバック(0)

トラックバックURL: http://web-conte.com/blue/mt-tb.cgi/152