用Python追踪名人航班!
大家好!
在本基础教程中,我将演示如何使用 Python 开发航班跟踪程序。开始吧!
如何在Python中创建一个航班跟踪程序
本程序将从 Aviationstack API 获取实时航班数据,并使用 ICAO24 代码跟踪飞机。本教程面向初学者,涵盖从环境搭建到程序实现的所有内容。完整代码可在GitHub 上的 Horus 项目中找到,欢迎点赞或以其他方式贡献代码。
先决条件
开始之前,请确保您已准备好以下物品:
- Python基础知识:理解Python编程的基本概念。
- Python 本身:您计算机上安装的 Python。
- 所需库:Requests 和 Colorama 库,分别用于处理 API 请求、解析数据和设置控制台输出样式。
建立环境
Python 安装
从Python官方网站下载并安装Python 。
安装所需库
使用 pip 安装必要的 Python 库:
pip install requests colorama
了解 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.
确定要筛选/搜索的内容
为了让用户能够访问最相关的数据,我们需要获取他们的搜索关键词。这可以通过以下代码实现:
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()
通过不同方法获取航班数据
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("-------------------------------------------------------------------")
按日期获取航班数据
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("-------------------------------------------------------------------")
按出发地 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("-------------------------------------------------------------------")
通过 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("-------------------------------------------------------------------")
根据航班状态获取航班数据
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("-------------------------------------------------------------------")
通过 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("-------------------------------------------------------------------")
结论
此功能是我开源情报/数字取证项目 Horus 的一部分。如需查看该项目的完整代码,请访问Horus 的 GitHub 代码库。您可以通过点赞来支持 Horus!