Computer Security

#5 Selenium을 이용한 매크로(좌석선택) 본문

프로그래밍/Python 웹 스크래핑

#5 Selenium을 이용한 매크로(좌석선택)

쿠리 Kuri 2022. 7. 2. 18:30

이번 포스팅에서는 보안문자를 칠 때까지 딜레이가 된후 보안문자가 쳐지면, 바로 좌석 선택 -> 카카오 페이 결제 수단까지 나오게끔 하는 조금 더 디테일한 매크로를 만들어 볼 예정이다.

앞서 포스터와 같이 악용할 사례가 있기에, 코드 몇줄을 없앨 예정이다. 

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys

import time
import datetime as dt
from selenium.webdriver.support.ui import Select

ID = 'ID'   #ㅁㅁㅁㅁㅁ사용자 아이디 입력ㅁㅁㅁㅁㅁ
PWD = 'PW^^'  #ㅁㅁㅁㅁㅁ사용자 비번 입력ㅁㅁㅁㅁㅁ


driver = webdriver.Chrome('./chromedriver.exe')
# 사이즈조절
driver.set_window_size(1920, 1080)  # (가로, 세로)
driver.get('site') # 페이지 이동


driver.switch_to.frame(driver.find_element(By.XPATH, "//div[@class='leftLoginBox']/iframe[@title='login']"))
userId = driver.find_element(By.ID, 'userId')
userId.send_keys(ID)
userPwd = driver.find_element(By.ID, 'userPwd')
userPwd.send_keys(PWD)
userPwd.send_keys(Keys.ENTER)

def wait_until(xpath_str):
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, xpath_str)))


driver.get('site 예매')
#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#예매 창 


endhope=False
while not endhope:
    tim=dt.datetime.now()
    if tim.second>=59 and tim.microsecond>800000:
        driver.refresh()
        endhope=True
        print(tim)
    else:
        time.sleep(0.1)
        print(tim)

 #정해진 시간에 새로 고침


time.sleep(2)

pop=driver.find_element(By.XPATH, '//*[@id="div_checkDontsee_PT002_46_1"]/div[2]/button')
pop.click()

time.sleep(2)
ticket1=driver.find_element(By.XPATH,'/html/body/div[6]/div[4]/div[4]/div[5]/div[5]')
ticket1.click()

driver.switch_to.window(driver.window_handles[1])

time.sleep(10)

seat = driver.find_element(By.CSS_SELECTOR, 'body > div.wrap > div.bodyZone > div.groundList > div.list > a')
seat.click()

auto = driver.find_element(By.XPATH,'/html/body/div[1]/div[3]/div[2]/div[3]/a[1]/img')
auto.click() #일반석 후 자동선택 클릭


frame = wait.until(EC.presence_of_element_located((By.ID, "ifrmBookStep")))
driver.switch_to.frame(frame)

ticket_select=driver.find_element(By.XPATH,'//select[@name="SeatCount"]/option[text()="1매"]')
ticket_select.click()


next_1 = driver.find_element(By.XPATH,'//*[@id="SmallNextBtnImage"]') #다음단계 클릭
next_1.click()


driver.switch_to.frame('ifrmBookStep')

wait_until('//*[@id="Delivery"]')
live = driver.find_elements(By.ID,'Delivery') #현장수령 클릭
len(live)
live[0].click()

YYMMDD = driver.find_element(By.ID, 'YYMMDD') #ㅁㅁㅁㅁㅁㅁㅁㅁㅁ사용자 생년월일 입력ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
YYMMDD.send_keys('YYMMDD') 

driver.switch_to.default_content()
next_2 = driver.find_element(By.XPATH,'//*[@id="SmallNextBtnImage"]')
next_2.click() #다음 단계 클릭



time.sleep(2)
kakaopay = driver.find_element(By.XPATH,'//*[@id="Payment_22084"]/td/input')
kakaopay.click() #결제수단 카카오페이 클릭

driver.switch_to.default_content()
next_3 = driver.find_element(By.XPATH,'//*[@id="SmallNextBtnImage"]')
next_3.click() #다음 단계 클릭

driver.switch_to.frame('ifrmBookStep')

wait_until('//*[@id="checkAll"]')
agree= driver.find_element(By.XPATH,'//*[@id="checkAll"]')
agree.click() #모두 동의하기

time.sleep(2)
next_last = driver.find_element(By.XPATH,'//*[@id="LargeNextBtnImage"]')
next_last.click() #마지막 단계 클릭

이 포스팅에 대한 디테일적인 핵심은 iframe이다.

프레임을 지정해주는 것은 쉽게 말해 컴퓨터가 바라보는 시점을 지정해 주는 느낌과 같다.

 

예를 들어서 내가 TV를 보게끔 해보자. 그러면, 나 같은 경우는 TV근처 부분도 보이겠지만,  컴퓨터 입장에서는 TV안의 내용만 보게 된다.

 

그런데, TV밖의 일을 시키게 된다면?

element를 찾지 못하고 오류가 나게 된다.

Comments