Study for me
선착순 구매 매크로 만들기 본문
요즘 폴리테루라는 브랜드의 옷이 굉장히 핫하다.
구하고 싶어도 거의 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