Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save agbaber/6167312 to your computer and use it in GitHub Desktop.
Save agbaber/6167312 to your computer and use it in GitHub Desktop.

Revisions

  1. @diogomonica diogomonica created this gist Jul 25, 2013.
    67 changes: 67 additions & 0 deletions urbanspoon_reservations.rb
    Original 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}"