본문 바로가기
개발/Python

[Python] 인터파크 티켓팅 기본 매크로 개발 - 5 (좌석 선택)

by 1인용 놀이터 2025. 1. 16.
728x90
반응형

매크로 개발 포스팅에 앞서,

매크로 개발 자체는 불법은 아닙니다만, 이를 이용한 암표 거래는 불법입니다. 

그리고, 이 매크로는 파이썬을 처음 써보는 필자가 만든 것이므로 안될 겁니다.


[Python] 인터파크 티켓팅 기본 매크로 개발 - 1 (브라우저열기)

 

[Python] 인터파크 티켓팅 기본 매크로 개발 - 2 (로그인하기)

 

[Python] 인터파크 티켓팅 기본 매크로 개발 - 3 (예매페이지 이동)

 

[Python] 인터파크 티켓팅 기본 매크로 개발 - 4 (날짜 및 회차 선택)

 

 

이제 좌석선택만이 남았음.

놀이터에서는 좌석선택까지만 할 계획임. 좌석 선점을 하고 난 이후 결제버튼 클릭, 결제방식 선택은 여기까지 오면서 사용했던 방식들을 응용해서 사용할 수 있을 거라고 생각함.

 

좌석 선택을 하기 위해 우리는 포도알을 찾아야함.

필자는 개발자 도구에서 확인 할 수 있듯이 보라색 이미지의 img src로 해당 element를 찾을 예정.

wait = WebDriverWait(driver, 100)
wait.until(EC.presence_of_element_located((By.XPATH, "//img[@src='http://ticketimage.interpark.com/TMGSNAS/TMGS/G/1_90.gif']")))
seat_check = driver.find_elements(By.XPATH, "//img[@src='http://ticketimage.interpark.com/TMGSNAS/TMGS/G/1_90.gif']")

 

 

좌석이 로딩 되고 난 후에 찾으려는 element 확인.

기존에는 driver.find_element(...)로 element를 찾았는데 좌석은 같은 src를 가진 이미지가 다수이기 때문에 driver.find_elements로 검색.

여기서 자꾸 에러나서 한참 헤맸..............

 

좌석을 찾았다면 그 좌석을 내가 '찜' 해야 하는데, 필자는 중앙블럭 1~4열을 선호하는 덕후이기 때문에, 좌석선택을 할 때 이 부분을 구분하고 종류별로 분류를 했음.

일단 개발자 도구 내용에 보면 img 별로 title 항목이 있는데 해당 항목에 현재 좌석의 정보가 들어있음.

다 같은 형식으로 되어 있는지 체크하려고 여러 공연을 확인 해보니 아래와 같은 종류가 있는데, 이것도 일부분일 뿐....

 

title="[S석] 1층-B구역 19열-9" 

title="[VIP석] 1층-12열-14" 

title="[R석] 객석1층-I열-11" 

title="[VIP석] 1층-B구역 11열-11" 

title="[R석] 1층-나열-42"

 

이 title 항목에서 좌석 정보를 분리하기 위해, 3가지 정도 체크 하고 비교를 했음.

1. 구역 여부 체크

2. 1층인지 확인

3. 열의 종류가 숫자인지, 영문인지, 한글인지 체크.

