发布于 2026-01-06 3 阅读
0

用Python追踪名人航班!

用Python追踪名人航班!

大家好!

在本基础教程中,我将演示如何使用 Python 开发航班跟踪程序。开始吧!


如何在Python中创建一个航班跟踪程序

本程序将从 Aviationstack API 获取实时航班数据,并使用 ICAO24 代码跟踪飞机。本教程面向初学者,涵盖从环境搭建到程序实现的所有内容。完整代码可在GitHub 上的 Horus 项目中找到,欢迎点赞或以其他方式贡献代码。


先决条件

开始之前,请确保您已准备好以下物品:

  • Python基础知识:理解Python编程的基本概念。
  • Python 本身:您计算机上安装的 Python。
  • 所需库:Requests 和 Colorama 库,分别用于处理 API 请求、解析数据和设置控制台输出样式。

建立环境

Python 安装

从Python官方网站下载并安装Python

安装所需库

使用 pip 安装必要的 Python 库:

pip install requests colorama
Enter fullscreen mode Exit fullscreen mode

了解 API

什么是API?

API 允许应用程序(例如本程序!)与外部服务/网站进行通信。在本例中,我们将使用 Aviationstack 和 OpenSky API 来获取航班数据。

航班跟踪 API 选项

有多种航班数据 API 可供使用。在本教程中,我们将使用:

  • Aviationstack API:用于实时航班数据。
  • OpenSky Network API:用于使用 ICAO24 识别码跟踪飞机。

API密钥注册

请在Aviationstack 网站注册以获取 API 密钥。OpenSky 的免费 API 不需要密钥。


获取航班数据

我们将使用该requests库进行 API 调用并获取航班数据。


实施航班跟踪计划

以下是航班跟踪程序关键部分的代码片段。完整代码请参见Horus GitHub 代码库

格式化模板

我已经使用 Colorama 制作了输出格式化模板(针对终端使用进行了优化)。为了方便起见,模板如下,代码中会用到它们:

from colorama import Fore # For text colour.

# Config (Prints).
text = (f"{Fore.WHITE}") # Change the colour of text output in the client side
dividers = (f"{Fore.LIGHTRED_EX}") # Changes the [], | and : in the client side
success = (f"{Fore.WHITE}[{Fore.GREEN}SUCCESS{Fore.WHITE}]") # Success output.
successfully = (f"{Fore.WHITE}[{Fore.GREEN}SUCCESSFULLY{Fore.WHITE}]") # Successfully output.
failed = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}FAILED{Fore.WHITE}]") # Failed output.
prompt = (f"{Fore.WHITE}[{Fore.YELLOW}»{Fore.WHITE}]") # Prompt output.
notice = (f"{Fore.WHITE}[{Fore.YELLOW}!{Fore.WHITE}]") # Notice output.
question =  (f"{Fore.WHITE}[{Fore.YELLOW}?{Fore.WHITE}]") # Alert output.
alert =  (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}!{Fore.WHITE}]") # Alert output.
exited = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}EXITED{Fore.WHITE}]") # Execited output.
disconnected = (f"{Fore.WHITE}[{Fore.LIGHTRED_EX}DISCONNECTED{Fore.WHITE}]") # Disconnected output.
command = (f"\n[{Fore.YELLOW}>_{Fore.WHITE}]: ") # Always asks for a command on a new line.
Enter fullscreen mode Exit fullscreen mode

确定要筛选/搜索的内容

为了让用户能够访问最相关的数据,我们需要获取他们的搜索关键词。这可以通过以下代码实现:

print(f'{notice} How would you like to filter flight data? (icao24, number, date, dep_iata, arr_iata or status) ')
option = input(f'{command}').lower()
Enter fullscreen mode Exit fullscreen mode

通过不同方法获取航班数据

Aviationstack API 允许用户按航班号筛选航班数据结果。我们可以通过请求获取该 URL,解析数据,并针对每个所需数据调用字典。然后,我们可以以易于阅读的方式打印结果,并为每个 API 搜索结果添加分隔符。由于不同响应的 JSON 结构不同,我们需要为每种筛选方法编写不同的代码段。

我们可以通过以下方法筛选 Aviationstack API 的结果:

  • 航班
  • 日期
  • 出发地国际航空运输协会 (IATA)
  • 到达 IATA
  • 航班状态
  • ICAO24(飞机专用,我个人最喜欢 :) )

下面展示了每种方法的代码,每个部分都使用 if 语句根据之前的输入进行启动:

通过航班号获取航班数据

