PyMyFlySpy:利用头枕数据追踪你的航班
“爸爸,我们在哪儿?”我五岁的孩子问道。 “我们大约一小时后降落,”我说。 “不,我是问我们现在在哪里?我们飞到意大利上空了吗?” 我不太确定。我们的航班短而便宜,座椅的头枕里没有电视屏幕。我环顾四周,注意到一张贴纸鼓励我连接到机载Wi-Fi。我想,这应该能解决问题。像FlightRadar这样的网站能回答我家小朋友的问题,精确到最近几米。
但对他来说不幸的是,我是PySkyWiFi(“长途航班上完全免费、难以置信的愚蠢Wi-Fi”)的创造者。不支付飞机上网费算是我的招牌动作。我们需要一个不同的、离线的策略。
我思考了一下。当你连接到飞机Wi-Fi网络时,通常会遇到一个支付页面,你可以购买互联网访问权限。这个页面通常还会提供你在头枕后面能找到的相同航班信息,比如速度、方向和预计飞行时长。我想,也许它也会有地图。
我拿出笔记本电脑,连接到网络,并加载了支付页面。它确实显示了我们的风速、方向和预计到达时间。但没有地图。 (我当时没想到截图,所以这是一幅艺术印象图)
“也许向我们发送数据的服务器实际上也在发送我们的位置,只是网页没有显示,”我想。我打开了Chrome开发者工具。我看到我的浏览器正在定期向一个 /info 端点发送请求。
我点击了其中一个请求。这个 /info 端点确实向我们发送了一大堆数据,包括ground_speed、wind_speed 和 estimated_arrival_time 等字段。在响应底部,我注意到了latitude 和 longitude 字段。我的心跳加快了。但当我仔细一看,它们都是null。希望破灭。
这看起来像是走到了尽头。我正要放弃,告诉儿子我们大概在意大利北部……欧洲的某个地方。但随后,两个绝妙的想法击中了我。
绝妙想法一: /info 端点没有告诉我们位置,但它告诉了我们精确的、定期更新的速度和方向。在我们返程的航班上,我可以每秒左右追踪并保存我们的速度和方向,持续整个航班。我可以利用这些信息估算出我们每秒移动了多远,以及朝哪个方向移动。我可以从我们出发机场的坐标开始,然后加上每秒的移动量,从而动态计算出我们的位置。
绝妙想法二:即使我能在 /info 响应中找到纬度和经度,对我或我儿子来说也没有太大意义。然而,我可以构建一个运行在我笔记本电脑上的网络应用,在地图上实时显示我们动态计算的位置。这个应用可以自动更新我们的预计到达时间、风向、速度、海拔高度等图表。哦,还可以有一个界面来对数据运行任意查询。以及事件回调,允许我基于航班信息以编程方式触发代码(“当我们的预计到达时间正好是2小时时,阻止我访问netflix.com并打开我未完成小说的最新草稿”)。我儿子会知道他在哪里。我会成为一个好爸爸。
我决定将这个应用命名为PyMyFlySpy,以便让它与我与飞机相关的项目PySkyWiFi建立一些品牌关联。我迫不及待地想开始。不幸的是,此刻我被夹在五岁和两岁的孩子中间,而且我们都对JavaScript一窍不通。我焦急地等待着。
PyMyFlySpy
最终我们降落了。在假期里,我利用深夜和一两个被遗弃的下午,当我的家人在做普通人有趣的事情时,构建了PyMyFlySpy。我搞不清楚在意式手工咖啡店用笔记本电脑是否失礼,或者哪些店有Wi-Fi,所以,带着永恒的羞愧,我谷歌了“附近的星巴克”,端着一杯脱脂摩卡奇诺窝在角落里敲代码。
我们在离开前一天完成了PyMyFlySpy。代码已在GitHub上提供,并且易于设置和运行。它甚至有一个“模拟”模式,允许你使用一个虚构的航班进行演示,而不必真的在飞机上。
以下是PyMyFlySpy可以做的事情:
地图和图表
PyMySkySpy显示了你迄今为止的飞行路线地图。它还显示你当前的飞行指标以及这些指标在整个飞行过程中的变化。它针对机载Wi-Fi提供的所有数据都这样做,甚至是那些通常不在网站或头枕屏幕上显示的数据。你可以确切地知道你在哪里,感觉有点像飞行员。
查询界面
PyMySkySpy将它记录的所有数据保存到数据库中。它的用户界面有一个页面,允许你对数据编写查询,以回答诸如“我们目前的最大速度是多少,何时达到的?”或“我们刚才经历颠簸时的风速是多少?”等问题。
我并不声称这非常有实用价值,但我确实认为这很酷。
多航空公司支持
不同的航空公司有不同的Wi-Fi系统。为JetBlue航班设计的记录器在AirFrance上无法工作。幸运的是,PyMySkySpy允许你轻松添加和使用针对不同航空公司的记录器。你只需要加载他们的Wi-Fi登陆页面,打开浏览器的开发者工具,并像我上面那样找出如何解析他们页面的数据。然后,将你的新代码添加到PyMySkySpy配置中,并告诉记录器使用它。其他一切都会照常工作。
系统设计
该系统非常简单。它有四个部分:
- Firefox扩展 - 从航空公司网站读取航班信息,并将其发送到PyMyFlySpy网络服务器。
- 本地网络服务器 - 保存扩展发送给它的数据,并使其对前端可用。
- Sqlite数据库 - 存储数据。
- 网络前端 - 使用地图和图表显示数据。
我做的一个奇怪设计选择是使用Firefox扩展来读取航班数据,而不是编写一个直接发起自己的数据请求的爬虫。像这样爬取信息本来会更容易、更灵活,而且完全无害。已经有数百人连接到了Wi-Fi,航空公司自己的登陆页面每隔几秒就会访问一次 /info 端点。从爬虫增加一个请求将会是完全安全的。
然而,我确信航空公司宁愿人们不要窥探他们的机载服务器,即使这些人非常小心、出于好意并且英俊。为了确保不惹恼他们,我想出了一个更审慎的方法。
我没有去爬取数据端点,而是写了一个Firefox扩展。这个扩展在航空公司的Wi-Fi登陆页面像往常一样每隔几秒从 /info 端点请求最新数据时,就待在那里。扩展窥视返回的数据;将数据发送到PyMyFlySpy网络服务器;最后,网络服务器将其写入PyMyFlySpy数据库,以供网络前端使用。像这样使用Firefox扩展意味着PyMyFlySpy从不直接与飞机的信息服务器交互。这意味着PyMyFlySpy可以证明永远不会伤害服务器。
我必须为Firefox而不是Chrome编写这个扩展,因为Chrome正在减少扩展与网站发出的请求(如对 /info 端点的请求)交互的能力。特别是,Chrome将阻止扩展轻易读取网站发出的HTTP请求的响应,这将阻止PyMyFlySpy读取 /info 端点返回的数据。据我所知,这些限制一半是出于安全原因,一半是为了让开发广告拦截器变得更困难。无论如何,PyMyFlySpy需要Firefox。
未来工作 - 事件订阅
PyMySkySpy让我们可以以编程方式访问航班数据。利用这个来触发事件会很有趣,例如:
- “在航班的前半段,只允许我打开今天下午5点前必须完成的大型报告。”
- “当我们的位置距离大峡谷10英里以内时,给孩子们发一条Slack消息,让他们看窗外。也给我发一条Slack消息提醒他们看窗外。”
- “如果我们的高度在1秒内下降超过300英尺,就在我所有的设备上播放一个令人安心但相当紧急的声音。”
也许下次假期吧。
返程航班
我们的返程航班在傍晚。我们挤上飞机,起飞了。我拿出笔记本电脑,连接到Wi-Fi,并启动了PyMyFlySpy。我转向儿子,想给他看我们在哪里。过去一周我每天都给他看原型,我以为他的态度介于“容忍”和“有点兴趣”之间。但他已经睡着了。我截了一些图,准备以后给他看。
接下来的几个小时,我都在监控和调试记录器,确保它保持运行。我两岁的孩子在整趟航班中都在尖叫,并一直试图扑到地板上。我隔着过道向妻子做出支持的表情,假装提议接管孩子,但她摇了摇头。她知道这很重要。
我观察着图表。温度在正常范围内。风速稳定。突然,我们的高度下降了五十英尺。我在想是否应该告诉飞行员。我断定他们可能已经控制住了局面。我继续观察着,以防万一。
PyMyFlySpy已在GitHub上发布。