"今日" の Outputz 結果を Twitter に POST する
Outputz の結果を取得してログを残せないかと思ったら、どうも Outputz の Cookie と復活の呪文が結びついているようなので、いつも 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