プログラミング やってみた

おいさんとRFA 入荷を検出してみた

こんにちは。バッヂーです。

先日、Twitterの情報を参考にしながらAmazonで「リングフィットアドベンチャー」を購入した経緯を書きました。

おいさんとリングフィットアドベンチャー

こんにちは。バッヂーです。 先日Switchの「あつまれどうぶつの森」同梱版をMy Nintendo Storeの抽選販売で購入しました。せっかく本体が手に入ったのでいろいろ見ておりますと、「リングフ ...

続きを見る

その際に「バーチャルダッシュボタン」を登録しておいたのですが、今回はそのボタンを使って、

  • 定価販売になった(=Amazonに入荷した)ことを検出する
  • ボタンを使って手動で購入してみる

ことを試してみました。

Amazonの入荷を検出し、定価で購入できました

まずは結果から。以下のことができました。

  • 定価販売を検出するプログラムをPython + Selenium + Chromedriver で作成し、定価販売を検出する。
  • 手動で「バーチャルダッシュボタン」を使って、実際に購入してみた。10回程度のリトライで購入できた。
  • 購入が確認できたので、キャンセルした。

事前に想定したとおりに購入できました。

RFA通常版を購入できた

※クリックすると大きな画像が表示されます

すでに所有していますし、周りに欲しい人もいないのですぐにキャンセルしました。

RFAをキャンセル

※クリックすると大きな画像が表示されます

今回試した方法など

今回試した方法などを説明します。

バーチャルダッシュボタンの挙動

と、その前に。今回はバーチャルダッシュボタンの操作がキモですので、まずはその挙動を確認しておきます。

バーチャルダッシュの挙動

上の図が前回作成したバーチャルダッシュボタンです。「任天堂RFA」は私がつけたラベルです。ラベルはボタンを作成した後自由につくれます。

ボタンの「注文に進む」の部分をクリックすると、「価格」と「確定する」が表示されます。上の図の価格は11,890円という転売価格が表示されてますね。この状態でもう一度クリックすると購入確定となります。たった2クリックで素早く購入できます。
価格が表示されている状態でクリックせずに放置すると、約5秒後くらいにもとの状態に戻ります

つまり。

  • クリックしてみて価格が税込み「¥8,778」だとAmazonに定価販売の在庫がある。
  • それ以外の値段なら定価販売の在庫がないので、しばらく放置してまたクリックしてみる。

ということを繰り返し行えば定価販売の検出ができるということです。

チェックする仕組みを作成する

上記のように、「一定時間ごとにバーチャルダッシュボタンをクリックして価格をチェックする」のはもちろん人力でも可能です。しかし、「いつ入荷するか」「ほんとうに入荷するか」わからないものにクリックし続けるのは「たいぎぃ(=おっくう)」です。

そんなわけでその仕組をプログラムで作ります。具体的には、

  • Python + Selenium + Chromedriver

でブラウザ操作をシミュレートして入荷をチェックします。以下、作成したスクリプトです。


import datetime
import time
from pygame import mixer #←音を鳴らすために使用
from selenium import webdriver as wd
import re

def main():
    virtual_dash_url = r"https://www.amazon.co.jp/ddb/your-dash-buttons?ref_=nav_AccountFlyout_snk_ddb_ydb"
    options = wd.ChromeOptions() #←ここらへんのオプションはおまじないのように毎度コピペしてます
    # options.add_argument('--headless') #←画面を表示させて様子を観察するため
    options.add_argument('--no-sandbox')
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--disable-dev-shm-usage')
    brs = wd.Chrome(options=options)
    brs.set_window_size(1024, 768)
    brs.implicitly_wait(10)
    brs.set_page_load_timeout(10)

    # ブラウザを開く
    brs.get(virtual_dash_url)
    time.sleep(3)

    # ログイン処理
    # Eメール
    el = brs.find_element_by_id("ap_email")
    el.send_keys("■■■■■■■■■■■■■") #←自分のメールアドレス
    # パスワード
    el = brs.find_element_by_id("ap_password")
    el.send_keys("■■■■■■■■■■■■■") #←ログインパスワード
    # ログインボタンクリック
    el = brs.find_element_by_id("signInSubmit")
    el.click()
    time.sleep(5)

    # ここからループ。
    while True:
        # 任天堂RFAのボタンの処理
        # ボタンを見つけてクリックする ※あらかじめボタンを「先頭」に並べておく。
        el = brs.find_element_by_xpath(
            r'//*[@id="a-page"]/div[2]/div[13]/div[2]/div/div[1]/span/div/form/div[1]/div[1]/div/div/button')
        el.click()
        time.sleep(1)

        # 価格を取得する
        el_inner_span = brs.find_element_by_class_name("digital-dash-button-item-price")
        dt_now = datetime.datetime.now()
        msg = "日時:%s 価格は %s" % (dt_now, el_inner_span.text)
        # 価格の判定
        price_match = re.match(r'¥8,778', el_inner_span.text)
        if price_match is not None:
            # メッセージに追加
            msg += " ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆"
            # ついでに音をならす
            mixer.init()
            mixer.music.load(r"■■■■■■■■.mp3") #←フリー素材などから好きなmp3ファイルをどうぞ。
            mixer.music.play(1)
        print(msg)
        # 30秒ウェイト
        time.sleep(30)

    brs.close()


