"今日" の Outputz 結果を Twitter に POST する

Outputz の結果を取得してログを残せないかと思ったら、どうも OutputzCookie復活の呪文が結びついているようなので、いつも Outputz サイトを見ているブラウザの Cookie があれば daily のアウトプット値を引っ張ってこれる。
なので、そうやって取得した値を Twitter に POST すればいいという話。

環境は Windows/Firefox3.x 限定です。仕組みを応用すれば他の OS、他のブラウザでも対応できるはず。
Twitter に POST する部分はオリジナルなものなので、そこは他のライブラリを使うなりご自由に。

メインのソースはこちら

#!/usr/bin/ruby

# only Windowns

require 'inifile'
require 'firefox'
require 'outputz'
require 'mblog'

cookie = Firefox::Cookie.new

values = cookie.get('outputz.com', '_outputz_session')

outputz = Outputz.new(values[0])
num = outputz.get_daily

t = Foo.new(:twitter, 'めーるあどれす or ゆーざめい', 'ぱすわーど')
t.update("今日の Outputz 結果: #{num} bytes")

inifile.rb

INI 形式のファイルから指定したセクションの値を取得する。
Win32api をコールして処理をしている。

#!/usr/bin/ruby

# only Windowns

require 'Win32API'

# Win32 API ref. http://msdn.microsoft.com/ja-jp/library/cc429779.aspx
class IniFile
  def initialize(filename)
    @get_private_profile_string = Win32API.new('kernel32', 'GetPrivateProfileString', %w(P P P P L P), 'L');

    @filename = filename
  end

  def get(appname, key_name, def_value = '')
    s = ' ' * (128 + 1)

    @get_private_profile_string.Call(appname, key_name, def_value, s, 128, @filename)

    # TODO:
    s.unpack('A128')
  end
end

firefox.rb

Firefox のユーザデータにある Cookie DB から指定したホストと名前の Cookie の値を取得する。
Firefox のインストールパスは固定。

#!/usr/bin/ruby

# only Windowns

require 'rubygems'
require 'sqlite3'

class Firefox
  class Cookie
    def initialize
      @firefox_user_data = File.expand_path("#{ENV['APPDATA']}/Mozilla/Firefox")

      ini = IniFile.new("#{@firefox_user_data}/profiles.ini")
      path = ini.get('Profile0', 'Path', '')

      @firefox_cookie_path = "#{@firefox_user_data}/#{path}/cookies.sqlite"
    end

    def get(host, name)
      db = SQLite3::Database.new(@firefox_cookie_path)

      results = []

      db.execute('SELECT value FROM moz_cookies where host == ? AND name == ?', host, name) do |row|
        results << row
      end

      db.close

      results
    end
  end
end

outputz.rb

Outputz.com にアクセスし、"今日" のアウトプット値を取得する。

#!/usr/bin/ruby

require 'net/http'
require 'uri'
require 'kconv'
require 'hpricot'

class Outputz
  def initialize(session)
    @session = session
  end

  DAILY_URL = 'http://outputz.com/daily'

  def get_daily
    doc = Hpricot(get_html(DAILY_URL, @session))

    node = doc.at('/html/body/div[2]/div[2]/div/p/span')
    return 0  if node.nil?

    return node.inner_text.gsub(',', '').to_i
  end

  def get_html(url, session)
    uri = URI.parse(url)

    Net::HTTP.start(uri.host, uri.port) do |http|
      req = Net::HTTP::Get.new(uri.request_uri,
             { "User-Agent" => "Ruby/#{RUBY_VERSION} (#{RUBY_PLATFORM})",
               "Cookie"     => "_outputz_session=#{session}" }
            )
      res = http.request(req)

      case res
      when Net::HTTPSuccess
        res.body.toutf8
      else
        $stderr.puts "cannot connect; url=#{url}, status=#{res.code}"
        ""
      end
    end
  end
end