Amazon自動注文ボタンをESP32で作ろうとしています。
前回の記事では[ボタンをクリック ⇒ AWS IoT Core ⇒ AWS Lambndaの実行]の流れの確認ができたので、今回はAWS Lambdaで実行する自動購入スクリプトを作成します。
目次
はじめに
本記事は「ESP32でAmazon自動注文ボタン」の作成手順をまとめた連載記事の1つです。
前の手順
次の手順
手順全体や関連情報まとめ
自動購入スクリプトの事前準備
自動購入スクリプトを実行するために、以下の事前準備をしてください。
- Amazonのアカウントの開設
- 届け先やクレジットカードの登録
Pythonを実行できる仮想環境を構築する
自動購入スクリプトはPython 3.7とSelenium 3.141.0を使います。
Windows PCにそのままインストールしても良いのですが、PythonとSeleniumは最新バージョンではないものを利用することになるので、ここではConda仮想環境を利用することにします。
以下にConda仮想環境を構築する手順を記載します。
- Anacondaをインストールする。
Anacondaのインストール方法は、以下のブログが分かりやすいのでご参考にしてください。
- Anaconda Promptを起動する。
- 以下のコマンドを実行することで、Conda仮想環境を生成する。
> conda create -n [仮想環境名] python=3.7
[仮想環境名]
は任意の名前を入れてください。(例: autoPurchaser)Python 3.7
は、AWS Lambdaでの実行を想定して指定しています。
- 以下のコマンドを実行することで、Conda仮想環境をアクティベートする。
> conda activate [仮想環境名]
[仮想環境名]
は前手順で指定したものを入れてください。(例: autoPurchaser)
仮想環境が有効になっていると、プロンプトが(仮想環境名) xxxxx>
のようになります。
- Pythonのバージョンを確認する。
念のため、以下のコマンドで指定した通りのPythonバージョンになっているか確認します。
(仮想環境) >python -V
Python 3.7.11
Seleniumをインストールする
自動購入スクリプトで使用するSeleniumをインストールします。
以下に手順を記載します。
- 前手順で作成した仮想環境をアクティベートする。
- 以下のコマンドで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をダウンロードする
- Chromeを開き、[設定>Chrome]で自分の環境のChromeのバージョンを確認する。
- ChromeDriverのダウンロードページにアクセスし、上で調べたChromeのバージョンにあったファイルをダウンロードする。
※自分は、Windows 64bit版のファイルはなかったため、32bit版のものをダウンロードしました。
- ダウンロードしたZIPファイルを解凍する。(chromedriver.exeがあるはず。)
自動購入スクリプトを作成する
- 実行フォルダを作成する。(例:
D:\src
) - 実行フォルダ上に前手順でダウンロードしたchromedriver.exeを移動する。
- 自動購入スクリプト用のPythonファイル(*.py)を作成する。(例: autoPurchaser.py)
- 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本)を選択しています。もし他の商品に変更する場合は、プログラムを修正する必要があるかもしれません。事前に動作するか確認してください。購入内容の確認
の部分はあえて無効化しています。そのため、このプログラムを実行しても商品がカートに追加されるだけで、購入まで至りません。この部分は動作確認が完了したら有効化します。
自動購入スクリプトの動作を確認する
上でも記載しましたが、サンプルコードを実行しても商品がカートに追加されるのみで、購入に至りません。動作に問題ないことが確認できたら、サンプルコードの購入内容の確認
の部分を有効化します。
手順を以下に記載します。
- Anaconda Promptを起動して、仮想環境をアクティベートする。
- 以下のコマンドで自動購入スクリプトを実行する。
(仮想環境) >python [自動購入スクリプト]
(例:)
(仮想環境) >python D:\src\autoPurchaser.py
- 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 ###
- 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自動注文ボタン」の作成手順をまとめています。
前の手順
次の手順
手順全体や関連情報まとめ
参考情報
- PythonとSeleniumとChromedriverでスクレイピング
- Amazonで自動的にSwitchを買ってくれるプログラムを書いたよ
- AWS IoT Button + AWS Lambdaを使ってAmazonから1Click(物理)で消耗品を買えるようにした
- SeleniumのAPIドキュメント
以上!
コメント