FlightAwareからフライト情報を取得する

WEB API
この記事は約9分で読めます。

各局皆様、こんにちは。アマチュア無線局、JS2IIUです。

飛行機撮影を趣味にしていると、お目当ての飛行機の状況や到着便の位置確認でフライトトラッカーアプリを活用する場面があります。アプリで機影を眺めるのは楽しいものですね。今回は、おすすめフライトトラッカーの中でも人気のあるFlightAwareからデータをAPIで取得することを試みます。

この記事の概要

  • FlightAwareのAPIを使うための登録とAPIKeyの取得方法(クレジットカードの登録が必要)
  • 簡単なデータ取得のサンプルをPythonで試す
  • お試し程度で、月に100回程度のAPIアクセスなら無料の範囲内に入りそう

おすすめフライトトラッカー

フライトトラッカーを提供するサービスはいくつかありますが、その中でもおすすめのものを紹介します。

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

コメント

タイトルとURLをコピーしました