-
-
Save blotto/6089524 to your computer and use it in GitHub Desktop.
This file contains 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 characters
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}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment