当ページのリンクには広告が含まれることがあります。

Amazonで自動購入するプログラムを作る【Selenium×Python】

プログラミング

スプラトゥーン3をしていると、どうしてもプロコンがほしくなりました。

けれど、Amazonで商品入荷してもすぐ売り切れてしまうのでAmazonでほしい商品を自動で購入するプログラムを作成しました。
また、少し前からPythonに興味があったので、Seleniumと合わせて学習を兼ねて面白そうなものを作ってみることにしました。

注意点

本プログラムは、PythonとSeleniumの学習用に作成したものであり、転売活動を推奨しているわけではありません。
また、学習用のため、機能を保証するものではございませんので予めご了承ください。

このコードを実行するとAmazonに数秒間隔でリダイレクトしています。
Amazonより悪質なアクセスと認識されアカウントが停止する恐れがあります。
アカウントのBANなどトラブルが発生したとしても筆者は一切責任を負いません。

開発環境

・Windows10
・Python 3.10.8

概要

Chromeのプロファイル呼び出し

毎回購入するときに、Amazonでログイン処理をしていると時間かかってしまいます。そのため、普段使っているChromeのプロファイルを呼び出してあげることにしました。
プロファイルを呼び出してあげれば、Amazonへのログイン情報を保持したまま動作させることができます。

CHROME_DRIVER = 'chromedriver.exe'
# Chromeが保存するプロファイルデータのディレクトリを指定
USER_DIR = 'C:/Users/XXXXX/XXXXX/XXXXX'
USER_PROFILE_DIR = 'Profile 1'

Amazon販売か判定処理

転売ヤーから高額で購入するのが嫌なため、Amazon販売かどうかを判定する処理を追加します。
対象の要素を引っ張ってきて、Amazon.co.jpと記載があるかを判定しています。

def amazon_judgement(driver):
    elements = driver.find_elements(By.XPATH, '//*[@id="tabular-buybox"]/div[1]/div[4]/div/span/a')
    if len(elements) > 0 :
        id_merchant_info = driver.find_element(By.XPATH, '//*[@id="tabular-buybox"]/div[1]/div[4]/div/span/a').text
        print('販売元:' + id_merchant_info)
        # 発送元がAmazon.co.jpなら購入 それ以外なら購入しない
        if id_merchant_info == ("Amazon.co.jp"):
            # 買う
            ret = True
        else :
            # 買わない
            ret = False
        return ret
    else:
        print('販売元:なし')
        return False;

購入ボタンクリック

【今すぐ買う】ボタンをクリックする処理です。
カートに入れるより、早く購入まで進めるため、こちらをクリックしています。

def buy_process(driver):
    buy_now_btn = driver.find_element(By.XPATH,'//*[@id="buy-now-button"]')
    buy_now_btn.click()
    print('「今すぐ購入」ボタンをクリックしました。')

    time.sleep(2)
    iframe = driver.find_element(By.ID,'turbo-checkout-iframe')
    driver.switch_to.frame(iframe)
    turbo_checkout_pyo_btn = driver.find_element(By.XPATH,'//*[@id="turbo-checkout-pyo-button"]')
    turbo_checkout_pyo_btn.click()
    print('「注文を確定する」ボタンをクリックしました。')
    driver.switch_to.default_content()

全コード

from selenium import webdriver
from selenium.webdriver.chrome import service as sv
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
import time
import random

CHROME_DRIVER = 'chromedriver.exe'
# Chromeが保存するプロファイルデータのディレクトリを指定
USER_DIR = 'C:/Users/XXXXX/XXXXX/XXXXX'
USER_PROFILE_DIR = 'Profile 1'
BUY_NUM = 1

def main():
    # Chromeサービス指定
    chrome_service = sv.Service(executable_path=CHROME_DRIVER)
    #Optionでユーザプロファイルの場所を指定する
    options = webdriver.ChromeOptions()
    options.add_argument('--user-data-dir=' + USER_DIR)
    options.add_argument('--profile-directory=' + USER_PROFILE_DIR)

    driver = webdriver.Chrome(service=chrome_service, options=options)

    # urlを指定してブラウザで開く(Nintendo Switch Proコントローラーのページを指定)
  url = 'https://amzn.asia/d/6TPplrB'

    driver.get(url)
    waitsec=random.randint(1,5)

    num = 0
    while num < BUY_NUM:
        try:
            amazon = amazon_judgement(driver)
            if amazon :
                print('購入処理を開始します。')
                buy_process(driver)
                num = num + 1
                print('購入処理を終了します。')
            time.sleep(3 + waitsec)
            driver.refresh()
        except ZeroDivisionError as e:
            print('error:' + e)
            print('購入処理が失敗しました。')
            time.sleep(3 + waitsec)
            driver.refresh()

def amazon_judgement(driver):
    elements = driver.find_elements(By.XPATH, '//*[@id="tabular-buybox"]/div[1]/div[4]/div/span/a')
    if len(elements) > 0 :
        id_merchant_info = driver.find_element(By.XPATH, '//*[@id="tabular-buybox"]/div[1]/div[4]/div/span/a').text
        print('販売元:' + id_merchant_info)
        # 発送元がAmazon.co.jpなら購入 それ以外なら購入しない
        if id_merchant_info == ("Amazon.co.jp"):
            # 買う
            ret = True
        else :
            # 買わない
            ret = False
        return ret
    else:
        print('販売元:なし')
        return False;

def buy_process(driver):
    buy_now_btn = driver.find_element(By.XPATH,'//*[@id="buy-now-button"]')
    buy_now_btn.click()
    print('「今すぐ購入」ボタンをクリックしました。')

    time.sleep(2)
    iframe = driver.find_element(By.ID,'turbo-checkout-iframe')
    driver.switch_to.frame(iframe)
    turbo_checkout_pyo_btn = driver.find_element(By.XPATH,'//*[@id="turbo-checkout-pyo-button"]')
    turbo_checkout_pyo_btn.click()
    print('「注文を確定する」ボタンをクリックしました。')
    driver.switch_to.default_content()

if __name__ == "__main__":
    main()

おわりに

今回、はじめてPythonを触ってみましたが、非常にかなり楽しかったです。少しJavaScriptに似ていると思いました。
また、SeleniumとPythonでポチポチ自動で画面が操作されているのを見るのは作っていて楽しかったです。
Pythonでデスクトップアプリも作れるらしいので、次はアプリを何か作ってみたいなと思ってます!