관리 메뉴

솜씨좋은장씨

[Python] 파이썬과 텔레그램으로 스파이더맨 노웨이홈 예매 알리미 만드는 방법! 본문

Programming/Python

[Python] 파이썬과 텔레그램으로 스파이더맨 노웨이홈 예매 알리미 만드는 방법!

솜씨좋은장씨 2021. 12. 12. 23:58
728x90
반응형

2021.12.01 - [Programming/Python] - [Python] telegram.Bot 사용 시 AttributeError: module 'telegram' has no attribute 'Bot' 발생 오류 해결 방법

🥲 어벤져스 엔드게임 예매 실패 PTSD

지난 2019년 4월 16일.

어벤져스 엔드게임 용산 아이맥스 예매가 18시에 오픈된다는 소식을 듣고

부대에서 장교로 근무하고 있어 야근 전에 PX에서 구매한 컵라면과 냉동으로

다른 간부들과 저녁을 간단하게 해결하고 있었습니다.

17시 45분 즈음 되었을 때 예매가 18시에 오픈한다고 하니 이제 슬슬 들어가볼까? 하며

CGV 어플을 켜서 예매로 들어가려고 하는데 이상하게 접속이 잘 안되었고

좀 기다려보니 이미 오픈되어있는 예매와 장애인석 까지 매진되어있는 처참한 풍경을 보고
먹던 모든 것들을 내려놓고 아무것도 하고싶지 않았던 기억이 아직까지도 생생합니다. ( 다른 분의 경험담 )

당시에 다른 분들이 만들어서 올려주셨던 텔레그램 용아맥 알리미를 믿고 기다렸었는데

예매가 오픈하고 한참뒤에 알림이 와서 별 소용이 없었던 기억이 있었습니다.

🕸 그로부터 2년 후 어벤져스 엔드게임 급으로 기대되는 스파이더맨 노 웨이홈 예매 전쟁

스파이더맨 노 웨이홈.

예매가 오픈하기 전 아니 스파이더맨 노 웨이홈의 정보가 나올때부터

예전의 어벤져스 엔드게임 급으로 사람들의 관심이 집중되었습니다.

불현듯 2년 전의 어벤져스 엔드게임 때의 예매 실패의 기억이 스쳐 지나가면서 

아... 이번엔 오픈하자마자 바로 예매를 할 수 있는 알리미를 직접 만들어서 예매에 성공해야겠다는 생각이 들었습니다.

이에 개봉 18일 전인 11월 28일에 알리미 개발을 시작했습니다.

그래서 이 알리미로 예매에 성공했느냐!

그것은 맨 마지막에 적어보도록 하겠습니다.

👨🏻‍💻 텔레그램 용산 CGV 스파이더맨 개봉 알리미 제작

텔레그램 알리미 개발은

cgv 상영시간표 페이지 분석 > 텔레그램 봇 생성 > requests와 BeautifulSoup 활용해 크롤링, 메세지 전송 코드  작성 

순으로 진행하였습니다.

🤔 cgv 상영시간표 페이지 분석

개발에 앞서 예매가 오픈하면서 동시에 업데이트가 되는 페이지인 cgv 영화 상영시간표 페이지를 분석하여

크롤링 코드를 작성하는데 필요한 정보를 하나씩 만들었습니다.

📃 크롤링에 필요한 URL 정보

 

영화 그 이상의 감동. CGV

 

www.cgv.co.kr

영화 상영시간표의 페이지 url은 처음 페이지로 이동하였을때에는

http://www.cgv.co.kr/reserve/show-times/

위와 같이 별 정보가 없는 형식이지만 

화면에서 내가 확인하고 싶은 극장 ( CGV 용산아이파크몰 ) 의 이름을 클릭하면

http://www.cgv.co.kr/reserve/show-times/?areacode=01&theaterCode=0013&date=20211212

위와 같이 다양한 정보가 url에 추가가 되어있는 것을 볼 수 있습니다.

 

여기서 아! 각 지역, 극장마다 코드를 가지고 있고 날짜 별 구분은 date의 값을 YYYYMMDD 형식으로 넣어주면 되겠구나!

 

라는 것을 알 수 있었습니다.

 

그러나! 위의 주소를 활용하여 상영시간표의 내용을 가져올 수는 없었습니다.

왜냐하면 구글 크롬에서 F12를 눌러 개발자 도구를 연 다음

실제 상영시간표 부분 값이 나오는 부분을 확인해보면 iframe으로 되어있었고 여기의 url을 업데이트하여야

실제 상영시간표의 값을 받아올 수 있었기 때문입니다.

 

그래서 해당 부분의 주소를 복사하여 가져왔습니다.

/common/showtimes/iframeTheater.aspx?areacode=01&theatercode=0013&date=20211215

이 부분은

http://www.cgv.co.kr

의 뒷부분이므로 이를 합쳐서 알리미를 만드는 크롤링에 필요한 url로 활용했습니다.

📃 크롤링에 필요한 값 확인

그리고 나서는 내가 크롤링해서 가져오고자 하는 부분의 값들을 하나씩 찾았습니다.

가장 먼저 영화의 제목 부분의 값을 찾았습니다.

영화의 제목 부분은 col-times라는 class 명을 가진 div 태그 안에

