Skip to content

Instantly share code, notes, and snippets.

@TheMuellenator
Forked from angelabauer/flight_data.py
Last active August 28, 2024 06:07
Show Gist options
  • Save TheMuellenator/4d730d38818d935a9ce4ad9d7a817138 to your computer and use it in GitHub Desktop.
Save TheMuellenator/4d730d38818d935a9ce4ad9d7a817138 to your computer and use it in GitHub Desktop.
class FlightData:
def __init__(self, price, origin_city, origin_airport, destination_city, destination_airport, out_date, return_date):
self.price = price
self.origin_city = origin_city
self.origin_airport = origin_airport
self.destination_city = destination_city
self.destination_airport = destination_airport
self.out_date = out_date
self.return_date = return_date
import requests
from flight_data import FlightData
TEQUILA_ENDPOINT = "https://tequila-api.kiwi.com"
TEQUILA_API_KEY = YOUR FLIGHT SEARCH API KEY
class FlightSearch:
def get_destination_code(self, city_name):
location_endpoint = f"{TEQUILA_ENDPOINT}/locations/query"
headers = {"apikey": TEQUILA_API_KEY}
query = {"term": city_name, "location_types": "city"}
response = requests.get(url=location_endpoint, headers=headers, params=query)
results = response.json()["locations"]
code = results[0]["code"]
return code
def check_flights(self, origin_city_code, destination_city_code, from_time, to_time):
headers = {"apikey": TEQUILA_API_KEY}
query = {
"fly_from": origin_city_code,
"fly_to": destination_city_code,
"date_from": from_time.strftime("%d/%m/%Y"),
"date_to": to_time.strftime("%d/%m/%Y"),
"nights_in_dst_from": 7,
"nights_in_dst_to": 28,
"one_for_city": 1,
"max_stopovers": 0,
"curr": "GBP"
}
response = requests.get(
url=f"{TEQUILA_ENDPOINT}/v2/search",
headers=headers,
params=query,
)
try:
data = response.json()["data"][0]
except IndexError:
print(f"No flights found for {destination_city_code}.")
return None
flight_data = FlightData(
price=data["price"],
origin_city=data["route"][0]["cityFrom"],
origin_airport=data["route"][0]["flyFrom"],
destination_city=data["route"][0]["cityTo"],
destination_airport=data["route"][0]["flyTo"],
out_date=data["route"][0]["local_departure"].split("T")[0],
return_date=data["route"][1]["local_departure"].split("T")[0]
)
print(f"{flight_data.destination_city}: £{flight_data.price}")
return flight_data
from datetime import datetime, timedelta
from data_manager import DataManager
from flight_search import FlightSearch
data_manager = DataManager()
sheet_data = data_manager.get_destination_data()
flight_search = FlightSearch()
ORIGIN_CITY_IATA = "LON"
if sheet_data[0]["iataCode"] == "":
for row in sheet_data:
row["iataCode"] = flight_search.get_destination_code(row["city"])
data_manager.destination_data = sheet_data
data_manager.update_destination_codes()
tomorrow = datetime.now() + timedelta(days=1)
six_month_from_today = datetime.now() + timedelta(days=(6 * 30))
for destination in sheet_data:
flight = flight_search.check_flights(
ORIGIN_CITY_IATA,
destination["iataCode"],
from_time=tomorrow,
to_time=six_month_from_today
)
@zmunny
Copy link

zmunny commented Mar 22, 2024

Guys, I managed to fix it. Issue was with my acc. I think. Thank you all for the help

Nice!!

@kriswen
Copy link

kriswen commented Apr 8, 2024

I don't understand how she just knows to get the ["route"] and ["local_departure"] from the data. I tried entering data = response.json() into the jsonviewer to see what key it has, but it gave me an error saying "invalid json variable". So how does she know what keys to get.
flight_data = FlightData( price=data["price"], origin_city=data["route"][0]["cityFrom"], origin_airport=data["route"][0]["flyFrom"], destination_city=data["route"][0]["cityTo"], destination_airport=data["route"][0]["flyTo"], out_date=data["route"][0]["local_departure"].split("T")[0], return_date=data["route"][1]["local_departure"].split("T")[0] )

I have same question LOL

it's in the search_api documentation' sample response https://tequila.kiwi.com/portal/docs/tequila_api/search_api
i guess it was originally in the api response, but they removed it ( and also forgot to update the documentation)?
I also didn't see the ["local_departure"] from the response data, so i used the ["dTime"] and convert the time format instead:

        flight_data = FlightData(
            from_city=data["route"][0]["cityFrom"],
            from_code=data["route"][0]["flyFrom"],
            to_city=data["route"][0]["cityTo"],
            to_code=data["route"][0]["flyTo"],
            # convert epoch time to human readable https://www.geeksforgeeks.org/convert-epoch-time-to-date-time-in-python/#google_vignette
            from_date=time.strftime("%d/%m/%Y", time.gmtime(data["route"][0]["dTime"])),
            to_date=time.strftime("%d/%m/%Y", time.gmtime(data["route"][1]["dTime"])),
            price=data["price"],
        )

@MarkoTomasevic7
Copy link

I also get error 403 for fetching flight prices (via search api), altough the part of my code that gets iata codes (via locations api) works. How can I solve this?

@weirdmo
Copy link

weirdmo commented May 12, 2024

there is no registration option in kiwi website i think they ditched free plan or am i doing something wrong? Anyone else experienced? is there an alternative?

@akashkchoudhary567
Copy link

current API "https://tequila-api.kiwi.com/v2/search" appears not to be free any longer This is the second API where I am getting the following error from some of the examples {"error_code":403,"message":"You don't have permission to access this resource"} event form the web site API that is the error I was also getting. Location to get code still worked.

Which is the second Api you are using for iata codes?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment