I spent a recent flight finding out what I could do with a connection to the flight’s wifi, but without access to the internet.
I was on my way home from Strange Loop, a direct flight from St. Louis to Oakland.
It’s a long enough flight that I planned to purchase the $8 internet access and get some work done, but Southwest’s wifi portal wouldn’t accept any form of payment.
The web page didn’t give me any helpful error messages, so I opened up my browser’s network dev tools to see if I could figure out what was going wrong.
I found the failing request, but it didn’t provide any useful hints to point me toward a solution.
While I was there, I saw another request that caught my eye: A repeating successful request for current.json
.
Here’s an example response from one of those requests:
{
"sat_commlink_portal": {
"status": "conn_ok",
"time": "Sun Sep 24 22:02:19 2023"
},
"pcent_flt_complete": 33,
"altVal": "35998",
"lon": "-100.755",
"satcomm_status": {
"commlink": "active",
"linkparams": "not-stale"
},
"dtzone": "PDT",
"within_us": true,
"etad": "06:19 PM",
"lat": "40.201",
"gspdVal": "487",
"ttgc": "2h 25m",
"dist_remain": "1167",
"actime24": "15:54"
}
This appeared to be the data that drives the in-flight wifi portal’s flight status page.
Since this was one of the only things I could access on this network, I decided to make the most of it.
I used my browser’s “Copy as cURL” feature to quickly get a command to hit the endpoint.
As an aside, this feature is present in Firefox and all chromium-based browsers and it’s really handy if you ever need to reply requests made by your browser and want to send all the same headers.
After some experimenting, I found that none of the cookies or headers that were included in the request were strictly necessary, meaning that I could fetch the data with a simple curl 'https://getconnected.southwestwifi.com/current.json'
.
I set up a loop to dump the data in a log file:
watch -n 30 "curl https://getconnected.southwestwifi.com/current.json | jq -c >> flight-logs"
I didn’t know what I’d do with the data at this point, but I started collecting it right away so that I’d have as much as possible to play with later.
With that running, I decided to look more closely at the responses to figure out what exactly I had to work with.
Here’s that same example response, annotated with my best guess at what the fields represent:
{
// This looks like info about the system's satellite internet connection.
"sat_commlink_portal": {
// The connection is okay!
"status": "conn_ok",
// I'm not sure what this time is.
// It hasn't changed at all.
"time": "Sun Sep 24 22:02:19 2023"
},
// The percentage progress of the current flight.
// I don't kn