본문 바로가기
PC/Programming

The More 더모어 신한카드 - Amazon balance 결제기

by dragom 2022. 3. 10.
반응형

과거 20년전에나 볼 수 있던 신용카드의 혜택을 볼 수 있어 너무 소중한 더모어 신한 카드.

각종 결제 신공을 도입하고 있던 와중, 아마존 적금이라는 글을 발견하여 저도 아마존 적금을 시작했습니다.

비록 미국 아마존이라 배송비도 비싸고 언제 어떻게 쓸 수 있을지 잘 모르겠어서 매일매일 하지는 않고있고

생각날때마다 한번씩 하고 있습니다.

그래도 환율 찾아보고 금액 넣는게 꽤나 귀찮은 짓이라 원클릭에 끝내고 싶어졌습니다.

Python 코드입니다.

config_data의 메일주소, 비밀번호, 메인 결제 수단으로 등록된 카드의 카드번호를 입력하시면 됩니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import os, sys

## python -m PyInstaller -F Check_currency.py --collect-data selenium --collect-data certifi

config_data = {
    "amazon_id": "계정메일주소",
    "amazon_pwd": "계정비밀번호",
    "cardnumbers": "카드번호",
    # 더모어 계산기
    "url_check": "https://www.thecashback.kr/exchangerate.php",
    "xpaths_check": '//*[@id="c7"]',
    # 여기부터 amazon
    "url_buy": "https://www.amazon.com/gp/product/B086KKT3RX",
    "xpaths_buy_amount": '//*[@id="gcui-asv-reload-form-custom-amount"]',
    "xpaths_buy_button": '//*[@id="gcui-asv-reload-buynow-button"]/span/input',
    # passwd(login check)
    "xpaths_login_mail": '//*[@id="ap_email"]',
    "xpaths_login_mail_btn": '//*[@id="continue"]',
    "xpaths_login_psswd": '//*[@id="ap_password"]',
    "xpaths_login_psswd_btn": '//*[@id="signInSubmit"]',
    # order page - verify card?
    "xpaths_paymethod": '//*[@type="radio"]',
    "xpaths_paymethod_cardnum": "",
    "xpaths_paymethod_cardnum_btn": '//*[@aria-label="Verify card"]',
    "xpaths_paymethod_btn": '//*[@name="ppw-widgetEvent:SetPaymentPlanSelectContinueEvent"]',
    "xpaths_buy_order": '//*[@name="placeYourOrder1"]',
    "xpaths_buy_check": '//*[@id="widget-purchaseConfirmationStatus"]/div/h4/div/div/h4',
    # text = Order placed, thanks!
}
config_data["xpaths_paymethod_cardnum"] = (
    '//*[@placeholder="ending in ' + config_data["cardnumbers"][-4:] + '"]'
)


def set_chrome_driver():
    try:
        options = webdriver.ChromeOptions()
        options.add_experimental_option("excludeSwitches", ["enable-logging"])
        options.add_argument("lang=ko_KR")
        if not os.path.isfile("debug"):
            options.add_argument("headless")
            os.environ["WDM_LOG_LEVEL"] = "0"
        else:
            try:
                del os.environ["WDM_LOG_LEVEL"]
            except:
                None
        driver = webdriver.Chrome(
            service=Service(ChromeDriverManager().install()), options=options
        )
        driver.delete_all_cookies()
        driver.implicitly_wait(5)
        return driver
    except Exception as e:
        print(e)
        return False


def check_today(config_data, driver):
    try:
        driver.get(config_data["url_check"])
        a = driver.find_element(By.XPATH, config_data["xpaths_check"]).text
        a = float(a.replace("$", ""))
        return a
    except:
        return False


def Amazon_1_buybalance(config_data, driver, today_value):
    try:
        driver.get(config_data["url_buy"])
        driver.implicitly_wait(10)
        print("Enter $" + str(today_value))
        driver.find_element(By.XPATH, config_data["xpaths_buy_amount"]).send_keys(
            str(today_value)
        )
        print("Press BUY")
        driver.find_element(By.XPATH, config_data["xpaths_buy_button"]).click()
        driver.implicitly_wait(10)
        return True
    except:
        return False


