PS4 프로 자동 구입 매크로 만들기 -4-

과도한 매크로 사용은 서버에 큰 부담이 될 수 있으므로 반복적인 작업을 자동화 하거나 테스트 용도로 한정해서 사용하시기 바랍니다. 매크로 사용 시 발생하는 모든 문제에 대한 책임은 전적으로 매크로 사용자 본인에게 있습니다.

 

본래 시나리오는 품절인지 계속 확인하다가 재고가 있으면 구매하기 버튼을 누르는 건데, 이게 현실에선 테스트가 힘들겠죠? 따라서 임의로 테스트 환경을 만들어야 합니다. 때문에 일단 구매가 가능한 물품 페이지로 가서 품절일 때와의 차이를 확인해 보겠습니다. ITEMURL을 기능 구현이 완료될 때 까지 잠시 봐꿔 두도록 하겠습니다.

 

HOMEPAGE = "http://gamewoori.com/shop/member.html?type=login"
PS4PRO = "http://gamewoori.com/shop/shopdetail.html?branduid=885806&xcode=009&mcode=001&scode=&type=X&search=&sort=regdate"
PS4SLIM = "http://gamewoori.com/shop/shopdetail.html?branduid=885764&xcode=009&mcode=001&scode=&type=X&search=&sort=regdate"
ITEMURL = PS4SLIM

 

 

이미지 상에 체크한대로 빨간 상자의 총 상품 금액(품절이면 0원, 재고 있으면 실제 금액)이나 파란 상자의 구매하기 버튼 등을 비교할 수 있을 것 같네요. 이미지 찾는 건 많이 해 봤으니 새로운 시도를 위해 이번엔 빨간 상자의 총 상품 금액을 비교하는 방법으로 checkStock() 함수를 만들도록 하겠습니다.

 

재고 여부 확인하기

 

우선 기존 소스에서 checkStock()을 부르는 부분을 살펴보면 checkStock() 함수가 True일 경우 계속 반복하도록 되어 있습니다. 따라서 checkStock() 함수는 재고가 없으면 return True, 재고가 있으면 return False를 해줘야 겠네요.

 

    i = 1
    while(checkStock(driver, i)):
        i += 1
        time.sleep(SLEEPSEC)
        if (i > LOOP and LOOP != -1):
            break
        driver.get(ITEMURL)

 

이제 품절인 아이템, 재고가 있는 아이템의 금액(0원/378,000원)에 대해 각각 요소 검사를 실행해 봅니다.

 

 

둘 다 똑같은 <strong id=”MK_p_total” class=”MK_total”></strong> 인데 가운데 금액만 차이가 나네요. 따라서 XPATH로 id가 ‘MK_p_total’인 strong 태그를 찾은 후 그 안에 있는 금액 부분을 확인해서 0이면 return True, 아니면 return False를 하면 될 것 같습니다.

 

def checkStock(driver, i):
    mktotal = driver.find_element_by_xpath("//strong[@id='MK_p_total']")
    totalPrice = mktotal.get_attribute("innerHTML")
    if (totalPrice == "0"):
        print('[%d]%s' % (i, 'out of stock'))
        return True
    else:
        print "Go! Checkout~"
        return False

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

<strong></storong> 사이의 금액 부분을 가져오기 위해 .get_attribute(“innerHTML”)을 썼습니다. 이제 스크립트를 실행 후 파워쉘에 출력되는 로그를 살펴봅시다. 품절일 경우 out of stock 이 반복해서 찍혀야 하고, 재고가 있으면 Go! Checkout~ 이 찍혀야 합니다.

 

 

원하던 대로 출력이 되는 것 같습니다. 품절인 상태에서 계속 out of stock 로그를 찍으면서 반복하다 서버상 재고가 있음으로 바뀌면 Go! Checkout~을 찍는지를 확인해보고 싶지만 이건 테스트가 힘드니 될거라고 믿고 넘어가겠습니다. 또 현재는 재고확인을 딱 3번만 하는데 주석에 적혀 있듯 3을 -1로 바꾸면 재고가 있을 때 까지 무한 루프를 돌게 됩니다.

 

    LOOP = -1

 

구매하기

 

이제 재고가 있을 때 바로구매하기 버튼을 누르는 checkout() 함수를 만들어 보겠습니다. 지난 번 로그인할 때도 그랬듯이 동작이 한 개니까 한 줄이면 될 것 같네요.

 

 

하이라이트된 img를 XPATH로 찾을 수도 있지만, 이번에도 <a href=”JavaScript:send_multi(”, ‘baro’, ”);”>가 보이네요. 역시 바로구매하기 버튼을 누르면 이 JavaScript가 실행되는 구조이므로 이 스크립트를 실행하도록 하겠습니다.

 