if option == 'number':
    number = input(f"{question} Enter a flight number: ")
    data = requests.get(f"http://api.aviationstack.com/v1/flights?access_key={key}&flight_number={number}").json()['data']
    for i in range(0,len(data)):
        print(f"Airline Name: {data[i]['airline']['name']}")
        print(f"Flight Date: {data[i]['flight_date']}")
        print(f"Status: {data[i]['flight_status']}")
        print(f"Departure Airport: {data[i]['departure']['airport']}")
        print(f"Departure Timezone: {data[i]['departure']['timezone']}")
        print(f"Departure IATA/ICAO: {data[i]['departure']['iata']} | {data[i]['departure']['icao']}")
        print(f"Departure Terminal/Gate: {data[i]['departure']['terminal']}{data[i]['departure']['gate']}")
        print(f"Estimated Departure: {data[i]['departure']['estimated']}")
        print(f"Actual Departure: {data[i]['departure']['actual']}")
        print(f"Arrival Airport: {data[i]['arrival']['airport']}")
        print(f"Arrival Timezone: {data[i]['arrival']['timezone']}")
        print(f"Arrival IATA/ICAO: {data[i]['arrival']['iata']} | {data[i]['arrival']['icao']}")
        print(f"Arrival Terminal/Gate: {data[i]['arrival']['terminal']}{data[i]['arrival']['gate']}")
        print(f"Estimated Arrival: {data[i]['arrival']['estimated']}")
        print(f"Actual Arrival: {data[i]['arrival']['actual']}")
        print("-------------------------------------------------------------------")
Enter fullscreen mode Exit fullscreen mode

按日期获取航班数据

if option == 'date':
    date = input(f"{question} Enter a flight date (YYYY-MM-DD): ")
    data = requests.get(f"http://api.aviationstack.com/v1/flights?access_key={key}&date={date}").json()['data']
    for i in range(0,len(data)):
        print(f"Airline Name: {data[i]['airline']['name']}")
        print(f"Flight Date: {data[i]['flight_date']}")
        print(f"Status: {data[i]['flight_status']}")
        print(f"Departure Airport: {data[i]['departure']['airport']}")
        print(f"Departure Timezone: {data[i]['departure']['timezone']}")
        print(f"Departure IATA/ICAO: {data[i]['departure']['iata']} | {data[i]['departure']['icao']}")
        print(f"Departure Terminal/Gate: {data[i]['departure']['terminal']}{data[i]['departure']['gate']}")
        print(f"Estimated Departure: {data[i]['departure']['estimated']}")
        print(f"Actual Departure: {data[i]['departure']['actual']}")
        print(f"Arrival Airport: {data[i]['arrival']['airport']}")
        print(f"Arrival Timezone: {data[i]['arrival']['timezone']}")
        print(f"Arrival IATA/ICAO: {data[i]['arrival']['iata']} | {data[i]['arrival']['icao']}")
        print(f"Arrival Terminal/Gate: {data[i]['arrival']['terminal']}{data[i]['arrival']['gate']}")
        print(f"Estimated Arrival: {data[i]['arrival']['estimated']}")
        print(f"Actual Arrival: {data[i]['arrival']['actual']}")
        print("-------------------------------------------------------------------")
Enter fullscreen mode Exit fullscreen mode

按出发地 IATA 获取数据

if option == 'dep_iata':
    dep_iata = input(f"{question} Enter a flight departure IATA: ")
    data = requests.get(f"http://api.aviationstack.com/v1/flights?access_key={key}&dep_iata={dep_iata}").json()['data']
    for i in range(0,len(data)):
        print(f"Airline Name: {data[i]['airline']['name']}")
        print(f"Flight Date: {data[i]['flight_date']}")
        print(f"Status: {data[i]['flight_status']}")
        print(f"Departure Airport: {data[i]['departure']['airport']}")
        print(f"Departure Timezone: {data[i]['departure']['timezone']}")
        print(f"Departure IATA/ICAO: {data[i]['departure']['iata']} | {data[i]['departure']['icao']}")
        print(f"Departure Terminal/Gate: {data[i]['departure']['terminal']}{data[i]['departure']['gate']}")
        print(f"Estimated Departure: {data[i]['departure']['estimated']}")
        print(f"Actual Departure: {data[i]['departure']['actual']}")
        print(f"Arrival Airport: {data[i]['arrival']['airport']}")
        print(f"Arrival Timezone: {data[i]['arrival']['timezone']}")
        print(f"Arrival IATA/ICAO: {data[i]['arrival']['iata']} | {data[i]['arrival']['icao']}")
        print(f"Arrival Terminal/Gate: {data[i]['arrival']['terminal']}{data[i]['arrival']['gate']}")
        print(f"Estimated Arrival: {data[i]['arrival']['estimated']}")
        print(f"Actual Arrival: {data[i]['arrival']['actual']}")
        print("-------------------------------------------------------------------")
Enter fullscreen mode Exit fullscreen mode

通过 IATA 获取到达数据

if option == 'arr_iata':
    arr_iata = input(f"{question} Enter a flight arrival IATA: ")
    data = requests.get(f"http://api.aviationstack.com/v1/flights?access_key={key}&arr_iata={arr_iata}").json()['data']
    for i in range(0,len(data)):
        print(f"Airline Name: {data[i]['airline']['name']}")
        print(f"Flight Date: {data[i]['flight_date']}")
        print(f"Status: {data[i]['flight_status']}")
        print(f"Departure Airport: {data[i]['departure']['airport']}")
        print(f"Departure Timezone: {data[i]['departure']['timezone']}")
        print(f"Departure IATA/ICAO: {data[i]['departure']['iata']} | {data[i]['departure']['icao']}")
        print(f"Departure Terminal/Gate: {data[i]['departure']['terminal']}{data[i]['departure']['gate']}")
        print(f"Estimated Departure: {data[i]['departure']['estimated']}")
        print(f"Actual Departure: {data[i]['departure']['actual']}")
        print(f"Arrival Airport: {data[i]['arrival']['airport']}")
        print(f"Arrival Timezone: {data[i]['arrival']['timezone']}")
        print(f"Arrival IATA/ICAO: {data[i]['arrival']['iata']} | {data[i]['arrival']['icao']}")
        print(f"Arrival Terminal/Gate: {data[i]['arrival']['terminal']}{data[i]['arrival']['gate']}")
        print(f"Estimated Arrival: {data[i]['arrival']['estimated']}")
        print(f"Actual Arrival: {data[i]['arrival']['actual']}")
        print("-------------------------------------------------------------------")
Enter fullscreen mode Exit fullscreen mode

根据航班状态获取航班数据

if option == 'status':
    status = input(f"{question} Enter a flight status (scheduled, active, landed, cancelled, incident, diverted): ")
    data = requests.get(f"http://api.aviationstack.com/v1/flights?access_key={key}&status={status}").json()['data']
    for i in range(0,len(data)):
        print(f"Airline Name: {data[i]['airline']['name']}")
        print(f"Flight Date: {data[i]['flight_date']}")
        print(f"Status: {data[i]['flight_status']}")
        print(f"Departure Airport: {data[i]['departure']['airport']}")
        print(f"Departure Timezone: {data[i]['departure']['timezone']}")
        print(f"Departure IATA/ICAO: {data[i]['departure']['iata']} | {data[i]['departure']['icao']}")
        print(f"Departure Terminal/Gate: {data[i]['departure']['terminal']}{data[i]['departure']['gate']}")
        print(f"Estimated Departure: {data[i]['departure']['estimated']}")
        print(f"Actual Departure: {data[i]['departure']['actual']}")
        print(f"Arrival Airport: {data[i]['arrival']['airport']}")
        print(f"Arrival Timezone: {data[i]['arrival']['timezone']}")
        print(f"Arrival IATA/ICAO: {data[i]['arrival']['iata']} | {data[i]['arrival']['icao']}")
        print(f"Arrival Terminal/Gate: {data[i]['arrival']['terminal']}{data[i]['arrival']['gate']}")
        print(f"Estimated Arrival: {data[i]['arrival']['estimated']}")
        print(f"Actual Arrival: {data[i]['arrival']['actual']}")
        print("-------------------------------------------------------------------")
Enter fullscreen mode Exit fullscreen mode

通过 ICAO24 获取航班数据

这种搜索方法截然不同,因为我们使用的是 Opensky API。此外,由于数据仅与指定的飞机相关,因此可用的数据也较少。

if option == 'icao24':
    icao24 = input(f"{question} Enter a plane icao24: ")
    begin = input(f"{question} Enter a begin Unix timestamp for the flights interval: ")
    end = input(f"{question} Enter an end Unix timestamp for the flights interval: ")
    data = requests.get(f"https://opensky-network.org/api/flights/aircraft?icao24={icao24}&begin={begin}&end={end}").json()
    for i in range(0,len(data)):
        print(f"Aircraft Callsign: {data[i]['callsign']}")
        print(f"Departure Airport (Estimated): {data[i]['estDepartureAirport']}")
        print(f"Arrival Airport (Estimated): {data[i]['estArrivalAirport']}")
        print(f"Arrival Airport (Estimated): {data[i]['estArrivalAirport']}")
        print(f"First Seen: {data[i]['firstSeen']}")
        print(f"Last Seen: {data[i]['lastSeen']}")
        print("-------------------------------------------------------------------")
Enter fullscreen mode Exit fullscreen mode

结论

此功能是我开源情报/数字取证项目 Horus 的一部分。如需查看该项目的完整代码,请访问Horus 的 GitHub 代码库。您可以通过点赞来支持 Horus!


参考资料和资源

文章来源:https://dev.to/6abd/tracking-celebrity-flights-in-python-1m86