Skip to content

Instantly share code, notes, and snippets.

@TheMuellenator
Forked from angelabauer/flight_data.py
Last active May 12, 2024 20:11
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
)
@biisuke
Copy link

biisuke commented Mar 19, 2024

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

@biisuke
Copy link

biisuke commented Mar 19, 2024

I have now managed to fix this project. My only question is how do you run this program constantly? or once every 30 minutes? Do you run it on python anywhere?

@zmunny
Copy link

zmunny commented Mar 19, 2024 via email

@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?

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