Import Fraport API

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
phykka
User
Beiträge: 9
Registriert: Donnerstag 22. April 2021, 18:25

Hallo zusammen,

ich versuche die Fraport API mit Python abzufragen. Mir ist nicht klar, wie ich den API Key einsetzen muss damit ich eine Verbindung bekomme.

Code: Alles auswählen

import requests

api_key = "3011c147-180b-3ec5-ba2c-34034812****"

url = 'https://developer.fraport.de/api/flights/1.0.2/flight2/FRA/arrival'

data = requests.get(url).json()

scheduled = data['arrival']['scheduled']
estimated = data['arrival'] ['estimated']
Ich bekomme diese Fehlermeldung angezeigt:

requests.exceptions.SSLError: HTTPSConnectionPool(host='developer.fraport.de', port=443): Max retries exceeded with url: /api/flights/1.0.2/flight2/FRA/arrival (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')))


Bei diesem Beispiel aus einem YouTube Video hab ich es mit der Wetter abfrage hinbekommen, nur wie lässt sich das auf meine Frage mit der Fraport API übertragen ? Wo muss ich den Key eintragen ?

Code: Alles auswählen

import requests

API_KEY = "PASTE YOUR API CODE HERE"
city = input("Hallo! Bitte gib eine Stadt ein.")

url = f'https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}&units=metric'
data = requests.get(url).json()
temp = data['main']['temp']
humidity = data['main']['humidity']

print(f'In {city} beträgt die Temperatur {temp}. Die Luftfeuchtigkeit beträgt {humidity}.')

Vielen Dank im Vorraus :)
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@phykka,

die Fraport APIs benötigen eine Subscription.
Wenn du dich mit deinem Benutzernamen und Passwort auf der Developer-Seite einloggst, siehst du unter der API Console drei APIs.
Du kannst dich bei jeder einzelnen kostenfrei "subscriben".
Dann bekommst du das Authorization Bearer Token angezeigt.
Dieses muss im Request header mit-übergeben werden.
Es scheint man muss die Zertifikatsprüfung auch auf "False" setzen.

Code: Alles auswählen

import requests

bearer_token = "3011c147-180b-3ec5-ba2c-34034812****"

url = "https://developer.fraport.de/api/flights/1.0.2/flight2/FRA/arrival"

headers = {"Accept": "application/json", "Authorization": f"Bearer {bearer_token}"}

arrivals = requests.get(url, headers=headers, verify=False).json()

for arrival in arrivals:
    print(arrival["arrival"]["scheduled"])
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@phykka: Du kommst gar nicht so weit, dass irgendwelche Daten übertragen werden. Schon das Verbinden scheitert bei Dir, weil der SSL-Zertifikat nicht validiert werden kann.
Einfach die Prüfung auszuschalten, ist selten eine gute Idee.
Mit welchem System arbeitest Du denn?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Okay, man sollte das Zertifikat prüfen.

Ein Weg:

Code: Alles auswählen

pip install certifi
Dann mit:

Code: Alles auswählen

import certifi

print(certifi.where())
Den Pfad zum pem-File von certifi ermitteln.
Das pem-File muss im texteditor editiert werden um ein weiteres Zertifikat hinzuzufügen.

Das bekommt man hier:
https://ssl-tools.net/subjects/cc6d221c ... e1eece83cc

Unten auf der Seite das letzte Zertifikat ist das, welches auch von Fraport verwendet wird.
Bitte nicht mir vertrauen, sondern selber im Browser prüfen!

Unter "Download" auf PEM clicken.

Dann den Inhalt des heruntergeladenen PEM-File am Ende des PEM-Files von certifi einfügen.
Jetzt noch im request das PEM-File von certifi referenzieren.

Code: Alles auswählen

import requests
import certifi

cert_file = certifi.where()

bearer_token = "3011c147-180b-3ec5-ba2c-34034812****"

url = "https://developer.fraport.de/api/flights/1.0.2/flight2/FRA/arrival"

headers = {"Accept": "application/json", "Authorization": f"Bearer {bearer_token}"}

arrivals = requests.get(url, headers=headers, verify=cert_file)

for arrival in arrivals.json():
    print(arrival["arrival"]["scheduled"])
Achtung, die API Token von Fraport haben eine Lebensdauer von 1 Stunde und müssen danach neu generiert werden.

Das hat für mich funktioniert. Kann sein, dass es auch einfacher / anders funktioniert.
Antworten