data_manager.py
from pprint import pprint
import requests
SHEETY_PRICES_ENDPOINT = "https://api.sheety.co/****************/flightDeals/prices"
class DataManager:
# This class is responsible for talking to the Google Sheet.
def __int__(self):
self.destination_data = {}
def get_destination_data(self):
response = requests.get(url=SHEETY_PRICES_ENDPOINT)
data = response.json()
self.destination_data = data["prices"]
# pprint(data)
return self.destination_data
그새 class
작성하는 거 다 잊어버렸다고....?
main.py
from data_manager import DataManager
data_manager = DataManager()
sheet_data = data_manager.get_destination_data()
# print(sheet_data)
if sheet_data[0]["iataCode"] == "":
for row in sheet_data:
row["iataCode"] = "TESTING"
print(sheet_data)
왜 sheet_data[0]["iataCode"]
로 입력하면 "iataCode"
가 "TESTING"
으로 채워지는지 이해를 못하겠음....
sheet_data
는 리스트고 sheet_data[0]
는 {'city': 'Paris', 'iataCode': 'TESTING', 'lowestPrice': 54, 'id': 2}
만 나타내는게 아닌가..?
아.. 그런데 바로 밑에서 for loop
로 sheet_data
의 모든 행을 읽는 건가..? 젠장
아.. 드디어 이해했음.. 내가 한말이 맞구나 일단
if
문으로 확인 하는거고
그 다음에 for loop
로 모든 row
의 iataCode
에 testing
을 입력하는거야
#output
data_manager.py
def update_destination_codes(self):
for city in self.destination_data:
new_data = {
"price": {
"iataCode": city["iataCode"]
}
}
response = requests.put(url=f"{SHEETY_PRICES_ENDPOINT}/{city['id']}", json=new_data)
print(response.text)
왜 또 update_destination_codes(self)
에서 city["iataCode"]
, city['id']
로 입력해야하는 걸까..
main.py
if ...
data_manager.destination_data = sheet_data
data_manager.update_destination_codes()
까지 입력하면 구글 스프레드 시트에 입력까지 됨
flight_search.py
import requests
TEQUILA_ENDPOINT = "https://tequila-api.kiwi.com"
TEQUILA_API_KEY = "_tFAI19Bnvg3P4IcztCPTZFUPYTGve4p"
class FlightSearch:
# This class is responsible for talking to the Flight Search API.
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, params=query, headers=headers)
result = response.json()["locations"]
code = result[0]["code"]
return code
params=
를 json=
으로 입력해서 한참을 또 헤멨어..
main.py
if sheet_data[0]["iataCode"] == "":
from flight_search import FlightSearch
flight_search = FlightSearch()
for row in sheet_data:
row["iataCode"] = flight_search.get_destination_code(row["city"])
print(sheet_data)
...
flight_data.py
class FlightData:
#This class is responsible for structuring the flight data.
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
이렇게 간단한거 요청한거 였냐며...
나는 OOP 아직도 멀었나봐...
flight_search.py
...
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,
"flight_type": "round",
"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
여기서.. 예외처리를 다시보게 될줄은 몰랐어..
근데 이렇게 뭐가 많을 줄은 몰랐네...
뭐가 이렇게 많은가 했더니 결과 값 출력하는거였구나.. 세상에나..
main.py
...
tomorrow = datetime.now() + timedelta(days=1)
six_month_from_today = datetime.now() + timedelta(days=180)
for destination in sheet_data:
flight = flight_search.check_flights(
ORIGIN_CITY_IATA,
destination["iataCode"],
from_time=tomorrow,
to_time=six_month_from_today
)
notification_manager.py
from twilio.rest import Client
TWILIO_SID = "*********************"
TWILIO_AUTH_TOKEN = "*********************"
TWILIO_NUM = "+*********"
MY_NUMBER = "+***********"
class NotificationManager:
#This class is responsible for sending notifications with the deal flight details.
def __init__(self):
self.client = Client(TWILIO_SID, TWILIO_AUTH_TOKEN)
def send_sms(self, message):
message = self.client.messages.create(
body=message,
from_=TWILIO_NUM,
to=MY_NUMBER,
)
print(message.sid)
main.py
from notification_manager import NotificationManager
notification_manager = NotificationManager()
...
if flight.price < destination["lowestPrice"]:
notification_manager.send_sms(
message=f"Low price alert! Only £{flight.price} "
f"to fly from {flight.origin_city}-{flight.origin_airport} "
f"to {flight.destination_city}-{flight.destination_airport}, "
f"from {flight.out_date} to {flight.return_date}."
)
main.py
from datetime import datetime, timedelta
from data_manager import DataManager
from flight_search import FlightSearch
from notification_manager import NotificationManager
data_manager = DataManager()
sheet_data = data_manager.get_destination_data()
flight_search = FlightSearch()
notification_manager = NotificationManager()
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
)
if flight.price < destination["lowestPrice"]:
notification_manager.send_sms(
message=f"Low price alert! Only £{flight.price} to fly from {flight.origin_city}-{flight.origin_airport} to {flight.destination_city}-{flight.destination_airport}, from {flight.out_date} to {flight.return_date}."
)
data_manager.py
from pprint import pprint
import requests
SHEETY_PRICES_ENDPOINT = YOUR SHEETY PRICES ENDPOINT
class DataManager:
def __init__(self):
self.destination_data = {}
def get_destination_data(self):
response = requests.get(url=SHEETY_PRICES_ENDPOINT)
data = response.json()
self.destination_data = data["prices"]
return self.destination_data
def update_destination_codes(self):
for city in self.destination_data:
new_data = {
"price": {
"iataCode": city["iataCode"]
}
}
response = requests.put(
url=f"{SHEETY_PRICES_ENDPOINT}/{city['id']}",
json=new_data
)
print(response.text)
flight_data.py
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
flight_search.py
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,
"flight_type": "round",
"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
notification_manager.py
from twilio.rest import Client
TWILIO_SID = YOUR TWILIO ACCOUNT SID
TWILIO_AUTH_TOKEN = YOUR TWILIO AUTH TOKEN
TWILIO_VIRTUAL_NUMBER = YOUR TWILIO VIRTUAL NUMBER
TWILIO_VERIFIED_NUMBER = YOUR TWILIO VERIFIED NUMBER
class NotificationManager:
def __init__(self):
self.client = Client(TWILIO_SID, TWILIO_AUTH_TOKEN)
def send_sms(self, message):
message = self.client.messages.create(
body=message,
from_=TWILIO_VIRTUAL_NUMBER,
to=TWILIO_VERIFIED_NUMBER,
)
# Prints if successfully sent.
print(message.sid)
내일은 이거 파트2....
내일도 난항이 예상됨...
내일까지 intermediate고 day41부터 web foundation인데 이거 이대로 넘어가도 괜찮으려나....