【ESP32でAmazon自動注文ボタン】自動購入スクリプトを作成する(ローカル環境で)

DIY
スポンサーリンク

Amazon自動注文ボタンをESP32で作ろうとしています。
前回の記事では[ボタンをクリック ⇒ AWS IoT Core ⇒ AWS Lambndaの実行]の流れの確認ができたので、今回はAWS Lambdaで実行する自動購入スクリプトを作成します。

●開発環境
(自作ボタンへのプログラム書込み、TeraTermでプログラムの画面出力)
・Windows 10 Home Ver.21H1
・conda 4.10.3
・Python 3.7(Conda仮想環境)
・Selenium 3.141.0(Conda仮想環境)
・Chrome バージョン 96.0.4664.45(Official Build) (64 ビット)
・Chromedriver 96.0.4664.45

 

目次

 


 

はじめに

本記事は「ESP32でAmazon自動注文ボタン」の作成手順をまとめた連載記事の1つです。

前の手順

【ESP32でAmazon自動注文ボタン】自作ボタンをクリックしたら、Lambda関数が実行されるようにする
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンをクリックしたら、Lambda関数が実行する手順をまとめました。

 

次の手順

【ESP32でAmazon自動注文ボタン】Lambda関数で自動注文スクリプトの準備する
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はLambda関数で自動購入スクリプトの準備する手順をまとめました。

 

手順全体や関連情報まとめ

 

 

 

自動購入スクリプトの事前準備

自動購入スクリプトを実行するために、以下の事前準備をしてください。

  • Amazonのアカウントの開設
  • 届け先やクレジットカードの登録

 

 

 

Pythonを実行できる仮想環境を構築する

自動購入スクリプトはPython 3.7とSelenium 3.141.0を使います。
Windows PCにそのままインストールしても良いのですが、PythonとSeleniumは最新バージョンではないものを利用することになるので、ここではConda仮想環境を利用することにします。

以下にConda仮想環境を構築する手順を記載します。 

  1. Anacondaをインストールする。

Anacondaのインストール方法は、以下のブログが分かりやすいのでご参考にしてください。

Windows版Anacondaのインストール - python.jp
Caution! Anacondaは、日本語などを含むフォルダにはインストールできません。 Windowsのアカウント名が日本語になっている場合、デフォルトのインストール先フォルダも日本語になるため、別のフォルダを作成する必要があります。イ...

 

  1. Anaconda Promptを起動する。
  2. 以下のコマンドを実行することで、Conda仮想環境を生成する。
> conda create -n [仮想環境名] python=3.7
  • [仮想環境名]は任意の名前を入れてください。(例: autoPurchaser)
  • Python 3.7は、AWS Lambdaでの実行を想定して指定しています。

 

  1. 以下のコマンドを実行することで、Conda仮想環境をアクティベートする。
> conda activate [仮想環境名]
  • [仮想環境名]は前手順で指定したものを入れてください。(例: autoPurchaser)

仮想環境が有効になっていると、プロンプトが(仮想環境名) xxxxx>のようになります。

 

  1. Pythonのバージョンを確認する。

念のため、以下のコマンドで指定した通りのPythonバージョンになっているか確認します。

(仮想環境) >python -V
Python 3.7.11

 

 

 

Seleniumをインストールする

自動購入スクリプトで使用するSeleniumをインストールします。
以下に手順を記載します。

  1. 前手順で作成した仮想環境をアクティベートする。
  2. 以下のコマンドでSelenium(3.141.0)をインストールする。
>pip install selenium==3.141.0
>pip list

 

pip listで指定したSeleniumのバージョンがインストールされている確認してください。

Package      Version
------------ ---------
certifi      2021.10.8
pip          21.2.4
selenium     3.141.0
setuptools   58.0.4
urllib3      1.26.8
wheel        0.37.1
wincertstore 0.2

 

 

 

Chromedriverをダウンロードする

  1. Chromeを開き、[設定>Chrome]で自分の環境のChromeのバージョンを確認する。
  2. ChromeDriverのダウンロードページにアクセスし、上で調べたChromeのバージョンにあったファイルをダウンロードする。
    ※自分は、Windows 64bit版のファイルはなかったため、32bit版のものをダウンロードしました。

 

  1. ダウンロードしたZIPファイルを解凍する。(chromedriver.exeがあるはず。)

 

 

 

自動購入スクリプトを作成する

  1. 実行フォルダを作成する。(例: D:\src)
  2. 実行フォルダ上に前手順でダウンロードしたchromedriver.exeを移動する。
  3. 自動購入スクリプト用のPythonファイル(*.py)を作成する。(例: autoPurchaser.py)

 

  1. Pythonファイルに以下のサンプルコードをコピペする。

【自動購入スクリプトのサンプルコード】

#coding: utf-8

import time,os
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By

AMAZON_LOGIN_ID = '[AmazonアカウントのログインID]'
AMAZON_LOGIN_PASSWORD = '[Amazonアカウントのログインパスワード]'

AMAZON_TOP_URL = 'https://www.amazon.co.jp/'
ITEM_URL = 'https://www.amazon.co.jp/dp/B01BEPNPF6'


def logPrint(str):
    print("%s : %s"%(datetime.now().strftime("%Y/%m/%d %H:%M:%S"),str))

if __name__ == '__main__':

    logPrint("### START autoPurcaser ###")
    logPrint(webdriver.__version__)

    # ブラウザの起動
    logPrint("### Open Top Page ###")
    try:
        options = webdriver.ChromeOptions()
        options.add_experimental_option('excludeSwitches', ['enable-logging'])
        browser = webdriver.Chrome(os.path.dirname(__file__)+'/chromedriver.exe', options=options)
        browser.get(AMAZON_TOP_URL)
        time.sleep(1)
    except Exception as e:
        logPrint('Failed to open browser.')
        logPrint(e)
        exit()

    # ログイン
    logPrint("### Login ###")
    try:
        # ログインが必要かチェック
        if len(browser.find_elements(By.ID, 'nav-greeting-name')) > 0:
            logPrint("Already logged in.")
        else:
            logPrint("ID:{0}, num:{1}".format("nav-link-accountList", len(browser.find_elements(By.ID, 'nav-link-accountList'))))
            browser.find_element(By.ID, 'nav-link-accountList').click()
            time.sleep(1)
            logPrint("ID:{0}, num:{1}".format("ap_email", len(browser.find_elements(By.ID, 'ap_email'))))
            browser.find_element(By.ID, 'ap_email').send_keys(AMAZON_LOGIN_ID)
            logPrint("ID:{0}, num:{1}".format("continue", len(browser.find_elements(By.ID, 'continue'))))
            browser.find_element(By.ID, 'continue').click()
            time.sleep(1)
            logPrint("ID:{0}, num:{1}".format("ap_password", len(browser.find_elements(By.ID, 'ap_password'))))
            browser.find_element(By.ID, 'ap_password').send_keys(AMAZON_LOGIN_PASSWORD)
            logPrint("ID:{0}, num:{1}".format("signInSubmit", len(browser.find_elements(By.ID, 'signInSubmit'))))
            browser.find_element(By.ID, 'signInSubmit').click()
            time.sleep(1)

            # 「携帯電話番号を追加する」が表示された場合、「後で」をクリック
            if len(browser.find_elements(By.ID, 'auth-account-fixup-phone-form')) > 0:
                browser.find_element(By.ID, 'ap-account-fixup-phone-skip-link').click()
                time.sleep(1)
            
            logPrint("Logged in now.")
    except Exception as e:
        logPrint('Failed to login.')
        logPrint(e)
        exit()

    # 購入する商品のページにアクセス
    logPrint("### Open Item Page ###")
    try:
        browser.get(ITEM_URL)
        time.sleep(1)
    except Exception as e:
        logPrint('Failed to open ITEM_URL.')
        logPrint(e)
        exit()

    # 商品のチェック
    #### 必要あれば、購入元のチェックや値段などの商品チェックを入れる #####

    # カートに追加
    logPrint("### Add To Cart ###")
    try:
        logPrint("ID:{0}, num:{1}".format("add-to-cart-button", len(browser.find_elements(By.ID, 'add-to-cart-button'))))
        browser.find_element(By.ID, 'add-to-cart-button').submit()
        time.sleep(1)
    except Exception as e:
        logPrint('Failed to add To Cart.')
        logPrint(e)
        exit()
    
    # レジに進む
    logPrint("### Proceed To Cashier ###")
    try:
        browser.get('https://www.amazon.co.jp/gp/cart/view.html/ref=nav_cart')
        logPrint("ID:{0}, num:{1}".format("sc-buy-box-ptc-button", len(browser.find_elements(By.ID, 'sc-buy-box-ptc-button'))))
        browser.find_element(By.ID, 'sc-buy-box-ptc-button').click()
        time.sleep(1)
    except Exception as e:
        logPrint('Failed to proceed to cashier.')
        logPrint(e)
        exit()

    # パスワードを聞かれたら、再度パスワードを設定
    try:
        # ログインが必要かチェック
        if len(browser.find_elements(By.ID, 'auth-alert-window')) > 0:
            logPrint("Logged in again")
            logPrint("ID:{0}, num:{1}".format("ap_password", len(browser.find_elements(By.ID, 'ap_password'))))
            browser.find_element(By.ID, 'ap_password').send_keys(AMAZON_LOGIN_PASSWORD)
            logPrint("ID:{0}, num:{1}".format("signInSubmit", len(browser.find_elements(By.ID, 'signInSubmit'))))
            browser.find_element(By.ID, 'signInSubmit').click()
            time.sleep(1)
    except Exception as e:
        logPrint('Failed to login.')
        logPrint(e)
        exit()

    '''
    # 購入内容の確認
    logPrint("### Confirm Payment ###")
    try:
        logPrint("ID:{0}, num:{1}".format("bottomSubmitOrderButtonId", len(browser.find_elements(By.ID, 'bottomSubmitOrderButtonId'))))
        browser.find_element(By.ID, 'bottomSubmitOrderButtonId').click()
        time.sleep(1)
    except Exception as e:
        logPrint('Failed to confirm payment.')
        logPrint(e)
        exit()
    '''

    # ブラウザを閉じる
    logPrint("### Close Browser ###")
    try:
        browser.close()
    except Exception as e:
        logPrint('Failed to close browser.')
        logPrint(e)
        exit()  

    logPrint("### FINISH autoPurcaser ###")
  • [AmazonアカウントのログインID][Amazonアカウントのログインパスワード]はご自分のAmazonアカウントのモノを記入してください。
  • ITEM_URL[Amazon限定ブランド] キリン LAKURASHI アルカリイオンの水 PET (2L×9本)を選択しています。もし他の商品に変更する場合は、プログラムを修正する必要があるかもしれません。事前に動作するか確認してください。
  • 購入内容の確認の部分はあえて無効化しています。そのため、このプログラムを実行しても商品がカートに追加されるだけで、購入まで至りません。この部分は動作確認が完了したら有効化します。

 

 

 

自動購入スクリプトの動作を確認する

上でも記載しましたが、サンプルコードを実行しても商品がカートに追加されるのみで、購入に至りません。動作に問題ないことが確認できたら、サンプルコードの購入内容の確認の部分を有効化します。

手順を以下に記載します。

  1. Anaconda Promptを起動して、仮想環境をアクティベートする。
  2. 以下のコマンドで自動購入スクリプトを実行する。
(仮想環境) >python [自動購入スクリプト]

(例:)
(仮想環境) >python D:\src\autoPurchaser.py

 

  1. Chromeが自動で開き、Amazonにアクセス⇒商品がカートに追加される。