want_floor = "1층"
want_area = "B구역"
want_ticket = 1 #원하는 티켓 수량
area_yn = 1 # 구역여부
check_seat = 0
for seat_title in seat_check :
    _seat = seat_title.get_attribute("title")
    seat_area = _seat.split()[1]
    if area_yn == 1 :
        if seat_area.split("-")[0].find("1층") != -1  and seat_area.split("-")[1] == want_area:
            seat_num = _seat.split()[2]
            if int(seat_num.split("-")[0][:-1]) <= 4 or (ord(seat_num.split("-")[0][:-1]) - 64) <= 4:
                if 7 <= int(seat_num.split("-")[1]) <= 17: # 중앙블럭 좌석 번호
                    seat_title.click()
                    # 이선좌 팝업 체크는 여기에.
                    check_seat = check_seat + 1
                    if check_seat == want_ticket :
                        break
    else:
        if seat_area.split("-")[0].find("1층") != -1 : 
            compare_text = seat_area.split("-")[1][:-1]
            if re.search("[가-힣]+", seat_area.split("-")[1][:-1]) != None : # korea
                if seat_area.split("-")[1] == "나열" :
                    if 1 <= int(seat_area.split("-")[2]) <= 40:
                        seat_title.click()   
                        # 이선좌 팝업 체크는 여기에.
                        check_seat = check_seat + 1
                        if check_seat == want_ticket : # 원하는 장 수 만큼 클릭 됐는지 체크
                            break
            elif compare_text.isnumeric() :
                if int(seat_area.split("-")[1][:-1]) <= 4 :# number
                    if 7 <= int(seat_area.split("-")[2]) <= 17:
                        seat_title.click()      
                        # 이선좌 팝업 체크는 여기에.
                        check_seat = check_seat + 1
                        if check_seat == want_ticket :
                            break
            elif (ord(seat_area.split("-")[1][:-1]) - 64) <= 4: # english
                    if 6 <= int(seat_area.split("-")[2]) <= 17:
                        seat_title.click()
                        # 이선좌 팝업 체크는 여기에.
                        check_seat = check_seat + 1
                        if check_seat == want_ticket :
                            break

 

위 코드에서 보면,

가져온 title 항목의 값들을 split 구문을 이용하여 쪼개서 사용하고 있음.

아래와 같이 split()으로 쪼개면 띄어쓰기나 공백을 찾아 쪼개는 것

seat_area = _seat.split()[1]

 

title 항목의 예시에서 좌석 위치에 대해서 적어도 1개 이상의 띄어쓰기가 있음.

필자가 찾아봤을 때 구역이 구분되어 있는 공연장인 경우 좌석의 열과 번호가 한번 더 띄어쓰기 되어있었기에 첫 조건은 구역 여부를 체크 했음.

그렇게 1차 구분이  되면 1층인지 여부를 한번 더 체크 했음.

# 구역이 있는 공연장에서의 1층 구분
if seat_area.split("-")[0].find("1층") != -1  and seat_area.split("-")[1] == want_area:

# 구역이 없는 공연장에서의 1층 구분
if seat_area.split("-")[0].find("1층") != -1 :

 

1층까지 구분이 되고 나면 중앙구역의 좌석을 선택하기 위해 해당 부분을 한번 더 체크 해야함.

구역이 있는 공연장의 경우에는 띄어쓰기로 되어 있는 부분의 마지막 부분으로 활용해야 한다.

아래 코드에서 처럼 띄어쓰기로 한번 더 split 하면 "11열-11" 이 부분만 남게 되니,

몇 열인지를 체크. 필자는 1열~4열까지만.

그리고 중앙 블럭 좌석 번호 체크해서 클릭 하면 끝!

seat_num = _seat.split()[2]
if int(seat_num.split("-")[0][:-1]) <= 4 or (ord(seat_num.split("-")[0][:-1]) - 64) <= 4: # 열 번호
	if 7 <= int(seat_num.split("-")[1]) <= 17: # 좌석번호
    	seat_title.click()

 

구역이 없는 공연장의 경우도 크게 다르지 않음.

더이상 띄어쓰기 없으니 "-"로 split 하여 열번호가 한글인지 숫자인지, 영문인지 체크.

그리고 중앙 블럭 좌석번호 체크 해서 내꺼 찜! 

 

파이썬 처음 해보는 필자가 폭풍 구글링 해가며 만든 매크로가 실전에서 어떻게 될지는 모름.

소극장 공연에서만 테스트를 해서 보안문자 관련해서도 안했고 

공부 삼아 만들면서 테스트 한거라 대충 해서 안될 가능성 2만%임.

그래서 테스트 하면서 저절로 페이지 넘어가고 원하는 좌석 체크 하는데 기분은 좋았음. 훗

728x90
반응형