def checkout(driver):
    driver.execute_script("JavaScript:send_multi('', 'baro', '')");

 

이제 다시 스크립트를 실행해 보면 바로구매하기 버튼이 눌린 것 처럼 주문서작성 화면으로 넘어가네요. 여기까지의 전체 소스입니다. 다음 포스팅에선 주문서작성을 마무리하도록 하겠습니다.

 

#-*- coding: utf-8 -*-
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
import time

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

HOMEPAGE = "http://gamewoori.com/shop/member.html?type=login"
PS4PRO = "http://gamewoori.com/shop/shopdetail.html?branduid=885806&xcode=009&mcode=001&scode=&type=X&search=&sort=regdate"
PS4SLIM = "http://gamewoori.com/shop/shopdetail.html?branduid=885764&xcode=009&mcode=001&scode=&type=X&search=&sort=regdate"
ITEMURL = PS4SLIM

USERID = ""
PASSWORD = ""

WAITTIME = 1000
SLEEPSEC = 5
LOOP = 3 # -1 for infinite

def login(driver):
    WebDriverWait(driver, WAITTIME).until(EC.presence_of_element_located((By.XPATH, "//td/input[@name='id']"))).send_keys(USERID)
    driver.find_element_by_xpath("//td/input[@name='passwd']").send_keys(PASSWORD)
    driver.execute_script("JavaScript:check()")

    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "//a[@href='/html/mainm.html?type=logout ']")))

def checkStock(driver, i):
    mktotal = driver.find_element_by_xpath("//strong[@id='MK_p_total']")
    totalPrice = mktotal.get_attribute("innerHTML")
    if (totalPrice == "0"):
        print('[%d]%s' % (i, 'out of stock'))
        return True
    else:
        print "Go! Checkout~"
        return False

def checkout(driver):
    driver.execute_script("JavaScript:send_multi('', 'baro', '');")

def order(driver):
    print '주문서 작성 함수'

if __name__ == "__main__":
    driver = webdriver.Firefox()
    driver.wait = WebDriverWait(driver, 2)

    driver.get(HOMEPAGE)

    login(driver)
    driver.get(ITEMURL)

    i = 1
    while(checkStock(driver, i)):
        i += 1
        time.sleep(SLEEPSEC)
        if (i > LOOP and LOOP != -1):
            break
        driver.get(ITEMURL)

    checkout(driver)

    order(driver)
[출처] https://gencode.me/blogs/post/46/

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
47 [python] 파이썬 f-string (파이썬 스트링 앞에 f') file 졸리운_곰 2021.07.17 446
46 [Python] 파이썬으로 복리 계산하기 file 졸리운_곰 2021.07.17 562
45 [python, 파이썬] 연습 문제: 복리 이자 계산 졸리운_곰 2021.07.17 925
44 [python] 파이썬 기초 문법 정리 졸리운_곰 2021.05.17 861
43 [python] [GPU]GPU 사용 Python 코드 실행 졸리운_곰 2021.04.21 567
42 [python] 파이썬 스케줄 수행 - schedule, apscheduler file 졸리운_곰 2020.07.26 454
41 파이썬 스크립트 스케줄링하기 file 졸리운_곰 2020.07.26 1012
40 Python Scheduler 만들기(APScheduler) 졸리운_곰 2020.07.26 1089
39 [python] 주피터 노트북에서 패키지 설치 졸리운_곰 2018.12.06 1225
38 Data Structures and Algorithm In python 파이썬으로 자료구조와 알고리즘 : 출처 인터넷 file 졸리운_곰 2018.08.27 514
37 Mastering Basic Algorithms in the Python Language 이북 출처 인터넷 file 졸리운_곰 2018.08.27 629
36 python dev 사용자 입력과 출력 졸리운_곰 2018.03.01 472
35 APScheduler 사용기 file 졸리운_곰 2018.02.09 1070
34 [파이썬, 조각코드] 스케쥴러 만들기. 졸리운_곰 2018.02.09 795
33 Python virtualenv 정리 (Linux/Windows) 졸리운_곰 2018.01.23 486
32 [Python] 코드난독화 file 졸리운_곰 2018.01.19 1002
31 Python - Way to recursively find and replace string in text files 졸리운_곰 2017.08.30 478
30 Python Coding for Minecraft 마인크래프트를 위한 파이썬 프로그래밍 file 졸리운_곰 2017.05.05 1794
29 Atom을 Python 개발 툴로 사용하기 file 졸리운_곰 2017.03.06 938
28 IPython Notebook을 통한 데이터 분석 #3 file 졸리운_곰 2017.03.05 754
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED