Parking permits for the Orinda BART parking lot sell out sixty days in advance, by 7:00 AM. In early 2018, I developed Permitter on a now-retired MacBook Pro to automate parking-permit purchases for my wife. From then until March, 2020, I ran Permitter daily on my Windows PC using Task Scheduler. Five days a week, new permits magically appeared in my wife's Select-a-Spot account.
The Permitter stack includes Java, IntelliJ, Selenium WebDriver, and Firefox. I used Katalon Automation Recorder to observe interactions with the parking-website DOM. I strongly endorse that product.
Enjoy a video of Permitter in action.
Permitter requires a credentials file called credentials
by default. This file should have a BART-parking username and password with the format username,password
.
Permitter can exclude holidays, vacations, and particular days of the week from purchase. See exclude.xml
for how. (Though I am comfortable with JSON, I prefer the verbosity of XML.) You should modify or delete that file before running Permitter, as you probably don't want the exclusions currently in exclude.xml
.
Permitter has three optional launch arguments:
credentialsFile=VALUE
: the file to get credentials from; default value:credentials
logFile=VALUE
: the file to log output to; default value:logfile.txt
excludeFile=VALUE
: the file to get exclusions from; default value:exclusions.xml
Permitter's repo has the MacOS Firefox Selenium WebDriver, geckodriver
, but for other operating systems or browsers, use the appropriate driver. For example, if you are running Firefox on Windows, replace the string geckodriver
in Permitter.java
with geckodriver.exe
.
As of April 6, 2019, Permitter worked with the following versions:
- IntelliJ IDEA: 2019.1
- JDK: 8, Update 201
- Selenium WebDriver for Java: 3.141.59
- geckodriver: 0.24.0
- MacOS: 10.14.4
- Windows: 10.0.17763.404
- Firefox: 66.0.2
Permitter.java
has the main
method.
The Safari and Chrome Selenium WebDrivers did not work for me, which is why I used the Firefox Selenium WebDriver. YMMV.
In my initial efforts to solve the purchasing problem, I tried Permitter, a Ruby app. I ultimately decided to implement something else because I am not fond of Ruby's unless
keyword. That said, I thank Permitter's developer, Jeff Kowalski, for demonstrating that this automation is possible.
As a Swift developer, I was inclined to use WKZombie, but I could not get forms to work, perhaps because of this issue.