その過程で、Anaconda Promptに以下のログが表示されるはずです。

2022/01/30 02:39:36 : ### START autoPurcaser ###
2022/01/30 02:39:36 : 3.14.1
2022/01/30 02:39:36 : ### Open Top Page ###
2022/01/30 02:39:41 : ### Login ###
2022/01/30 02:39:41 : ID:nav-link-accountList, num:1
2022/01/30 02:39:43 : ID:ap_email, num:1
2022/01/30 02:39:43 : ID:continue, num:2
2022/01/30 02:39:45 : ID:ap_password, num:1
2022/01/30 02:39:45 : ID:signInSubmit, num:1
2022/01/30 02:39:52 : Logged in now.
2022/01/30 02:39:52 : ### Open Item Page ###
2022/01/30 02:39:56 : ### Add To Cart ###
2022/01/30 02:39:56 : ID:add-to-cart-button, num:1
2022/01/30 02:39:59 : ### Proceed To Cashier ###
2022/01/30 02:40:03 : ID:sc-buy-box-ptc-button, num:1
2022/01/30 02:40:06 : ### Close Browser ###
2022/01/30 02:40:10 : ### FINISH autoPurcaser ###

 

  1. Amazonアカウントにアクセスして、カートに商品が追加されていることを確認する。

 

 

もしうまくいかなかったら

以下についてご確認ください。

Chromeが立ち上がらない場合は、、、

  • ChromeのバージョンとChromeDriverのバージョンがあっているか。
  • Python,SeleniumのバージョンがPython 3.7、Selenium 3.141.0になっているか。
  • 仮想環境がアクティベートされいるか。
  • Pythonの実行をWindows Defenderでブロックしていないか。

 

Chromeが立ち上がるのに、カートに追加されない場合は、、、

  • ID:xxx, num:xxxのnumの数が1以上あるか。
    ※サイト内の入力箇所やボタンなどをIDで検索しているのですが、numが0の場合は、それが見つかっていないということです。商品ページにアクセスして、F12ボタンでHTMLを確認してそのIDが有効かどうか確認してください。
  • 自動購入スクリプトの事前準備を実施したか。
  • ログイン部分で失敗している場合、アマゾンIDとパスワードが間違っていないか。
  • ログイン部分で失敗している場合、パスワード以外に文字列を聞かれていないか。
    ⇒この場合は、一度手動でログインすることで改善するかもしれません。詳しくは「自動購入スクリプトの課題」を参照ください。
  • 商品URLが有効なものか。

 

 

 

購入処理部分を有効化する

自動購入スクリプトが問題ないことを確認したら、サンプルコートの購入内容の確認の部分を有効化します。
有効化は、購入内容の確認の処理の前後に入っている'''を削除すればよいです。

 

!!注意!!
自動購入スクリプト
のサンプルコードはカート内のものをまとめて注文してしまうため、他の商品がカートに入っていた場合、一緒に注文してしまいます。ご注意ください。

 

 

 

自動購入スクリプトの課題

Amazonアカウントに何度もログインしているとパスワード以外にも、文字列を聞かれることがある。
この文字列はSeleniumで読み取ることができないため、これが出たら手動で一度ログインするしかないです。

 

 

 

さいごに

「ESP32でAmazon自動注文ボタン」に向けて、AWS Lambdaで実行する自動購入スクリプトのベースをローカル環境で作成しました。
引き続き、「ESP32でAmazon自動注文ボタン」の作成手順をまとめています。

前の手順

【ESP32でAmazon自動注文ボタン】自作ボタンをクリックしたら、Lambda関数が実行されるようにする
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンをクリックしたら、Lambda関数が実行する手順をまとめました。

 

次の手順

【ESP32でAmazon自動注文ボタン】Lambda関数で自動注文スクリプトの準備する
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はLambda関数で自動購入スクリプトの準備する手順をまとめました。

 

手順全体や関連情報まとめ

 

 

 

参考情報

 

以上!

コメント

タイトルとURLをコピーしました