Ruby で RSS Reader の作成(その2)
先ほど、プロトタイプの要件として以下を挙げました。
まずは、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 が出力されていました。
とりあえず、動くところまでは確認出来ました。
所要時間1時間程度です。
ただし、現状のままではほとんど使い物になりません。
現状の課題は、以下のとおりです。
- 既読、未読の管理が出来ないのでひたすら読み続けるしかない(問題外)
- google takeout でゲットした subscription.xml の順番でフィードが出力される
- 記事が更新されるのは、cron の設定依存
- 見た目がダサい(これ大事)
プロトタイプだと、記事の既読管理が難しい気がします。
拾ってきたフィードの記事は、何らかのかたちで
管理しないといけませんよね。#データベースとかに入れるのかな?
後、更新のタイミングも cron 任せなのがちょっとなぁって感じですね