새소식

반응형
Python/KTX 자동 예약하기

Python 과 Telegram, selenium으로 KTX 자동 예매하기(8. 예약하기)

  • -
반응형

telegram.py

#예약하기
ticket_reservation = re.compile("예약[0-9]")
ticket_reservation_find = re.compile("[^예약]")

if ticket_reservation.match(con_text):
    index_seq = ticket_reservation_find.findall(con_text)
    index_seq = ''.join(index_seq)
    self.korail.ticket_reservation(index_seq)

#7단계 글에서 검색, 결과 if문 밑에 추가하면 된다.

 

korail.py

def ticket_reservation(self, index_seq):
    #from tel.telegram import KTX_Telegram
    is_reserve = None
    while True:
        is_reserve = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[3]/div/div[1]/form[1]/div/div[4]/table[1]/tbody/tr[%s]/td[6]//img" % index_seq).get_attribute("alt")
        if is_reserve == "예약하기":
            self.driver.find_element(By.XPATH, "/html/body/div[1]/div[3]/div/div[1]/form[1]/div/div[4]/table[1]/tbody/tr[%s]/td[6]/a[1]/img" % index_seq).click()
            #telegram_message = {'chat': {'id': 챗봇 id}, 'text': '예약완료'}
            time.sleep(2)
            try:
                sancheon_popup_iframe = self.driver.find_element(By.ID, "embeded-modal-traininfo")
                self.driver.switch_to.frame(sancheon_popup_iframe)
                self.driver.find_element(By.XPATH, "/html/body/div/div[2]/p[3]/a").click()
                time.sleep(2)
            finally:
                alert = self.driver.switch_to.alert
                alert.accept()
                token = "텔레그램 HTTP API";
                bot = telepot.Bot(token)
                bot.sendMessage('챗봇 id', '예약완료')
                time.sleep(1)
        else:
            self.driver.find_element(By.CSS_SELECTOR, ".btn_inq > a:nth-child(1) > img:nth-child(1)").click()
            time.sleep(2)

- while True:

: 매진일때 예약할때까지 무한루프를 돌기 위해 while 사용

 

- sancheon_popup_iframe = self.driver.find_element(By.ID, "embeded-modal-traininfo")
  self.driver.switch_to.frame(sancheon_popup_iframe)

: KTX-산천을 예약하게 되면 예약하기 버튼을 눌렀을때 나오는 alert창 전에 iframe으로 창이 하나 더 뜬다.

iframe은 html 코드 안에 html이 하나 더 생기기때문에 iframe 태그로 selenium이 바라보는 창을 선택한 후 닫아야한다.

해당 위 id를 변수에 저장 후 switch_to.frame() 으로 창을 바꿔야한다. 바꾼 후 창닫기!

 

- alert = self.driver.switch_to.alert
  alert.accept()

: 예약하기 버튼을 눌렀을때 alert 창이 뜨므로 switch_to.alert 를 통해서 accept를 눌러야 창이 지나간다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.