Rakutenブックスで商品を定期監視し自動購入するプログラムを書いてみた

免責事項

本記事に記載する内容は執筆時点のもので、将来にわたって動作を保証するものではありません。RakutenやChrome/Seleniumなどは頻繁に仕様変更があるため時間とともに仕様が変わり記載された内容では動作しなくなる可能性があります。
また本記事は自動化に関する技術を紹介するものであって、購読者の商品購入を保証するものではありません。

プログラム概要

今回作るのは特定の商品をRakutenブックス上で特定の商品の価格を監視し希望の価格を下回った時に自動購入するプログラムを紹介します。動画はNintendo Switch Liteの自動購入ですが、Playstation5も原理は同じです。
まずは下記の動画をご覧ください。


準備するもの

1) Ubuntuデスクトップ環境 + Python3環境
今回はブラウザ画面を表示しながら操作するのでブラウザを表示するためのデスクトップ環境を用意します。Seleniumをheadlessで動作させることもでき、その場合はデスクトップ環境でなく、コマンドライン環境でも動作させることができます。(headlessオプションに関してはソースコードの中に記載しておきます)

2) Selenium + Chrome + Chrome Driver
詳細は後述します。

Selenium・Chromeの準備

1) Python用Seleniumモジュールのインストール

pip3 install selenium

2) Chromeのインストール
Ubuntu用のChromeは下記でインストールできます。

RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb; apt-get -fy install 

3) Selenium Chrome Driverのダウンロード
Selenium用のChrome Driverはこちらからダウンロードできます。UbuntuにインストールされているChromeの版数と同じ版数のChrome Driverをダウンロードしてください。ダウンロードしたChrome Driverはこれから作成するプログラムと同じフォルダにおいてください。(別のフォルダに置いた場合は、プログラム内のChrome Driverへのパスを書き換えてください)

商品ID

目当ての商品を監視するためにRakuten Booksで使用されている商品IDを準備する必要があります。これはAmazonのASINのようなもので、JANコードなどとは異なり、Rakuten Booksでのみ使用されているIDのようです。
このIDはURLの中に埋め込まれているので、URLを確認することで取得できます。
https://books.rakuten.co.jp/rb/16462859/?bkts=1&l-id=search-c-item-text-02
/rb/の直後に来ている8桁の数字が商品IDになります。

ソースコード

前半・後半にソースコードを分けていますが前半後半を1つのファイルに記載してください。

from selenium import webdriver
import time

URL_BASE = 'https://books.rakuten.co.jp/rb/{asin}/?bkts=1&l-id=search-c-item-text-01'

ITEM_LIST = [
   ["16462859", 54978],  #ps5    ["16462860", 43978], $ps5 digital edition
   #["16033028", 30000], #switch
   #["16033027", 30000], #switch
   #["16039046", 21978], #switch lite
   ]

def _main():
   driver = open_chrome()
   for item in ITEM_LIST:
       price = check_item(driver, item)
       if price != "" and int(price) <= item[1]:
           proceed_checkout(driver)
       time.sleep(5)

def open_chrome():
   options = webdriver.ChromeOptions()
   #options.add_argument('--headless') #この行を有効化するとheadlessにできます。
   options.add_argument("user-data-dir=cookies") 
   options.add_experimental_option("excludeSwitches", ['enable-automation'])

   driver_path = './chromedriver'
   driver = webdriver.Chrome(driver_path, options=options)
   width=0
   height=0
   driver.set_window_position(height, width)
   driver.set_window_size(1280, 1000)

   return driver

def check_item(driver, item):
   price = ""
   url = URL_BASE.format(asin=item[0])
   driver.get(url)
   time.sleep(5)
   
   classname = "status"
   try:
       element = driver.find_element_by_class_name(classname)
   except:
       return price
   status = element.text
   if "ご注文できない商品" in status:
       return price
   else:
       price = get_price(driver)
       return price

def proceed_checkout(driver):
   driver = add_to_cart(driver)
   time.sleep(5)
   driver = goto_checkout(driver)
   time.sleep(5)
   driver = input_id(driver)    
   time.sleep(5)
   driver = input_passwd(driver)
   time.sleep(5)
   print("place order")
   place_order(driver)
   time.sleep(30)

ここから先は

3,423字

¥ 1,980

この記事が気に入ったらサポートをしてみませんか?