"今日" の 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