info-movie 라는 class명을 가진 div 태그 또 그안에 a 태그 -> strong 태그 구조에 존재했습니다.

div.col-times > div.info-movie
a > strong

그 다음으로는 IMAX, 4DX, GOLD CLASS 여부를 확인하는 부분을 찾았습니다.

이는 영화의 제목과 같이 col-times 라는 class 명을 가진 div 태그 아래에

type-hall div 태그 그 아래에 info-hall div태그 그 아래에 ul > li 아래 screentype이름을 가진 span 태그에 

존재했습니다.

span.screentype

🔧 텔레그램 봇 토큰, chat_id 생성하기

2021.12.12 - [유용한 정보/기타] - 텔레그램 BotFather를 활용하여 텔레그램 봇 생성하고 chat_id를 얻는 방법!

 

텔레그램 BotFather를 활용하여 텔레그램 봇 생성하고 chat_id를 얻는 방법!

종종  텔레그램 봇과 Python을 활용하여 공적마스크 재고 알리미, 용산 아이파크몰 CGV 예매 오픈 알리미 같은 것을 만들곤 했습니다. 그럴때 필요한 것이 텔레그램 봇 생성 > chat_id 가져오기입니

somjang.tistory.com

먼저 위의 글을 참고하여 텔레그램 봇 토큰과 chat_id를 생성합니다.

👨🏻‍💻 Python 코드 작성 실행

import requests
from bs4 import BeautifulSoup
import telegram
from apscheduler.schedulers.blocking import BlockingScheduler
import datetime
import telegram
import time


bot = telegram.Bot(token="텔레그램토큰")


def movie_alarm_telegram(areacode='01', theatercode='0013', date='20211215', check_title='스파이더맨-노 웨이 홈', chat_ids=['chat_id', 'chat_id']):
    movie_dict = {}
    
    url = f"http://www.cgv.co.kr/common/showtimes/iframeTheater.aspx?areacode={areacode}&theatercode={theatercode}&date={date}"

    url_req = requests.get(url)
    url_soup = BeautifulSoup(url_req.text, 'html.parser')

    movie_titles = []
    
    movie_infos = url_soup.select("div.col-times > div.info-movie")
    if (movie_infos):
        for movie_info in movie_infos:
            screentype_list = []
            title = movie_info.select('a > strong')[0].text.strip()

            screentypes = movie_info.parent.select("span.screentype")

            for screentype in screentypes:
                screentype_list.append(str(screentype.text))

            movie_dict[title] = ", ".join(screentype_list)

        for movie in movie_dict.keys():
            movie_open_check_condition1 = (check_title == movie)
            if True in {movie_open_check_condition1}:
                for chat_id in chat_ids:
                    bot.sendMessage(chat_id=chat_id, text = f"{movie}의 {movie_dict[movie]}예매가 오픈되었습니다.")
    else:
        bot.sendMessage(chat_id="689318726",text = "아직 오픈된 예매가 없습니다.")
        print(datetime.datetime.now().strftime("%Y-%m-%d | %H:%M:%S"))
        print("fail")


if __name__ == "__main__":
    movie_alarm_telegram(areacode='01', theatercode='0013', date='20211215', check_title='스파이더맨-노 웨이 홈', chat_ids=['chat_id', 'chat_id'])

sc = BlockingScheduler()
sc.add_job(movie_alarm_telegram, 'interval', seconds = 30)
sc.start()

코드 작성은 requests와 BeautifulSoup 라이브러리를 활용하여 CGV 사이트를 크롤링하고

telegram 라이브러리를 활용하여 메세지를 전송하는 코드를 작성하고

이를 apscheduler를 활용하여 일정한 시간동안 계속 반복 동작하도록 작성하였습니다.

2021.12.01 - [Programming/Python] - [Python] telegram.Bot 사용 시 AttributeError: module 'telegram' has no attribute 'Bot' 발생 오류 해결 방법

 

[Python] telegram.Bot 사용 시 AttributeError: module 'telegram' has no attribute 'Bot' 발생 오류 해결 방법

스파이더맨 노웨이홈의 개봉이 14일 앞으로 다가온 오늘! 오랜만에 텔레그램으로 예매 알리미를 만들어볼까하여 import telegram bot = telegram.Bot(token="토큰") 위와 같이 코드를 작성하고 실행하려고하

somjang.tistory.com

만약 telegram 라이브러리가 제대로 동작하지 않는다 싶으면 위의 링크를 참고하여 라이브러리 재설치를 진행하면됩니다.

실행하면 위와 같이 원하는 날짜에 원하는 영화의 예매가 오픈하면 알림이 오게 됩니다.

( 현재 코드는 30초마다 확인 -> 알림 전송 )

🥲 이렇게 까지 했지만! 실패...

대망의 12월 7일

12시 51분에 딱 오픈했다는 알림이 떠서 바로 접속했지만!

결국 예매는 실패하였습니다....ㅎ....ㅎ.....

뭐니뭐니해도 결국 운과 타이밍이 제일 중요한 것 같습니다.

 

앞으로 매트릭스, 킹스맨, 닥터스트레인지 2 등등 필요할 때 종종 사용하고자 합니다.

 

읽어주셔서 감사합니다.

 

Comments