Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Study for me

선착순 구매 매크로 만들기 본문

개발

선착순 구매 매크로 만들기

k4sud0n 2024. 3. 10. 11:02

요즘 폴리테루라는 브랜드의 옷이 굉장히 핫하다.

구하고 싶어도 거의 5초 안에 품절되는 모습과 번개장터에 웃돈 얹어서 파는 모습을 보고 좀 억울하기도 해서, 파이썬 연습할 겸 매크로를 한 번 만들어보기로 했다.

Selenium을 사용할 예정이다.

방법

우선 매크로를 실제로 돌려보면서 구매가 되는지 확인을 해봐야 하는데, 대부분의 품목이 품절이라 쉽지 않았다.

무수한 솔드아웃들

겨우겨우 품절되지 않은 몇 개의 품목을 찾아서 로직을 세워보기로 했다. 기본적으로 폴리테루는 특정시간에 드랍하는 방식을 사용하므로 드랍 시간에 제품 상세페이지에 접속해서 구매하기 버튼이 뜰 때까지 새로고침 하는 방식으로 구현했다.

요약하면 다음과 같다.

폴리테루 스토어 로그인 => 상품 상세페이지 접속 => 사이즈 선택 =>  구매하기 버튼 클릭 => 카카오페이로 결제하기

속도나 작동 방식은 아래 11번가 매크로를 참고하였다.

11번가 매크로 리더스 3070ti FE 런칭 테스트 - YouTube

 

 

 

 

 

제품이 발매하는 특정 시간까지 계속 새로고침을 하다가, 구매버튼이 활성화되는 순간 매크로가 작동되는 것으로 보인다.
CSS나 불필요한 이미지도 불러오지 않아서 속도가 거의 1~2초정도로 굉장히 빠르다.

코드

from selenium import webdriver
from selenium.webdriver.edge import service
from selenium.webdriver.common.keys import Keys
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.desired_capabilities import DesiredCapabilities

# 옵션 설정
options = webdriver.EdgeOptions()
options.use_chromium = True
options.add_experimental_option('excludeSwitches', ['enable-logging'])  # 콘솔로그 출력 안하게
options.add_experimental_option("excludeSwitches", ["enable-automation"])  # 자동화 제어 메시지 제거
options.add_experimental_option("useAutomationExtension", False)  # 자동화 확장기능 비활성화
options.add_argument('--disable-blink-features=AutomationControlled')  # 자동화 탐지 회피
options.add_argument('--blink-setting=imagesEnable=false')  # 이미지 불러오지 않기
options.add_argument("disable-gpu") 
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")

기본적인 셀레니움 옵션 코드다. 속도를 빠르게 하기 위해서 쓸데없는 기능들은 최대한 제거했다. 
연습용 매크로라 그렇지만 실제로 작동시킬때는 headless 모드도 추가해서 더 빠르게 할 수 있을것 같다.

def macro(product_link, product_size):
    # 로그인
    print('폴리테루 로그인중...')
    
    ...

    # 구매하기
    print('사이즈 선택중...')

    select_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//span[contains(text(), '선택하세요.')]"))
    )
    select_button.click()
    time.sleep(0.5)

    size_option = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, f"//div[@class='custom-select-option' and div[@class='custom-select-option-info'][text()='{product_size}']]"))
    )
    size_option.click()

    driver.find_element(By.ID, 'btn_buyNow').click()
    time.sleep(0.5)

    print('선택 완료!')

가장 중요한 구매하기 버튼이다. XPATH를 사용해서 사이즈 선택버튼 드롭다운을 누르고, 원하는 사이즈를 선택한 후, 구매하기 버튼을 누르는 코드다.

    # 카카오페이
    time.sleep(2.5)
    driver.find_element(By.CLASS_NAME, 'kakaotalk').click()
    time.sleep(0.5)
    driver.find_element(By.ID, 'userPhone').send_keys(config['KAKAOPAY']['PHONENUMBER'])
    driver.find_element(By.ID, 'userBirth').send_keys(config['KAKAOPAY']['BIRTH'])
    driver.find_element(By.CLASS_NAME, 'btn_payask').click()

구매하기 버튼을 누른후, 나는 카카오페이를 사용해서 결제를 할것이기 때문에 전화번호, 생년월일을 미리 저장해둔 config 파일에서 읽어서 붙여넣는 식으로 코드를 구현했다.

이렇게 대략적인 코드를 작성하고 실행해보자.

실행

개선점

  • 속도를 더 빠르게 할 수 있을것 같다. 불필요한 CSS도 제거하면 될 것 같다.
  • 상품을 1개만 구매하는게 아닌, 여러개를 선택 후 장바구니에 담아서 구매하는 방식으로 변경하기

문의

https://open.kakao.com/o/sk82TAnh

 

폴리테루 매크로

 

open.kakao.com

 

Comments