Forked from diogomonica/urbanspoon_reservations.rb
Last active
August 29, 2015 14:07
-
-
Save khi195/7e09dd2e89b758388f7c to your computer and use it in GitHub Desktop.
Revisions
-
diogomonica created this gist
Jul 25, 2013 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,67 @@ require 'rubygems' require 'mechanize' FIRST_NAME = 'FIRST_NAME' LAST_NAME = 'LAST_NAME' PHONE = 'PHONE' EMAIL = '[email protected]' PARTY_SIZE = 2 SCHEDULE_RANGE = { :start_time => '19:00', :end_time => '20:30' } def start_url(restaurant=2086) return "http://rez.urbanspoon.com/reservation/start/#{restaurant}" end def to_minutes(time) hour, minutes = time.split(':') raise "Malformed time: #{time}. Should be in the HH:MM format." if hour.nil? || minutes.nil? return (hour.to_i * 60) + minutes.to_i end url = start_url() agent = Mechanize.new { |agent| agent.user_agent_alias = 'Mac Safari' } # Get the start page start_page = agent.get(url) # Bail if there are no reservations exit if start_page.forms.count != 1 # Fill in the details for the reservation start_form = start_page.forms.first start_form.size = PARTY_SIZE # Verify if the available times are in the allowed range available_times = start_form.field_with(:name => 'seating_time').options possible_times = available_times.select do |time| (to_minutes(SCHEDULE_RANGE[:start_time])..to_minutes(SCHEDULE_RANGE[:end_time])).member?(time.value.to_i) end # Select the first of the possible times for the reservation start_form.seating_time = possible_times.first # Submit the details and get back the contact form contact_info_page = start_form.submit # Check for the existence and get the contact form exit if contact_info_page.forms.count != 1 contact_form = contact_info_page.forms.first # Fill in the contact details contact_form["user[first_name]"] = FIRST_NAME contact_form["user[last_name]"] = LAST_NAME contact_form["user[phone]"] = PHONE contact_form["user[email]"] = EMAIL # Submit the contact details and get confirmation page confirmation_page = contact_form.submit # Confirm the reservation exit if confirmation_page.forms.count != 1 confirmation_form = confirmation_page.forms.first final_page = confirmation_form.submit puts "Got reservation for: #{start_form.seating_time}"