데이터 분석가

파이썬 최저가 항공권 티켓 알림 프로젝트 본문

파이썬(python) 프로젝트 모음

파이썬 최저가 항공권 티켓 알림 프로젝트

PlintAn 2023. 4. 10. 15:00

안녕하세요 !

 

해외 여행 가는거 좋아하시나요 ??! 해외 여행을 가려면 항공권을 예약을 해야하는데

 

비용이 만만치 않잖아요 ?!!

 

제가 책임지고 최저가로 모셔다 드리겠습니다 ! 저만 따라 오십쇼

 

 

이번 시간에는 여태까지 배운 개념들을 바탕으로 응용 프로그램인 

 

항공권 최저가 티켓 알림 프로그램을 만들어 보겠습니다 !

 

여기서 사용할 사이트는 다음과 같습니다.

 

1. Sheety (구글 시트&Sheety 연동)

2. Twilio (Tequila App과 가상번호로 SMS 전송 프로그램)

3. Tequila (항공 일정에 대한 API 정보 제공 사이트)

 

 

1번 Sheety 밑에 참고

https://an-ju-seong-coding.tistory.com/34

 

Sheety(쉬티)&구글 시트 사용

Sheety는 구글 시트(Google Sheets)를 데이터베이스로 활용할 수 있게 해주는 온라인 플랫폼으로 구글 시트에 저장된 데이터를 활용하여 간단한 API를 생성하는 역할을 한다 Sheety를 사용하면 개발자가

an-ju-seong-coding.tistory.com

2번 Twilio 밑에 링크 참조

 

https://an-ju-seong-coding.tistory.com/36

 

트윌리오 Twilio SMS 문자 보내기

안녕하세요! 트윌리오는 클라우드 기반의 통신 API 플랫폼으로, 가상 번호를 발급해주며 이를 관리하고 APP과의 연결도 도와주는 플랫폼입니다 ! 해당 사이트에 접속. https://www.twilio.com/ Communication

an-ju-seong-coding.tistory.com

 

3번 Tequila 밑 링크 참조

 

https://an-ju-seong-coding.tistory.com/37

 

테킬라 Tequila 항공권 정보 제공 API 플랫폼

테킬라 Tequila 는 항공권에 대한 정보를 제공해주는 API 플랫폼이다. 테킬라를 사용하면 항공권, 호텔, 렌터카 등의 여행 상품 정보를 검색하고 비교 가능하다 이를 위해 사용자는 API Key를 발급 받

an-ju-seong-coding.tistory.com

 

 

각각의 구글 시트 연결, 가상 번호, APP API 등 필요한 정보가 만들어졌네요 !

 

 

먼저 밑의 Flight Deals를 사본으로 구글 스프레드 시트에 저장한다(이를 통해 Sheety에 연결)

Flight Deals의 사본.xlsx
0.00MB

 

프로그램을 만들기 위해서는 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.comtequila에서 제공하는 항공권에 대한 정보는 여러 가지 상황에 스케줄이 변경되거나 취소되는 일이 빈번하다

 

그렇기에 if문을 이용해 출발지에서 도착지까지  도시에 대한  정보를 IATA 코드로 불러와서 확인한다

 

그리고 세 가지 py 파일을 정확하게 입력했다면 다음과 같이 API GET이 실행된다 

 

 

 

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무료 버전이라 더 이상 작동을 하지 않아서 작동하는 모습을 보여드리진 못 할거 같습니다....

 

한번씩 도전해 보시고 잘 작동되는지 시험해 봅시다 !

 

 

감사합니다

 

 

 

 

 

 

Comments