Amazonで自動的にSwitchを買ってくれるプログラムを書いたよ
皆さんはNintendo Switchは買えましたか?この記事を書いている2017年8月現在においてSwitchは超絶品薄状態です。オンラインショップで在庫が復活して5分ともたずに品切れになってしまいます。そこで今回は販売ページを監視して自動的にSwitchを購入してくれるプログラムを書いたのでここに載せておきます。今回もSleniumとPythonで書いたので、もし掲載しているプログラムを実行したいなんていう奇特な方がいらっしゃったらSeleniumの実行環境を用意してください。
一応、免責を書いておきます。本記事を参考にして発生したいかなる損害も自分は補償しかねますのでその点に合意いただける方だけご覧ください。もしかしたらアカウント停止とか変なものを買っちゃったりするかもしれないので、もしプログラムを実行する場合はご自身でコードを確認してからにしてください。
OS : Ubuntu 16.04 LTS
Python : 3.5.2
Selenium : 2.53.6
Contents
1. プログラムの概要
さて、まずは今回掲載するプログラムの概要的なものを書いておきます。実際にはそんなに長いプログラムでは無いので、説明を読むより実際にコードを見た方が早い気もします……。
本プログラムを実行するにはSelenium(Chrome)をPython3.x系で実行する環境を必要としています。もし環境が異なる場合はコードないの該当部分をご自身で書き換えてください。また、環境が整っていなければ本サイトの以前の記事なんかを参考にしてください。
今回のプログラムは、ブラウザの起動(Chrome)→Amazonの商品ページにアクセス(1分毎)→在庫の確認(出品元の確認)→(目的の在庫があれば)カートに入れて決算ページへ移動→ログイン→購入確定という流れを自動的に行うプログラムです。おまけとして出品元を制限するのと購入する最大金額を設定する機能をつけておきました。これにより転売ヤー
さんから購入するのを防ぐことができます。しかし、住所やクレカなどのアカウント情報を登録する機能はないため、それはあらかじめ手動で登録しておいてください。2. 今回書いたプログラム
さて、いよいよ本記事のメインである自動購入プログラムのコードを掲載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#coding: utf-8 import time from datetime import datetime from selenium import webdriver LOGIN_ID = '[メールアドレス]' LOGIN_PASSWORD = '[パスワード]' ITEM_URL = 'https://www.amazon.co.jp/dp/B01N5QLLT3?ref=emc_b_5_i&th=1' # Nintendo Switch Joy-Con (L) / (R) グレー # ITEM_URL = 'https://www.amazon.co.jp/dp/B01NCXFWIZ?ref=emc_b_5_i&th=1' # Nintendo Switch Joy-Con (L) ネオンブルー/ (R) ネオンレッド ACCEPT_SHOP = 'Amazon' LIMIT_VALUE = 33500 def l(str): print("%s : %s"%(datetime.now().strftime("%Y/%m/%d %H:%M:%S"),str)) if __name__ == '__main__': # ブラウザの起動 try: b = webdriver.Chrome('./chromedriver') b.get(ITEM_URL) except: l('Failed to open browser.') exit() while True: # 在庫確認 while True: try: # 販売元確認 shop = b.find_element_by_id('merchant-info').text shop = shop.split('が販売')[0].split('この商品は、')[1] if ACCEPT_SHOP not in shop: raise Exception("not Amazon.") # カードに入れる b.find_element_by_id('add-to-cart-button').click() break except: time.sleep(60) b.refresh() # 購入手続き b.get('https://www.amazon.co.jp/gp/cart/view.html/ref=nav_cart') b.find_element_by_name('proceedToCheckout').click() # ログイン try: b.find_element_by_id('ap_email').send_keys(LOGIN_ID) b.find_element_by_id('ap_password').send_keys(LOGIN_PASSWORD) b.find_element_by_id('signInSubmit').click() except: l('LOGIN PASS.') pass # 値段の確認 p = b.find_element_by_css_selector('td.grand-total-price').text if int(p.split(' ')[1].replace(',', '')) > LIMIT_VALUE: l('PLICE IS TOO LARGE.') continue # 注文の確定 b.find_element_by_name('placeYourOrder1').click() break l('ALL DONE.') |
難しい処理は一切おこなっていないので、コードの詳しい説明は省きます。ただこのコードを使用する際はAmazonへのログイン情報として、”LOGIN_ID”と”LOGIN_PASSWORD”の変数にご自身のログイン情報を入力してください。また、今回はNintendo Switchを購入するためのプログラムといて書いたので”ITEM_URL”にはSwitchの商品ページのURLを記述していますが、このURLを書き換えれば他の商品の監視も行うことができると思います。あとは変な出品者から買わないために、許可する店舗名を指定する”ACCEPT_SHOP”と購入金額の最大値を指定する”LIMIT_VALUE”をご自身の買いたいものに合わせて書き換えてください。
今回はコードをシンプルにするために、スマートじゃない手順がとられています(特に値段をチェックするところなんて購入確定の寸前だし……)。それを踏まえた上で参考にしてください。
おわりに
というわけで、性懲りも無く今回もSeleniumでのブラウザ操作でした。本サイトのコードを掲載している記事は将来の自分や初学者の方向けにプログラムのサンプルになればいいなというモチベーションで書いています。しかし、今回はそれだけではなく、Switchの自動購入というトレンディそうなものを題材にすることで、あわよくばバズらないかなと期待しちゃっています。おそらくバズることはありませんが、今後もクソコードを投下しまくるのでよろしくお願いします。
ちなみに、自分は運よくスプラトゥーン2同梱版を手動で予約できたので、このプログラムでは購入していません。そのため、おそらくは正しく動くとは思いますが、最後の購入ボタンを押すところは未検証です。正直、TwitterのBotやら各ECサイトのアラートを設定して自分で操作する方が確実な気もします。
結論。運次第。
追記 2017/09/09
コメントありがとうございます。ご指摘の通りにコードを一部書き直しました。
ディスカッション
コメント一覧
python初心者です。
大変参考になりました。
実際に安い商品で試してみたのですが、
総支払額のカンマを消すための
62行目.replace(‘,’)
は
.replace(‘,’,”)
にすると購入まで動きました!
はじめまして、python始めたばっかりです。
素人的質問かもしれませんが、同じくAMAZONにて品薄商品のお酒を購入したいと思っています。
AMAZONでお酒を購入する場合、注文確定ボタンのページにて
お客様の年齢確認をさせていただいております。
「20歳未満のお客様の酒類の購入や飲酒は日本の法律により固く禁じられています。お客様が20歳以上の場合は、このチェックボックスをクリックしてから注文を確定してください。」
の項目があり、チェックをする必要があります、その場合どのようなコードを記載したら
よいのでしょうか?
また、プログラムを走らせると常にアカウントを入力してログインをする状況となりますが
ログインしっぱなしの状況から走らせることは可能なのでしょうか?
最後に、監視(リロード)する時間の設定はどのコードでしょうか?
ご質問だらけで申し訳ありません。可能であればご教示いただければと存じます。
すみません、先ほどコメントさせていただいたものです。
ご質問させていただきました部分、2点は自己解決致しましたので、ご報告させていただきます。
Q1:監視時間の設定→ except:
time.sleep(ここですね)
b.refresh()
Q2:年齢制限のチェックボックス→ input = b.find_element_by_id(‘wineNoticeCheckbox’)
input.click()
こちらで解決しました。
引き続き在庫争奪戦の商品において、監視段階では未ログインとなっている状況の中
在庫をカートに入れられても、ログイン操作が実施されると、その間に在庫がなくなり買えない
状況が続きます。
ログインした状態で監視できる術はございますでしょうか?
ご教示いただけると幸いです。