-
-
Save diogomonica/6076911 to your computer and use it in GitHub Desktop.
require 'rubygems' | |
require 'mechanize' | |
FIRST_NAME = 'FIRST_NAME' | |
LAST_NAME = 'LAST_NAME' | |
PHONE = 'PHONE' | |
EMAIL = 'EMAIL@provider.com' | |
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}" |
Genius idea! If only UrbanSpoon was programmed to be completely botproof... :P
cheers :)
Do you have similar code for OpenTable?
@sarah try this gem: https://github.com/dchapman1988/hungrytable
how often did you run this?
I started out by doing it once a minute. That seemed enough to get reservations initially (it was a once a minute crontab).
The new bot that I'm developing does checks every 5 seconds.
genius
Great! It would be interesting powershell script or .NET :-)
So how does this work? Is a cron job constantly running in the background? Is this running locally or on a server?
Genius.
I love this. Did something similar in Python for registering for high-demand classes in college. This is a great time to be a programmer.
Can someone tell me how to use this? Also does it work on ticketmaster as i might try to get some tickets for minecon. Also should i make 1 bot on a computer and one on the other to buy tickets for 2 people such as me and my friend? Help.
Does anyone have a similar script for Resy?
Anyone have a script for Tock or Sevenrooms?
claps awesome