凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

earthquake.gem の favstar プラグインを改造してみた

はじめに

earthquake.gem は Ruby で書かれた超高機能な CUI ベースの Twitter クライアントです。

いろんなプラグインが公開されていて plugin フォルダにぶっこむだけで試すことができます。
今回はその中の一つの favstar プラグインを改造してみました。

ダウンロード

スクレイピングするのに Nokogiri が必要なので入ってない場合は入れて下さい。

gem install nokogiri

Nokogiri については以下のサイトを参考にさせてもらいました。

ソースコード

# -*- coding: utf-8 -*-
# favstar / earthquakge.gem plugin
#
# e.g. :favstar     #=> your favstar
#      :favstar who #=> who's favstar
#
require 'rss'
require 'open-uri'
require 'nokogiri'

Earthquake.init do

  command %r|^:favstar\s*(.+)*|, :as => :favstar do |m|
    user = m[1] || twitter.info["screen_name"]
    mark_color = config[:colors].sample + 10
    url  = "http://favstar.fm/users/#{user}/rss"
    feed = RSS::Parser.parse(open(url){|f| f.read}, false)
    feed.items.reverse.each{|item|
      status_id  = item.link.gsub(/^.+\/([\d]+?)$/, "\\1")
      star,text  = item.title.gsub(/\r?\n/," ").scan(/^(\d+)\s+stars?:\s(.+)$/).flatten
      pub_date   = item.pubDate.strftime("%d %B %H:%M")

      html = Nokogiri::HTML(open(item.link))
      favs = ""
      rts  = ""
      html.css("div[id^='faved_by'] a.avatar").each{|a|
        fav_user = a.attribute("title").text
        favs << "#{fav_user} ".c(color_of(fav_user))
      }
      html.css("div[id^='rt_by'] a.avatar").each{|a|
        rt_user = a.attribute("title").text
        rts << "#{rt_user} ".c(color_of(rt_user))
      }

      puts "%s%s %s %s %s %s %s%s" % [
        ' '.c(mark_color),
        "[#{id2var(status_id.to_i)}]".c(:info),
        "#{user.c(color_of(user))}:",
        text,
        "#{star.c(:notice)} favs",
        pub_date.c(:info),
        (favs != "") ? "Faved by ".c(:info) + favs : " ",
        (rts  != "") ? "RT by ".c(:info) + rts : ""
      ]
    }
  end

end

1個ずつ見てるんで重いです。RSS経由しないで元のページ見たほうが多分速いです。誰か書いて下さい。

おわりに

Ruby でしたが、earthquake.gem の為だけに Ruby 勉強しても良いと思いました。面白い。