if __name__ == '__main__':
    main()

バーチャルダッシュボタンをだいたい30秒に一度クリックして、そのときに表示された価格が定価税込みの「¥8,778」かどうかをチェックしています。検出すると音が鳴るようにしました。
ループ内に脱出条件を書いてないので、プログラムを止めるときは手動で止める必要があります。

その他の準備

↑にも書きましたが、バーチャルダッシュボタンを並べ替えて先頭(左上)に表示させるようにしました。

バーチャルダッシュボタンの並び替え

※クリックすると大きな画像が表示されます

プログラムの中でバーチャルダッシュボタンをクリックする要素を見つけるために「.find_element_by_xpath()」を使用していますので、先頭固定です。

プログラムで定価入荷を検出したあとは、別ウィンドウのブラウザで「手動でバーチャルダッシュボタンをクリック」して購入チャレンジです。あくまでも主目的は「入荷の検出」なので、自動での購入はせずに手動での試行です。

当日の流れ

以上の準備を終えて、当日の流れです。

まず10/6の9:00頃、プログラムを起動しました。別ウィンドウでも手動で確認し、プログラムが正常に価格を取得していることを確かめました。

あわせて観察していたTwitterの「リングフィットアドベンチャー入荷速報」では、9:05に入荷情報のツイートがながれました。この時バーチャルダッシュボタンの表示は転売価格。入荷速報ではまた別のURLを監視しているようですので、在庫に反映するタイミングが違うみたいですね。

プログラムが定価販売を検出したのは9:10。検出時に設定したフリー素材のドアチャイム音が流れます。……30秒置きに。オンライン会議があればヤバイところでした。

別ウィンドウのブラウザでバーチャルダッシュボタンをクリックして購入を試してみます。案の定、こんな表示です。

Amazonで買えないときの画面

※クリックすると大きな画像が表示されます

このときリロードなどすれば購入できる確率が高くなるみたいです。購入は別にできなくても良いので、もう一度バーチャルダッシュボタンの画面に戻って、手動で購入処理を行います。

リトライすること10回程度だったと思います。ひょいっと処理が進んで、本稿の最初の画像のように購入できました。
購入画面を確認できたのでキャンセルしておきました。画像のタイムスタンプから、だいたい9:15頃に購入できたと思います。

プログラムは定価検出を続け(ピンポン音も)、9:20の23秒を最後に転売価格に戻りました。一応表示をあげておきます。

日時:2020-10-06 09:09:30.213158 価格は ¥12,000
日時:2020-10-06 09:10:01.271876 価格は ¥12,000
日時:2020-10-06 09:10:32.332242 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:11:04.537934 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:11:35.603960 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:12:06.674764 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:12:37.740568 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:13:08.802268 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:13:39.867098 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:14:10.929423 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:14:42.008008 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:15:13.075748 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:15:44.155870 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:16:15.222489 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:16:46.299246 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:17:17.362437 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:17:48.430200 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:18:19.490744 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:18:50.574999 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:19:21.665327 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:19:52.727141 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:20:23.815620 価格は ¥8,778 ★☆★☆★☆★☆★☆ 定価販売 検出です! ★☆★☆★☆★☆★☆
日時:2020-10-06 09:20:54.876383 価格は ¥12,000
日時:2020-10-06 09:21:25.944307 価格は ¥12,000

 

これを見ると約10分ほど定価販売がされていたようですね。思っていたより「瞬殺」というわけではないんですね。

まとめと注意点

以上のことより、次のことが言えるのではないでしょうか。

  • バーチャルダッシュボタンは入荷のチェックにも使える。
  • バーチャルダッシュボタンは購入できる確率もあがるし、購入もスムーズに行える。
  • Twitterの「リングフィットアドベンチャー入荷速報」のツイートは超有効。ツイートが流れたら15分くらいは購入に集中する
  • 今回は入荷してから10分ほど購入の機会があった。

「手動でバーチャルダッシュボタンクリックからの購入」をしているときに私が困ったことがあります。それは「毎度パスワードを入力しなければならなかった」ことです。
これはプログラム側でログインしていたからなんでしょうかね? アカウント情報を保存しようとしても毎度入力する必要がありました。そのせいで、正直バーチャルダッシュボタンで買えないかと思いました。
それだけ手間取ったにもかかわらず購入できたということは、タイミングさえ合えば手動で十分購入できる可能性がある、ということではないでしょうか。

最後に定価販売のスクリーンショットをとった画面を掲載しておきます。

定価販売状態の画面

※クリックすると大きな画像が表示されます

ファイルのタイムスタンプは9:15頃。赤枠のところをみると、251個在庫があるようです。これは定価販売分の在庫なんでしょうか? そうであれば結構入荷しているんですね。

いまだ購入されていない人の参考になれば幸いです。はやく常時定価販売になればいいですね。

-プログラミング, やってみた
-, , , ,

© 2024 BUDGIE WORKs