るびー めも

Ruby の学習メモを記す

Ruby で RSS Reader の作成(その2)

先ほど、プロトタイプの要件として以下を挙げました。

  • ruby で 各RSS の情報を読み込んで HTML に落とし込む


まずは、Google reader に登録している RSS フィードの登録情報を
Google Takeout というサービスでお持ち帰りします。

詳細は、以下を参考に作業してください。
RSSリーダー難民に捧ぐ、Googleリーダーからlivedoor Readerへの移行方法

#ダウンロードしたzip ファイルに、subscription.xml とかいう
#RSS フィードが OPML という形式で登録されているようです。

その subscription.xml から必要な情報(タイトルとRSS のアドレス)を抽出し
RSS のフィード情報を HTML に出力します。

プロトタイプは、以下のコードになりました。
ソースコードは、github のほうが読みやすいと思うので、こちらを参照してください。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# by Yuji Shimoda

require 'rss'
require 'rexml/Document'

def self.parse_opml(opml_node, parent_names=[])
    feeds = {}
    opml_node.elements.each('outline') do |el|
      if (el.elements.size != 0)
        feeds.merge!(parse_opml(el, parent_names + [el.attributes['text']]))
      end
      if (el.attributes['xmlUrl'])
        feeds[el.attributes['title']] = el.attributes['xmlUrl']
      end
    end
    return feeds
end

opml = REXML::Document.new(File.read('subscriptions.xml'))
feeds = parse_opml(opml.elements['opml/body'])

# HTML HEADER output
print <<"EOF"
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>RSS Sample</title>
</head>
<body>
EOF

# RSS Feed article GET
feeds.each do | key, value |
  print "<h2>#{key}</h2><br>"
  rss = RSS::Parser.parse("#{value}")
  rss.items.each do |article|
    puts "<h3><a href=#{article.link}>#{article.title}</a>"
    puts "#{article.description} <br>"
  end
end

# HTML output
print <<"EOF"
</body>
</html>
EOF

上記のプロトタイプを、rss.rb として作成したら
以下のコマンドで、index.html に出力します。

$ cd $HOME/Sites
$ ruby /path/rss.rb > index.html

手元のブラウザで、http://localhost/~user_name/ にアクセスすれば
先ほど出力された index.html が表示されるかと思われます。
#前提条件として、apache なり httpd が動作していないといけません。
#Mountain Lion では、標準で Apache が動作していないので何とかして
#動かしてください。

Safari で確認すると、以下のようなHTML が出力されていました。
f:id:yuji_shimoda:20130509225834p:plain








とりあえず、動くところまでは確認出来ました。
所要時間1時間程度です。


ただし、現状のままではほとんど使い物になりません。
現状の課題は、以下のとおりです。

  • 既読、未読の管理が出来ないのでひたすら読み続けるしかない(問題外)
  • google takeout でゲットした subscription.xml の順番でフィードが出力される
  • 記事が更新されるのは、cron の設定依存
  • 見た目がダサい(これ大事)



プロトタイプだと、記事の既読管理が難しい気がします。
拾ってきたフィードの記事は、何らかのかたちで
管理しないといけませんよね。#データベースとかに入れるのかな?

後、更新のタイミングも cron 任せなのがちょっとなぁって感じですね