Snarl: Windows 上で Mac OS X の Growl みたいにできるやつ

Growl みたいなの欲しかったので探しました.すると Snarl ってのがあることを知り,早速導入してみると本当に Growl みたいですね!

なぜ Growl っぽいものが欲しかったかというと,Twitter の更新情報を PowerPoint 使ってるときも,Putty 使ってるときも,Meadow 使ってるときも表示して欲しかったから.

しかもRubyインターフェイスがあるので、こりゃいいやということで、Rubyでプログラムを書いて更新情報を出せるようにしました。

Twitterの更新をSnarl(OSXのGrowlみたいなの)で表示する方法

ここを参考に,ruby-snarl を入れて,以下のスクリプトを使って Snarl でメッセージを表示できちゃいました☆引用したサイトのコードは,昔の twitter 用でして,今はそのままでは動きません.

require 'rubygems'
require 'snarl'
require 'net/http'
require 'time'
require 'rexml/document'
include REXML
require 'uri'

user = ARGV.shift
pass = ARGV.shift

HOST     = "twitter.com"
CURDIR   = Dir.pwd
DATADIR  = "#{CURDIR}/.twitter2snarl"
LASTMOD  = "#{DATADIR}/lastmod"
ICONSDIR = "#{DATADIR}/icons"

Dir.mkdir(DATADIR) unless File.directory?(DATADIR)

# make uri
u = URI::HTTP.build([ nil, HOST, nil, "/statuses/friends_timeline.xml", nil, nil]);

# load last update
begin
  f = File.open(LASTMOD, "r")
  lastupdate = f.gets
  f.close
  u.query = "since=" + URI.escape(lastupdate)
rescue => evar
  puts "You are first time using twitter2snarl. Thanx!"
end

# request xml to twitter
xml = nil
Net::HTTP.version_1_2
req = Net::HTTP::Post.new(u.request_uri)
req.basic_auth user, pass
Net::HTTP.start(HOST, 80) { |http|
  res = http.request(req)
  xml = res.body
}

# check icons dir
Dir.mkdir(ICONSDIR) unless FileTest.exists?(ICONSDIR)

# parse xml and send message to snarl
img_cache = Hash[]
doc = Document.new xml
doc.elements.each("statuses/status") { |s|
  text        = s.elements["text"].text
  screen_name = s.elements["user/screen_name"].text
  image_url   = s.elements["user/profile_image_url"].text
  ext         = image_url.gsub(/^.*\.(jpg|png|gif)(?:\?\d+)?$/i, '\1')
  icon        = "#{ICONSDIR}/#{screen_name}.#{ext}"

  # fetch profile icon
  if !img_cache[image_url] && !FileTest.exist?(icon) then
    u = URI.parse(image_url);
    File.open(icon, 'wb') { |f|
      Net::HTTP.start(u.host, u.port) { |http|
        res = http.get(u.request_uri)
        f.write res.body
        f.close
      }
    }
    img_cache[image_url] = 1
  end

  Snarl.show_message("Twitter: " + screen_name, text, icon, 10)
}

# write last update to file
f = File.open(LASTMOD, "w");
f.write Time.now.httpdate
f.close

例によって,CodeRepos に入れたので,もっと洗練させましょうね!