Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
require 'hpricot' require 'net/http' require 'iconv' require 'cgi' require 'md5' require 'jcode' $KCODE = 'u' module VKontakte class Cookies PREFIX = 'remix'.freeze attr_accessor :id, :email, :pass def initialize(user) @id = user.id @email = user.email or raise "No Email given" @password = user.password or raise "No password given" end def id @id || User.new(@email, @password).id end def pass MD5.new @pass end def to_hash %w[id email password].inject({}) {|o, v| o[PREFIX + v] = send(v)} end end class Request DOMAIN = 'vkontakte.ru'.freeze attr_accessor :path def initialize(path = '/') self.path = path end def as(user) self.cookies = Cookies.new(user).to_hash if user self end def get(data = nil) handle {connection.get(path)} end alias to_s get def post(data) handle { connection.post path, data.to_params, { 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1', 'Referer' => "http://#{DOMAIN}/index.php" } } end private def connection @connection ||= Net::HTTP.start DOMAIN end def handle(&block) begin response = block.call rescue Net::HTTPBadResponse => e raise "Oh crap, cant handle the request because of #{e}" end end def convert(string) Iconv.iconv("UTF-8", "CP1251", string) end end class UserPage def initialize(response) end end class User attr_accessor :id, :email, :pass attr_accessor :authorized def initialize(*args) if (args.size == 1) self.id = args.first else self.email, self.pass = args end end def id return @id if @id authorize @id end def data(response) @data ||= UserPage.new(response || request('/')) end def request(url, personal) Request.new(url).as(personal ? self : nil) end def authorize self.authorized = !! send_authorization_request end def authorized? authorized end private def send_authorization_request response = request('/login.php', false).post :email => email, :pass => pass begin self.id = ::CGI::Cookie.parse(response['Set-Cookie'])['remixmid'].first.to_i rescue raise "Can't sign in with #{email}:#{pass}" end data(response) self.id end end end
This paste will be private.
From the Design Piracy series on my blog: