Skip to content

Instantly share code, notes, and snippets.

Created July 25, 2013 04:32
Show Gist options
  • Save diogomonica/6076911 to your computer and use it in GitHub Desktop.
Save diogomonica/6076911 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'mechanize'
EMAIL = ''
SCHEDULE_RANGE = { :start_time => '19:00', :end_time => '20:30' }
def start_url(restaurant=2086)
return "{restaurant}"
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
url = start_url()
agent = { |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 = do |time|
# 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}"
Copy link

This is genius. Awesome job.

Copy link

Well done. I also wrote (and grabbed) a SBP reservation using phantomjs, but I definitely did not post it because there is zero incentive to share it. :P

Copy link

jkaihsu commented Jul 25, 2013

nicely done

Copy link

maxubd commented Jul 25, 2013

Nice work! Just don't tell anyone else in Chicago, please!

Copy link

I can't wait to tell Chicago about this!

Copy link

we have a place that sends out reservations on a web page like that here in Athens,GA. I tried a few times to get a reservation as soon as it came online, but always failed. It isn't a restaurant, but a small once a month table of people. I even tried copy & paste data and it wasn't fast enough. I might try making this work for our site -

Copy link

Very cool!

Copy link

baiIey commented Jul 26, 2013

Great job, here.

Copy link

claps awesome

Copy link

Genius idea! If only UrbanSpoon was programmed to be completely botproof... :P

Copy link

cheers :)

Copy link

Do you have similar code for OpenTable?

Copy link

Copy link

plc commented Jul 29, 2013

how often did you run this?

Copy link

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.

Copy link

ghost commented Jul 29, 2013


Copy link

Great! It would be interesting powershell script or .NET :-)

Copy link

So how does this work? Is a cron job constantly running in the background? Is this running locally or on a server?

Copy link

ghost commented Aug 17, 2013


Copy link

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.

Copy link

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.

Copy link

boranova commented Jul 1, 2021

Does anyone have a similar script for Resy?

Copy link

ekimball commented Feb 1, 2024

Anyone have a script for Tock or Sevenrooms?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment