~ Order Pizza with USB Pizza Button» By Joren on Wednesday 11 November 2009
Recently I bought a big shiny red USB-button. It is big, red and shiny. Initially I planned to use it to deploy new versions of websites to a server but I found a much better use: ordering pizza. Graphically the use case translates to something akin to:
If you would like to enhance your life quality leveraging the power of a USB pizza-button: you can! This is what you need:
- A PC running Linux. This tutorial is specifically geared towards Debian-based distos. YMMV.
- A big, shiny red USB button. Just google “USB panic button” if you want one.
- A location where you can order pizzas via a website. I live in Ghent, Belgium and use just-eat.be. Other websites can be supported by modifying a Ruby script.
Technically we need a driver to check when the button was pushed, a way to communicate the fact that the button was pushed and lastly we need to be able to react to the request.
The driver: on the internets I found a driver for the button. Another modification was done to make the driver process a daemon.
The communication: The original Python script executed another script on the local pc. A more flexible approach is possible using sockets. With sockets it is possible to notify any computer on a network.
1 2 3 4 5 6 7 if PanicButton().pressed(): # create a TCP socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # connect to server on the port s.connect((SERVER, SERVER_TCP_PORT)) # send the order (margherita at restaurant mario) s.send("mario: [margherita_big]\n")
The reaction: a ruby TCP server waits for message from the driver. When it does it automates a HTTP session on a website. It executes a series of HTTP-GET’s and POST’s. It uses the mechanize library.
1 2 3 4 5 6 7 8 9 login_url = "http://www.just-eat.be/pages/member/login.aspx" a = WWW::Mechanize.new a.get(login_url) do |login_page| #post login_form login_form = login_page.forms.first login_form.txtUser = "username" login_form.txtPass = "password" a.submit(login_form, login_form.buttons) end
Some libraries are needed. For python you need the usb library, the python deamons lib needs to be installed seperatly. Setuptools are needed to install the deamons package.
1 sudo apt-get install python-usb python-setuptools
Ruby needs rubygems to install the needed mechanize and daemons library. Mechanize needs the
libxslt-dev package. You also need the
build-essential package to build mechanize.
1 2 sudo apt-get install rubygems libxslt-dev sudo gem install mechanize daemons
To automatically start the daemons on boot you can use the crontab
@reboot directive of the root user. E.g.:
1 2 @reboot /opt/pizza_service/pizza_daemon.rb @reboot /opt/pizza_service/pizza_button_driver.py