Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Custom HTTP/HTTPS GET/POST queries in Ruby (See related posts)

First, the scripts sends the GET query to read the website cookies (for session, etc.), and then it sends a POST query with the received cookies and custom POST parameters.

require 'net/http'
require 'net/https'

http = Net::HTTP.new('profil.wp.pl', 443)
http.use_ssl = true
path = '/login.html'

# GET request -> so the host can set his cookies
resp, data = http.get(path, nil)
cookie = resp.response['set-cookie']


# POST request -> logging in
data = 'serwis=wp.pl&url=profil.html&tryLogin=1&countTest=1&logowaniessl=1&login_username=blah&login_password=blah'
headers = {
  'Cookie' => cookie,
  'Referer' => 'http://profil.wp.pl/login.html',
  'Content-Type' => 'application/x-www-form-urlencoded'
}

resp, data = http.post(path, data, headers)


# Output on the screen -> we should get either a 302 redirect (after a successful login) or an error page
puts 'Code = ' + resp.code
puts 'Message = ' + resp.message
resp.each {|key, val| puts key + ' = ' + val}
puts data


Comments on this post

Louis posts on Feb 20, 2006 at 10:43
Ahh, I just spent the last ... oh I don't know how long - lets say three hours - trying to get this code to work. I finally did, but the problem was I needed to specify a user agent!

So here's my code snippet in full - and get2/post2 is interchangable with get/post, the difference is that the 2 is safer, it won't toss any Net:: Errors.

Also notice that I URL encoded the username and password.

require "net/http"
require "net/https"
require "erb"
require "singleton"

PANEL = 'panel.dreamhost.com'
PATH = '/index.cgi'
USERAGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1'

class Panel
  include Singleton
  
  def Panel.login(webid, password)
    unless @headers.nil?
      raise ScriptError, "You should already be logged in!"
    end
  
    @http = Net::HTTP.new(PANEL, 443)
    @http.use_ssl = true
  
    # GET request -> so the host can set cookies
    resp, data = @http.get2(PATH, {'User-Agent' => USERAGENT})
    cookie = resp.response['set-cookie'].split('; ')[0]
    
    # POST request -> logging in
    data = "Nscmd=Nlogin&username=#{ERB::Util.url_encode(webid)}&password=#{ERB::Util.url_encode(password)}&submit=Log%20In"
    @headers = {
      'Cookie' => cookie,
      'Referer' => 'https://'+PANEL+PATH,
      'Content-Type' => 'application/x-www-form-urlencoded',
      'User-Agent' => USERAGENT
    }

    puts "headers = " + @headers.inspect
    
    resp, data = @http.post2(PATH, data, @headers)

    # Output on the screen -> we should get either a 302 redirect (after a successful login) or an error page
    puts 'Code = ' + resp.code
    puts 'Message = ' + resp.message
    resp.each {|key, val| puts key + ' = ' + val}
    puts data
  end
end


If you curious, I'm scraping my own API for DreamHost's Control Panel, so I don't have to labourously open my web browser every time I need to add or change something. (Yeah, I'm that lazy.)

Anyway, its unfinished, I'll be refactoring the code next - the Panel.login method was just for testing.

You need to create an account or log in to post comments to this site.


Click here to browse all 5143 code snippets

Related Posts