반응형

기존 확장프로그램으로 쓰던 SRT 예매 매크로가 막혀서 손크로를 할 수 밖에 없다.

하지만 그러기에는 너무 귀찮기때문에 파이썬과 셀레니움을 통해서 만들어 보도록 하자.

개발공부하는 겸해서 겸사겸사 만들어 보도록 하겠다. 

이것은 어떻게 개발을 했는지 흔적을 남기기 위해서 작성하는 글이다.

잘 만들어져가지고 완성되면 나 혼자 잘 써야겠다.ㅎㅎㅎ

 

먼저 개발했던 사람이 있어서 해당 분의 소스코드를 기반으로 커스터마이징을 진행할 것이다.

kminito.tistory.com/25

 

[Python] 파이썬으로 SRT 매진 표 예매하기 (+셀레늄)

 파이썬으로 SRT 표 예매 과정을 자동화 한 것입니다. 웹에서의 동작은 셀레늄을 이용했습니다. 아래 내용을 보시면 아시겠지만 단순히 사람이 하는 반복 작업을 파이썬을 통해 자동화 한 것이

kminito.tistory.com

위 블로거의 소스코드를 기반으로 커스터마이징을 진행할 것이다.
(초반 설계가 힘든데 다 해주셔서 공수를 많이 줄일 수 있을거 같다.. 위 블로그도 들려주길 바란다)

해당 블로그의 소스코드를 하나 하나씩 타이핑하여 적었다. 앞으로 수정할 부분을 이번 글에 나열해보겠다. 

더보기

 

# -*- coding: utf-8 -*-

import os
import sys
import datetime
import requests
from time import sleep
from random import randint
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import Select

def open_browser():
    options = webdriver.ChromeOptions()
    #option.add_argument('headlees')
    options.add_argument('window-size=1920x1080')
    options.add_argument("disable-gpu")
    driver = webdriver.Chrome("C:\selenium\chromedriver", chrome_options=options)
    return driver

def run():
    driver = open_browser()
    driver.get('https://etk.srail.co.kr/cmc/01/selectLoginForm.do')
    driver.implicitly_wait(15)
    driver.find_element_by_id('srchDvNm01').send_keys("SRT 회원번호") #아이디
    driver.find_element_by_id('hmpgPwdCphd01').send_keys("SRT 비밀번호") #비번
    driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[1]/div[1]/div[2]/div/div[2]/input').click()('//*[@id="login-form"]/fieldset/div[1]/div[1]/div[2]/div/div[2]/input').click()
    # 보내기
    driver.implicitly_wait(4)
    sleep(0.4)
    driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div[1]/a').click() # 도착, 시간 등
    driver.implicitly_wait(1)
    driver.find_element_by_id("ui-id-{}".format(dpt_locs[dpt])).click() #도착지
    sleep(0.4)
    driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div[2]/a').click()
    driver.implicitly_wait(1)
    driver.find_element_by_id("ui-id-{}".format(avl_locs[avl])).click() #출발지
    date_ele = driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div[3]/div/input[1]')
    driver.execute_script("arguments[0].setAttribute('value','{}')".format(dpt_date), date_ele)
    driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div[4]/a').click()
    driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/a').click()
    driver.implicitly_wait(4)
    sleep(0.4)

    counter =1
    while True:
        soup = BeautifulSoup(driver.page_source,'html.parser')
        trlist = soup.select('#result-form > fieldset > div.tbl_wrap.th_thead > table > tbody > tr')
        index=0
        done=False
        for tdl in trlist:
            if done ==False:
                index += 1
                for train_no in train_nums:
                    if tdl.select('.trnNo')[0].text.strip() == str(train_no):
                        if '예약하기' in tdl.select("td")[6].find_all(text='예약하기'):
                            t = "#result-form > fieldset > div.tbl_wrap.th_thead > table > tbody > tr:nth-child(" + str(index) + ") > td:nth-child(7) > a"
                            driver.find_element_by_css_selector(t).click()
                            print("예약완료----------------------------------------------------------")
                            done=True
                            break
                        else:
                            sleep(0.3)
                else:
                    break
            print("loop done. count : {}".format(counter))
            sleep(randint(5,10))
            if done == False:
                elm = driver.find_element_by_xpath('//*[@id="search_top_tag"]/input')
                driver.execute_script("arguments[0].click();", elm)
                driver.implicitly_wait(2)
                counter+=1
            else:
                driver.quit()
                break

            if counter > 240:
                print("loop 2004 done")
                break

if __name__ == "__main__":
    dpt = input("출발지 입력 (ex 동탄, 울산, 동대구, 수서, 천안아산) : ")
    avl = input("도착지 입력 - 출발지랑 마찬가지")
    dpt_date = input("날짜 입력. 반드시 2019.12.31 형태 : ")
    when = input("6시 or 16시 둘중 하나 : ")
    train_nums = list(map(int,input("기차 번호 입력 스페이스바로 구분 : ").strip().split()))
    run()

 

 

1. SRT 회원번호가 아닌 이메일주소로 로그인 및 이메일 주소,비밀번호 입력받아서 처리(run,25 / main)
1-1. 로그인 실패시  다시 진행할 수 있도록
2. 출발지 및 도착지를 바로 확인해서 입력할 수 있도록 처리
3. 출발지 및 도착지 에러나는거 수정(33,37)
4. 예약하기 및 예약대기 부분 바뀐거 맞춰서 찾을 수 있도록 하기
5. 6시 or 16시 형태를 바꿀 수 있는거 고민
6. 예매가 되면 트럼펫이나 아무거나 소리나게 만들기
7. 접근성 좋게 exe나 이거저것으로 고치기
8. 이거를 기반으로 각 기능별로 포스팅하면 좋을 듯 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기