Hatena::ブログ(Diary)

Atzy->getLog() このページをアンテナに追加 RSSフィード

2008年10月31日

[]ATOKを簡易RSSリーダにする ATOKを簡易RSSリーダにするを含むブックマーク

昨日(d:id:atzy:20081030:p1)の続き。もう少し汎用的なサービスもATOKダイレクトで作れるかもしれない。

例えば、ATOKRSSリーダにしてみましょう。

f:id:atzy:20081031133720p:image

(はてなの情報をRSSで表示したもの)

これで、天気もニュースも何でもATOKから呼び出せることになります(のはず)。

以下、作り方や説明など。

RSSを解釈

RSSRubyで解釈するのも、そんなに頑張らなくてもREXMLでXPath検索すれば十分とも言えますが、どうせなので、専用のRSSパーサを使ってみます。

RSS Parser

これを用いて、RSSから次のものをとってくることにしました。

  • title
  • description
  • link

これだけです。

ソース

ソースは以下の通り。RSS_SITESというところは、好きなように書き換えて追加して下さい。この設定では「はてな」で呼び出すとはてなのグループのRSSが解釈されます。「朝日」で呼び出すと朝日新聞のサイトのRSSとなります。

例によって、HTTPプロキシは自分の環境に変えるか、nilにして下さい。(昨日の日記を参照。)

#! /usr/bin/ruby -Ku

require 'rss'
require 'kconv'
require 'open-uri'

RSS_SITES = {
  'はてな' => "http://hatena.g.hatena.ne.jp/hatenabookmark/rss2",
  '読売' => "http://www.yomiuri.co.jp/adv/ad/rss/rss20.xml",
  '朝日' => "http://rss.asahi.com/f/asahi_newsheadlines"
  }

PROXY_HOST = 'あなたの環境に合わせて下さい'
PROXY_PORT = あなたの環境に合わせて下さい

module Atok_plugin

  def run_process( a_request_data )
    key = a_request_data['composition_string']
    result_data = {}
    rss_source = getRss(key)
    return result_data if rss_source.nil?
    rssinfo = parseRss(rss_source)
    candidate_array = []
    rssinfo.each{|item|
      candidate_array.push({'hyoki' => item[:title],
                            'comment' => item[:description],
                            'alternative' => item[:link],
                            'alternative_type' => "url_jump_string" })
    }
    result_data['candidate'] = candidate_array
    return result_data
  end
  
  def getRss(key)
    site = RSS_SITES[key]
    return nil if site.nil?
    open(site,
          :proxy => "http://#{PROXY_HOST}:#{PROXY_PORT}/") {|f|
       rss_source = ''
       f.each_line {|line|
          rss_source << line
       }
       return rss_source
    }
  end

  def parseRss(rss_source)
    rss = RSS::Parser.parse(rss_source)
    infos = []
    rss.items.each{|item|
      title = item.title
      if item.description
        description = item.description.gsub(/<\/?[^>]+>|\s+/, '')
      else
        description = ''
      end
      link = item.link
      infos << {:title => title, :description => description, :link => link}
    }
    return infos
  end

end

使い方

RSS_SITESの部分に、「自分が呼び出すためのキー」「そのキーによって自分が呼び出したいRSSURL」を対にして書いておきます。

そして、例えば「あさひ」と入力して変換、「朝日」に未確定で変換された状態において、Ctrl + Insertを押します。すると、変換候補にRSSフィードのタイトル、コメントにその内容が表示されます。(コメントは変換候補を選ぶと表示されます。)

で、仮にそのニュースをきちんと見たいならば、Shift + Enterしてください。ウェブブラウザでそのページが開けます。(このリンク先は例えば読売新聞だとうまくいきません。)

ちなみに、複数のプラグインをインストールしていて、適切なひとつだけを呼び出したい場合は、Ctrl + Shift + Insertで選択のための小さなウィンドウが出ますから、そこからプラグインを選んでください。

インストール

RSS Parserはあらかじめローカルにインストールして下さい。Rubyが入っている環境ならば % ruby setup.rb でインストールできるんじゃないかと思います。

あとは、昨日のと同じです。まだまだめんどくさいので、簡単にできる方法をジャストシステムの方で考えてほしいものです。

最後に

これはサンプル実装ですので、いろいろと不具合と言える点があると思います。

これを元にしてふくらませていけたら面白そうですね。

追記

descriptionなどが現れる「ATOKダイレクト解説」というところがコピー不可能になっているのが不満。

本当に「見るだけ」で、コピペもできない。

さらに追記

最初はRSSを自分で登録する他に、そこで見つからなかったときにはWebサービスからRSSフィード自体を検索する方法を考えていました。で、先ほど探してみたのですが、そのようなWebサービスが見つかりません。

(Yahoo!検索は、RSSを対象に検索というのがあるのですが、検索結果を見るとまったく対象になっていません。)

しかし、そのようなRSS発見用のWebサービスが見つかれば、ATOKを経由してキーワードから自在にRSS情報を引っ張ってくることができそうです。

GoogleがRSSで検索結果を提供するとかなんとかいう話もありますから、RSSが使えればある意味万能になるはず。