일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ndarray
- 웹페이지
- class
- udemy
- API플랫폼
- 쉬티
- 웹크롤링
- 유데미
- 계산기
- 최저가
- Tequila
- 부트스트랩
- Endpoint
- Pygame
- API
- Sheety
- HTML
- HTTP
- 파이썬
- 파싱
- 상태코드
- Python
- SMTP
- 프로그램
- 프로젝트
- twilio
- phython
- Game
- 오류
- 게임
- Today
- Total
데이터 분석가
파이썬 최저가 항공권 티켓 알림 프로젝트 본문
안녕하세요 !
해외 여행 가는거 좋아하시나요 ??! 해외 여행을 가려면 항공권을 예약을 해야하는데
비용이 만만치 않잖아요 ?!!
제가 책임지고 최저가로 모셔다 드리겠습니다 ! 저만 따라 오십쇼
이번 시간에는 여태까지 배운 개념들을 바탕으로 응용 프로그램인
항공권 최저가 티켓 알림 프로그램을 만들어 보겠습니다 !
여기서 사용할 사이트는 다음과 같습니다.
1. Sheety (구글 시트&Sheety 연동)
2. Twilio (Tequila App과 가상번호로 SMS 전송 프로그램)
3. Tequila (항공 일정에 대한 API 정보 제공 사이트)
1번 Sheety 밑에 참고
https://an-ju-seong-coding.tistory.com/34
2번 Twilio 밑에 링크 참조
https://an-ju-seong-coding.tistory.com/36
3번 Tequila 밑 링크 참조
https://an-ju-seong-coding.tistory.com/37
각각의 구글 시트 연결, 가상 번호, APP API 등 필요한 정보가 만들어졌네요 !
먼저 밑의 Flight Deals를 사본으로 구글 스프레드 시트에 저장한다(이를 통해 Sheety에 연결)
프로그램을 만들기 위해서는 5가지 py 파일이 필요한데요
일단 Sheety에 있는 해당하는 IATA 코드를 불러오는 코드를 짜 봅시다
1.data_manager.py
from pprint import pprint
import requests
# Google Sheet의 최저가 티켓 데이터를 가져올 API 엔드포인트
SHEETY_PRICES_ENDPOINT = "여기에 쉬피 URL 가져오세요"
class DataManager:
def __init__(self):
self.destination_data = {}
# Google Sheet에서 최저가 티켓 데이터를 가져옴
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
# Google Sheet의 최저가 티켓 데이터를 업데이트
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)
해당 코드는 Sheety API를 사용하여 , Google Sheet에서 도시 목록, 해당 도시 IATA 코드를 가져와 업데이트한다
여기서 pprint는 prettry print의 약자인데, 조금 더 보기 쉽게 개괄식으로 바꿔주는 모듈이다.
get_destination_data 함수는 SHEETY_PRICES_ENDPOINT에서 요청을 보내 도시 데이터를 가져오고,
가져온 데이터에서 prices 키에 있는 값을 destination_data 변수에 할당한 후, destination_data를 반환합니다.
나머지 함수로 각 도시의 IATA 코드를 new_data에 할당하여 json으로 보낸 후 업데이트 하며 put 요청을 보냄
2.flight_search.py
import requests
# TEQUILA API Endpoint와 API Key를 설정
TEQUILA_ENDPOINT = "api.tequila.kiwi.com/"
TEQUILA_API_KEY = "테킬라 앱 키"
class FlightSearch:
def get_destination_code(self, city_name):
# TEQUILA API로 해당 도시의 IATA 코드를 가져온다
location_endpoint = f"https://{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
항공권에 대한 정보를 제공하는 API 플랫폼인 Tequila 사이트에서 API 와 API KEY 설정 후
입력된 IATA 코드를 활용해 정보를 가져온다.
3. main.py
from data_manager import DataManager
from flight_search import FlightSearch
# DataManager 인스턴스 생성
data_manager = DataManager()
# Google Sheets에서 데이터 가져온다
sheet_data = data_manager.get_destination_data()
if sheet_data:
# 첫번째 도시의 IATA 코드가 없는 경우
if sheet_data[0]["iataCode"] == "":
# FlightSearch 인스턴스 생성
flight_search = FlightSearch()
# 각 도시의 IATA 코드 가져와서 sheet_data에 업데이트
for row in sheet_data:
row["iataCode"] = flight_search.get_destination_code(row["city"])
print(sheet_data)
# 업데이트된 sheet_data를 다시 DataManager 인스턴스에 저장하고 Google Sheets에 업데이트
data_manager.destination_data = sheet_data
data_manager.update_destination_codes()
# Google Sheets에서 데이터가 없는 경우
else:
print("No data found in the sheet.")
kiwi.com 즉 tequila에서 제공하는 항공권에 대한 정보는 여러 가지 상황에 스케줄이 변경되거나 취소되는 일이 빈번하다
그렇기에 if문을 이용해 출발지에서 도착지까지 도시에 대한 정보를 IATA 코드로 불러와서 확인한다
그리고 세 가지 py 파일을 정확하게 입력했다면 다음과 같이 API GET이 실행된다
자 이제 IATA에 대한 정보를 받았으니 조금 더 자세한 필터를 통해 최저가 항공권을 조회해 봅시다!
2.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": "KRW" # 통화
}
response = requests.get(
url=f"{TEQUILA_ENDPOINT}/v2/search",
headers=headers,
params=query,
)
try:
data = response.json()["data"][0] # API에서 반환한 가장 저렴한 항공권 정보
except IndexError:
print(f"No flights found for {destination_city_code}.")
return None
# FlightData 클래스 인스턴스 생성
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}: {round(flight_data.price,2)}원")
return flight_data
쉬티 URL에서 불러온 API를 바탕으로 조건에 맞게 설정을 하고 각각의 구하고자 하는 데이터를 입력합니다
저는 인천 출발, 한국 통화 기준으로 작성했습니다 !
자 다음은 class FlightData를 포함하는 flight_data.py와
테킬라(Tequila) sms 문자 서비스를 연결하는 notofication_manger.py를 작성해보겠습니다
4. flight_data.py
# 생성자 메서드를 정의
# 객체를 생성할 때, 초기화할 값을 받아서 객체의 속성을 초기화
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
5.notofication_manger.py
from twilio.rest import Client
TWILIO_SID = "Twilio 계정 SID"
TWILIO_AUTH_TOKEN = "Twilio 계정 인증 토큰"
TWILIO_VIRTUAL_NUMBER = "Twilio 가상 번호"
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,
)
# 성공적으로 전송되면 출력
print(message.sid)
트윌로에서 만든 계정으로 입력해 줍시다
이제 3.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 = "ICN"
# 시트에 IATA 코드가 없는 경우, 가져와서 저장
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)
three_month_from_today = datetime.now() + timedelta(days=(3 * 30)) # 오늘부터 3개월 간
# 시트의 목적지별로 비행기 티켓 가격 확인
for destination in sheet_data:
flight = flight_search.check_flights(
ORIGIN_CITY_IATA,
destination["iataCode"],
from_time=tomorrow,
to_time=three_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}."
)
저는 오늘부터 3개월 간 구글 시트에 저장 돼 있는
'Lowest Price'보다 낮은 가격일 경우, Tequila를 통한 메세지를 출력한다.
자 이렇게 해서
1. data_manager.py
2. flight_search.py
3. main.py
4. flight_data.py
5. notofication_manger.py
네 가지 파이썬 파일을 이용해 main.py를 만들어 보았는데요
처음에는 목적지에 대한 IATA 코드를 가져오고, 4,5번 파이썬 파일을 추가해
최저가를 조회하는 프로그램을 만들어 보았습니다 ! 그런데 여기서 .. 유료 서비스를 제공하고 있어
제 Sheety는 무료 버전이라 더 이상 작동을 하지 않아서 작동하는 모습을 보여드리진 못 할거 같습니다....
한번씩 도전해 보시고 잘 작동되는지 시험해 봅시다 !
감사합니다
'파이썬(python) 프로젝트 모음' 카테고리의 다른 글
아마존 자동 가격 추적기 프로그램 (0) | 2023.04.20 |
---|---|
웹크롤링을 이용한 영화추천 목록 프로그램 (0) | 2023.04.19 |
파이썬 쉬티(Sheety) & 운동 추적(Nutritionix) 프로그램 (0) | 2023.04.07 |
파이썬 국제 우주 정거장(ISS) 추적 프로그램 (0) | 2023.04.06 |
파이썬(Python) 생일 축하 이메일 보내기(Smtp) (0) | 2023.04.04 |