各局皆様、こんにちは。アマチュア無線局、JS2IIUです。
飛行機撮影を趣味にしていると、お目当ての飛行機の状況や到着便の位置確認でフライトトラッカーアプリを活用する場面があります。アプリで機影を眺めるのは楽しいものですね。今回は、おすすめフライトトラッカーの中でも人気のあるFlightAwareからデータをAPIで取得することを試みます。
この記事の概要
- FlightAwareのAPIを使うための登録とAPIKeyの取得方法(クレジットカードの登録が必要)
- 簡単なデータ取得のサンプルをPythonで試す
- お試し程度で、月に100回程度のAPIアクセスなら無料の範囲内に入りそう
おすすめフライトトラッカー
フライトトラッカーを提供するサービスはいくつかありますが、その中でもおすすめのものを紹介します。
- FlightRadar24 | https://www.flightradar24.com/
- FlightAware | https://ja.flightaware.com
- ADS-B Exchange | https://globe.adsbexchange.com
- ADSBHub | https://www.adsbhub.org
Flight tracking (Wikipedia)
https://en.wikipedia.org/wiki/Flight_tracking
FlightAwareのAPIキーを取得する
FlightAware APIのページを開きます。AeroAPIのLearn moreからもう少し詳しく見ていきます。
https://ja.flightaware.com/commercial/data/
こちらのページにAeroAPIの特徴がまとめられています。Code Snippetを見ると、割と簡単にデータを取得できそうです。さらに下にスクロールします。
プランの比較表です。今回は無料でできる範囲で試します。「Personal」プランでは、月額の最低額(Monthly minimum fee)が$0。クエリの回数に比例した課金(Per-query usage fees)がありますが、このプランは月に$5の分まではフリーで使えるので、この部分を使って遊びたいと思います。
注)2022年11月に試したところ、2回のAPIコールでTotal Pagesが4(max_pages = 2にしてAPIを呼んだ)となり、課金の額が$0.08でした。このmax_pagesの指定が重要で、小さな値にしておく必要がありそうです。
課金のレートは変わる可能性があります。API Usageのページ(https://ja.flightaware.com/aeroapi/portal/usage)でちょこちょこ確認することを強くお勧めします。間違って課金になってしまっても、当方は一切責任を負いません。
「Personal」プランのところにある「Get Started」をクリックします。
AeroAPI Personal Tierのページです。Optional Serviceはオーストラリアエリアの情報も取得したいかどうか?の選択です。わざわざ除外する必要はないのでチェックを入れます。Acknowledgementsはライセンス、課金の仕組み、Terms and Conditionsへの同意のチェックもそれぞれ入れておきます。
Reviewのページで、個人の情報、クレジットカード情報を入力します。今回は無料の範囲で遊びますが、もしその範囲を超えると課金が発生します。その時のためのクレジットカード情報入力です。
全て入力してNextをクリックするとWelcome to AeroAPIのページが表示されます。この画面がでれば登録完了です。Explore AeroAPI Portalをクリックしましょう。
My AeroAPIのポータルページです。このページをブックマークしておきましょう。Your API KeysにAPIキーが表示されています。このキーを使うと次の2つへのアクセスが可能になるようです。
- FlightAware Base Flight Tracking Data(FlightAwareの基本的なフライトトラッキングデータ)
- Airline Schedules, Gate Assignments and Gate Times(航空会社のスケジュール、ゲート割り当て、ゲートの時間)
サンプルプログラムを試す
早速、Code Snippetのサンプルで動作確認してみます。県営名古屋空港(RJNA)の全てのフライト情報を取得します。(Get all flights for a given airport)(https://ja.flightaware.com/aeroapi/portal/documentation#get-/airports/-id-/delays)
詳しくはDocumentation(https://ja.flightaware.com/aeroapi/portal/documentation)を参照してください。
Returns all recent and upcoming flights departing from or arriving at the specified airport. Filtering/ordering behavior for the optional start and end parameters for each type (scheduled_departures, scheduled_arrivals, departures, arrivals) match the behavior in their corresponding endpoints.
import requests
apiKey = '(ここにAPIKey)'
apiUrl = "https://aeroapi.flightaware.com/aeroapi/"
airport = 'RJNA'
payload = {'max_pages': 2}
auth_header = {'x-apikey':apiKey}
response = requests.get(apiUrl + f"airports/{airport}/flights", params=payload, headers=auth_header)
if response.status_code == 200:
print(response.json())
else:
print("Error executing request")
以下のようなレスポンスがJSONで返ってきました。フジドリームエアラインズの便名がどっと出てきました。大成功です。
{'arrivals': [{'ident': 'FDA314', 'ident_icao': 'FDA314', 'ident_iata': 'JH314', 'fa_flight_id': 'FDA314-1668683040-schedule-1103', 'operator': 'FDA', 'operator_icao': 'FDA', 'operator_iata': 'JH', 'flight_number': '314', 'registration': 'JA13FJ', 'atc_ident': None, 'inbound_fa_flight_id': 'FDA207-1668674400-schedule-1028', 'codeshares': [], 'codeshares_iata': [], 'blocked': False, 'diverted': False, 'cancelled': False, 'position_only': False, 'origin': {'code': 'RJFF', 'code_icao': 'RJFF', 'code_iata': 'FUK', 'code_lid': None, 'timezone': 'Asia/Tokyo', 'name': 'Fukuoka', 'city': 'Fukuoka', 'airport_info_url': '/airports/RJFF'}, 'destination': {'code': 'RJNA', 'code_icao': 'RJNA', 'code_iata': 'NKM', 'code_lid': None, 'timezone': 'Asia/Tokyo', 'name': 'Nagoya Airfield (Prefectural Nagoya)', 'city': 'Toyoyama', 'airport_info_url': '/airports/RJNA'}, 'departure_delay': -300, 'arrival_delay': 0, 'filed_ete': 3600, 'scheduled_out': '2022-11-19T11:00:00Z', 'estimated_out': '2022-11-19T11:00:00Z', 'actual_out': '2022-11-19T10:55:00Z', 'scheduled_off': '2022-11-19T11:10:00Z', 'estimated_off': '2022-11-19T11:03:15Z', (以下略)
空港情報を取得するサンプルです。上のサンプルで指定したmax_pagesですが、空港情報取得の場合は指定するとエラーが出ます。params=payload,を消しておきます。
import requests
apiKey = '(ここにAPIKey)'
apiUrl = "https://aeroapi.flightaware.com/aeroapi/"
payload = {'max_pages': 1}
auth_header = {'x-apikey':apiKey}
def get_airport_info(airport):
response = requests.get(apiUrl + f"airports/{airport}", headers=auth_header)
# no max_pages params required
if response.status_code == 200:
print(response.json())
else:
print("Error executing request")
if __name__ == '__main__':
airport = 'RJNA'
get_airport_info(airport)
無事レスポンスが返ってきました。
{'airport_code': 'RJNA', 'alternate_ident': 'NKM', 'code_icao': 'RJNA', 'code_iata': 'NKM', 'code_lid': None, 'name': 'Nagoya Airfield (Prefectural Nagoya)', 'type': 'Airport', 'elevation': 52, 'city': 'Toyoyama', 'state': 'Aichi', 'longitude': 136.924444, 'latitude': 35.255, 'timezone': 'Asia/Tokyo', 'country_code': 'JP', 'wiki_url': 'https://en.wikipedia.org/wiki/Nagoya_Airfield', 'airport_flights_url': '/airports/RJNA/flights', 'alternatives': []}
Postman(https://www.postman.com/)を使って試したらこのような感じです。Postmanの使い方は別記事「Twitter APIのテスト(Postmanを使って)」をご覧ください。
最後まで読んでいただき有難うございました。73