def Amazon_login(config_data, driver, input_mail):
    try:
        print("Enter E-mail")
        input_mail.send_keys(config_data["amazon_id"])
        print("Press NEXT")
        driver.find_element(By.XPATH, config_data["xpaths_login_mail_btn"]).click()
        driver.implicitly_wait(10)
        print("Enter password")
        driver.find_element(By.XPATH, config_data["xpaths_login_psswd"]).send_keys(
            config_data["amazon_pwd"]
        )
        print("Press Login")
        driver.find_element(By.XPATH, config_data["xpaths_login_psswd_btn"]).click()
        driver.implicitly_wait(10)
        return True
    except:
        return False


def Amazon_2_logincheck(config_data, driver):
    try:
        input_mail = driver.find_element(By.XPATH, config_data["xpaths_login_mail"])
        print("Login required.")
    except:
        print("Login page skip.")
        return True
    return Amazon_login(config_data, driver, input_mail)


def Amazon_paycheck(config_data, driver, paycheck):
    try:
        print("Press card radio box")
        paycheck.click()
        driver.implicitly_wait(10)
        print("Enter card numbers")
        driver.find_element(
            By.XPATH, config_data["xpaths_paymethod_cardnum"]
        ).send_keys(config_data["cardnumbers"])
        print("Press Verify button")
        driver.find_element(
            By.XPATH, config_data["xpaths_paymethod_cardnum_btn"]
        ).click()
        driver.implicitly_wait(10)
        driver.find_element(By.XPATH, config_data["xpaths_paymethod_btn"]).click()
        driver.implicitly_wait(10)
        return True
    except:
        return False


def Amazon_3_Paymethodcheck(config_data, driver):
    try:
        paycheck = driver.find_element(By.XPATH, config_data["xpaths_paymethod"])
        print("Payment method check required.")
    except:
        print("Payment method not-checking.")
        return True
    return Amazon_paycheck(config_data, driver, paycheck)


if __name__ == "__main__":
    driver = set_chrome_driver()
    if not driver:
        print("Driver Initialize Fail")
        sys.exit()
    today_value = check_today(config_data, driver)
    if not today_value:
        print("Check today value Failed")
        sys.exit()
    print(today_value)

    try_count = 1
    while try_count <= 5:
        try_count += 1
        status = Amazon_1_buybalance(config_data, driver, today_value)
        status = Amazon_2_logincheck(config_data, driver)
        status = Amazon_3_Paymethodcheck(config_data, driver)
        try:
            final_button = driver.find_element(
                By.XPATH, config_data["xpaths_buy_order"]
            )
            final_button.click()
            print("Order submit")
        except:
            print("Order failed")
            continue
        try:
            result = driver.find_element(By.XPATH, config_data["xpaths_buy_check"]).text
        except:
            print("Order check failed")
        if "Order placed" in result:
            print("Order success!")
            break
        else:
            print("Order rejected??? check please")
            input()
            break

 

실행하는 데 필요한 requirment는 첨부로 올렸습니다.

pip install -r requirements.txt

로 필요한 plug-in들을 설치하면 돌릴 수 있고,

python -m PyInstaller -F Check_currency.py --collect-data selenium --collect-data certifi

명령어를 통해 실행 파일로 만들 수 있습니다.

수행 결과를 알기 위해 cmd 창이 뜨도록 되어있고,

실행하는 폴더에 debug 라는 공파일이 있는 경우 브라우저가 보이도록 되어있어 과정을 확인할 수 있습니다.

또한 debug 파일이 있어 브라우저가 보이는 경우 결제 실패/완료 후 브라우저가 꺼지지 않도록 되어있습니다.

requirements.txt
0.00MB

 

반응형

댓글