Just for fun I want to automatically track if I go to the gym or not. Every time
I go to Golds Gym I have to scan my card that I keep on my key chain so there is
an electronic record of me going to the gym or not. I did not know about this
when I signed up, but Golds Gym does have a crappy website for managing your
membership and on there you can see a record of every time you have checked into
the gym.
The problem I have with this website is that they don’t have an API and it
mostly requires javascript to use it. This makes automatically fetching the data
I need very tricky. Using Firefox’s developer tools you can inspect the http
requests and copy them as cURL so that you can kind of reverse engineer how to
authenticate and fetch data.
This works pretty well and I was able to get everything I needed from the
command line using cURL commands, but unfortunatley it only worked for the
lifetime of the session cookie. Even though I have worked with web technology
for many years I actually haven’t done a whole lot with cookies. The copy as
cURL command from Firefox will actually copy over all of the cookies into the
cURL request, but that wasn’t exactly what I was after. Through some digging
around I found a great resource on cURL that mentions how to save and
retreive cookies from a text file.
To save a cookie you can use the -c
flag followed by the name of the cookie
file you want to save. Here is an example:
curl -c cookie.txt https://example.com?creds=asdf
If you then want to use those cookies you can use the -b
flag like this:
curl -b cookie.txt https://example.com/data
So now I can run one cURL command to authenticate with my username and password
which will save a session token in my cookie file. And then I can run another
cURL command using the cookie file to fetch the data I’m after. Pretty cool.
Now my next steps are to do this all in ruby. After that I’m hoping I can add
this to my private Discourse instance somehow so that I can be awarded a custom
gym badge every day I go or for going so many days in a row.