RubyのRSS Parserを使ってアンテナを作る

FeedもLast-Modifiedもどっちでもアンテナるよ。

開発環境

DLTKはEclipseのSoftware Updatesからインストールする。

[Help | Software Updates | Find and Install]
  Search for new features to install
    Europa Discovery Site
      +Enabling Features
        ->Dynamic Languages Toolkit - Core Frameworks
      +Programming Languages
        ->Dynamic Languages - Ruby Development Tools
    

ワークスペースのエンコーディングの設定を行う。

[Window | Preferences]
  General
    Workspace
      Text file encoding
        ->Other UTF-8
  General
    Content Types
      Text
        Ruby Source File
          ->Default encoding UTF-8
    

実行時のエンコーディングの設定を行う。

Ruby Project
  *.rb
    Context Menu
      Run As
        Open Run Dialog
          Ruby Script
            New_configuration
              Arguments
                Interpreter arguments
                  ->[-Ku]
              Common
                Console Encoding
                  ->Other UTF-8
    

RSS Parser 0.1.7をインストールする。

Windows
------------------------------------------------------------
#ダウンロードしたアーカイブを展開する
rss-0.1.7

#インストールする
cd rss-0.1.7
ruby setup.rb

#site_rubyに新しいモジュールがインストールされる
irb
irb(main):001:0> p $: #ロードパスでsite_rubyが先に見つかるようになっている
irb(main):002:0> require 'rss'
irb(main):003:0> p RSS::VERSION
"0.1.7"
    
Unix
------------------------------------------------------------
#アーカイブをダウンロードする
% pwd
/home/username/src
% wget http://www.cozmixng.org/~kou/download/rss-0.1.7.tar.gz

#アーカイブを展開する
% gzip -dc rss-0.1.7.tar.gz | tar xf -

#インストールする
#Rubyは自分のホームディレクトリ配下のものを使う
% cd rss-0.1.7
% pwd
/home/username/src/rss-0.1.7
% $HOME/opt/ruby/bin/ruby setup.rb

#動作確認
% $HOME/opt/ruby/bin/irb
irb(main):001:0> require 'rss'
=> true
irb(main):002:0> p RSS::VERSION
"0.1.7"
=> nil
irb(main):003:0> exit
    

メモ

RSS ParserではItem#dc_dateはTimeオブジェクトかnilを返す。これを利用してRSS 2.0でDublin Coreモジュールを使われている場合の判断を次のように記述することができる。

require 'rss'

RSS20 = '<?xml version="1.0" encoding="UTF-8"?>' +
        '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">' +
        '<channel>' +
        '  <title>The Simplest Feed</title>' +
        '  <link>http://example.org/index.html</link>' +
        '  <description>The Simplest Possible RSS 2.0 Feed</description>' +
        '  <item>' +
        '    <description>Update time dc_date</description>' +
        '    <dc:date>2007-07-15T19:00:00+09:00</dc:date>' +
        '  </item>' +
        '  <item>' +
        '    <description>Update time pubDate</description>' +
        '    <pubDate>Sun, 15 Jul 2007 11:00:00 GMT</pubDate>' +
        '  </item>' +
        '</channel>' +
        '</rss>'

rss = nil
begin
    rss = RSS::Parser.parse(RSS20)
rescue RSS::InvalidRSSError => ex
    p ex
    exit
end

rss.channel.items.each do |item|
    if item.dc_date #nilはfalseとして扱われる
        puts '[dc_date]' + item.description + ' / ' + item.dc_date.to_s
    else
        puts '[pubDate]' + item.description + ' / ' + item.pubDate.to_s
    end
end
    

HTMLとして意味を持つ文字をエスケープするにはCGI#escapeHTMLを使う。

require 'cgi'

moji = '< > & "'

p CGI.escapeHTML(moji)
    

アンテナのソースコード

jp.largevocalmix.meegle.antenna.rb

関連情報

2007, AfternoonTea