MozReplとGrowlとはてブAPIで遊ぶ略してHatebuMozGrowl

懲りずにMozReplの遊び方は無いか考えてた.ついでに最近Growlで遊んでないなーとかも考えてた.んじゃMozReplでなんかごにょごにょしてGrowlにNotifyさせるってのはどうだろう,って思った.


さて,なにをNotifyさせようか.
散々考えた*1結果,はてブAPIで表示してるページの被はてブ数を取ってきて,それをNotifyしてやろうと.これはちょっとウザいぞと.

どんな感じに表示されるの?

こんな感じ.

楽しいよ.Firefoxはてなバー入れてない人でも,そのページが注目エントリーかどうかわかるぜ!

require

このスクリプトを走らせるためには,gemのruby-growlが必要になります.あと,当たり前だけどGrowlも.Growlなんてねーよ!っていうWindowsな人は,冴子先生やカイル君に教えてもらうのも良いかもね.逆に,Growlは無機質な感じがするので冴子先生が羨ましい.

スパゲッティ

ただただ,徒然と書いた.反省はしていない.

require 'net/telnet'
require 'xmlrpc/client'
require 'rubygems'
require 'ruby-growl'

# MozReplに接続
prompt = /^repl>/
begin
  repl = Net::Telnet.new('Host' => 'localhost',
                         'Port' => 4242,
                         'Prompt' => prompt)
rescue
  puts 'replが起動していません'
  exit
end

repl.waitfor(prompt)

# Growlを作成
g = Growl.new('localhost', 'MozGrowl', ['Hatebu'])

# はてブAPIに接続(してるのか?仕組みがわからない)
hatebu = XMLRPC::Client.new2('http://b.hatena.ne.jp/xmlrpc')

urls = Array.new

begin 
  loop do
    url = repl.cmd('content.location.href').split(prompt).shift.strip

    # 一度見たサイトのURLは見ない
    unless urls.include?(url)
      urls << url
      count = hatebu.call('bookmark.getCount', url)[url]
      
      title = ""
      if count >= 100
        title = "すごく注目エントリー"
      elsif count >= 50
        title = "かなり注目エントリー"
      elsif count >= 10
        title = "注目エントリー"
      end
    
      unless title.empty?
        message = "このページは#{count}件ブックマークされています"
        g.notify('Hatebu', title, message)
      end # unless
    end # unlless
    
    sleep(3)
  end # loop
rescue
  puts 'たぶんFirefoxの窓が閉じられたので終了します'
  exit
end # begin

終了方法は?

Ctrl+c.躊躇したら負けかなと思っている.

sleep

「何秒間かrubyスクリプトを停止させる関数の名前ってなんだったっけなー?」ってなって,思い出すのにすごい時間がかかりました.たぶん,このスクリプトアルゴリズムを考えるよりも.このsleepを思い出せないまま,とりあえず走らせてアクティビティモニタを見たら,rubyだけでCPU使用率30%超えてたYO!(sleepを思い出したあと走らせたら0.10%になった)

*1:だいたい2分.大したもんだ