이제 pyqt에서 원하는 열차편에 예약을 체크하고 예약 시도버튼을 누르면 계속 창을 새로고침하면서 열일하는 브라우저를 만들어 봅시다.

 

기본 원리는 오늘 내가 광주 송정에서 수서역을 가능하면 빨리 가야하는데 모든 시간편의 좌석이 만석이라면 원하는 시간대의 열차편에 줄줄이 예약 체크를 해 놓고 시도를 해놓으면 시간 순서대로 좌석을 확인하다가 하나라도 자리가 나면 그 기차편을 바로 예약 하도록 걸어 놓는 것입니다.

 

__init__.py try_seat 함수

    def try_seat(self):
        self.checked_group = []
        for index, element in enumerate(self.check_list):
            if element.isChecked() == True:
                self.checked_group.append(index)
            else: pass
        print(self.checked_group)
        done = self.srt.try_reservation(self.checked_group)
        playsound.playsound('Baccano - Guns and Roses.mp3', True)

 

먼저 빈 self.checked_group 리스트를 만들고 다음 구문과 같이 check가 되어 있으면 그 index값을 리스트에 넣습니다.


결국 리스트 안에 [1, 3, 5]로 되어 있다면 2번째, 4번째, 6번째 열차편이 체크되어 있겠지요.

 

그리고 그 리스트를 srt_book.pytry_reservation함수로 넘겨주었습니다.

 

srt_book.py try_reservation 함수

    def try_reservation(self, checked):
        while True:
            try:
                for index in checked:
                    index = index + 1
                    if self.driver.find_element_by_xpath(
                        f"/html/body/div[1]/div[4]/div/div[3]/div[1]/form/fieldset/div[6]/table/tbody/tr[{index}]/td[7]/a").text == "예약하기":
                        element = self.driver.find_element_by_xpath(
                            f"/html/body/div[1]/div[4]/div/div[3]/div[1]/form/fieldset/div[6]/table/tbody/tr[{index}]/td[7]/a")
                        self.driver.execute_script("arguments[0].click();", element)

                        return "done"
                    else: pass
                self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.HOME)
                element = self.driver.find_element_by_xpath(
                    '/html/body/div[1]/div[4]/div/div[2]/form/fieldset/div[2]/input')
                self.driver.execute_script("arguments[0].click();", element)
                time.sleep(1)
            except:
                time.sleep(8)
                continue

 

먼저 while True:로 무한 루프를 돌려줍니다. 예매를 할 때까지 무한으로 돌리는 것이죠.😁

 

그 다음 try except구문을 이용합니다. 이유는 매크로를 돌려본 결과 어느 순간 브라우저가 멈췄다가 몇초있다가 풀리는 경우가 있습니다.

 

그러한 경우 프로그램이 팅겨버리기 때문에 이 경우에는 except구문을 이용하여 8초정도 기다렸다가 다시 continue로 처음부터 다시 반복시킵니다.

 

본격적인 매크로의 로직은 다음과 같습니다.


내가 체크한 열차편들의 숫자 +1 는 곧 각 열차편의 n행이 되는 원리를 이용했습니다.

 

그리고 그 행으로 찾아가 일반 좌석란에 "예약하기" 버튼이 있는지를 보고 있다면 바로 클릭하는 구문입니다. 그리고 예매가 되었으니 "done"을 return해 줍니다.

 

만약 "예약하기" 버튼이 없다면 그냥 pass하고 컨트롤+홈 키를 이용하여 화면을 위로 올려 다시 검색하기 버튼을 누릅니다.(사실 컨트롤+홈키로 화면을 위로 스크롤을 안올려도 되는지 모르겠습니다..ㄷㄷ😨)

 

그리고 1초 딜레이 후 다시 예약하기를 시도합니다.

 

이제 다시 __init__.py파일로 돌아가서 코딩을 마쳐봅니다.

 

__init__.py try_seat 함수

    def try_seat(self):
        print("예약하기")
        self.checked_group = []
        for index, element in enumerate(self.check_list):
            if element.isChecked() == True:
                self.checked_group.append(index)
            else: pass
        print(self.checked_group)
        done = self.srt.try_reservation(self.checked_group)
        playsound.playsound('Baccano - Guns and Roses.mp3', True)

 

마지막 done 변수의 값은 "done"으로 받는데 아무 의미 없습니다.ㅋㅋ

 

그리고 playsound.playsound로 같은 폴더에 넣어둔 mp3파일을 재생합니다.(너무 간단하네요..)

 

결국 예매해놓고 딴 짓하다가 예매가 되면 mp3가 재생되면 얼른 튀어가서 결제하면 되는 것이죠.

 


 

두번째 포스트는 엄청 양이 많았는데 정작 이번 포스트는 짧게 돼 버렸네요.😂
KTX와 SRT 매크로 프로그램을 만들었는데 하면서도 애매합니다.

 

웹 크롤링의 끝나지 않을 딜레마입니다.🤔

 

Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 1. 시작, 레이아웃 작성
Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 2. Selenium 원격 컨트롤
Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 3. 자동 예매, 매크로, 끝

+ Recent posts