世の中の一部の世界において、任天堂スイッチ戦争が勃発しているらしい。
外出自粛、入荷数の減少に伴い、需要が供給を大幅に上回った上、転売屋による買い占めが起こり供給が更に少なくなっている模様。
特にAmazonでは一気に出さずに少しづつ在庫を登録するという、いつ入荷があるかわからない状態らしい。
そんないつ入るかわからないものに、ツイッターでは一日中リロードして張り付いてて「カートは出るんだけど買えない涙」と嘆く者続出。
もう、Switchを買うことより参戦している自分に酔っているようにも見える。
こういう時こそ人力ではなくプログラムに頼るべきだと思うのは自分だけだろうか。
1.AutoIt + WebDriverを使って自動で購入
xpathなどで読み込んだhtmlの要素を取得し、クリックするなど、HTMLが変わらない限り正確にコントロールできる方法。下記な感じで出来る。
1.1 メリットとデメリット
1.1.1 メリット
- webdriver経由でコントロールするので、他の作業をやっても問題ない
もう一台PCを用意する必要がない - 画像認識ではないので、認識用画像を用意する必要がない
- webdriver経由だから正確
画像認識もほぼ正確だが、対象が見えていないと駄目
1.1.2 デメリット
- ページ読み込み終わるまで待つ必要がある
Nintendo Switch戦争など、ネットで誰よりも早く購入する必要がある時はかなり辛い - 何故かページ読み込みが遅い
楽天で試すと、ページの読み込みが遅い。レスポンス返ってくるのに時間がかかる。
ひょっとするとwebdriver変数を見ているのかもしれない
1.2 コーディング流れ
ここでは答えは書きません。大まかな流れを。基本Whileでループさせ、ボタンがなければContinueLoopでページリフレッシュ。
- WebDriver UDF経由でchrome起動
- 商品ページを_WD_Navigate($sess, $url)で表示
_WD_LoadWait($sess) - While 1 ;ループ
- ;; リフレッシュ
_WD_Action($sess, “refresh”) ;_WD_LoadWait($sess) - ; リフレッシュしたので、カート、買い物かごなどターゲットを探す
$xpath = “//button[@name=’buttonname’]”
$elm = _WD_FindElement($sess, “xpath”, $xpath)
If @error Then
Sleep(20000) ;ちょっとまって
ContinueLoop ; ボタンがないので販売前。3に戻りリフレッシュに入る
EndIf - ; ボタンがあったのでクリック
_WD_ElementAction($sess, $elm, “click”)
_WD_LoadWait($sess) - 次のページでも同じようにボタンのxpathを探してあればクリック
という段取り
xpathを、開発者モードで見ながらですね。

2. AutoIt + 画像認識+ショートカットで高速に自動購入
webdriver利用が遅い場合は、画像認識+ショートカットで。この方法だと基本的に画面に見えている(人の目で見える)必要がある。
2.1 メリットとデメリット
2.1.1 メリット
- 高速
リロード中とかでも、画面にターゲットの画像が見えていれば認識する
2.1.2 デメリット
- 画面がフロントにないと駄目
ターゲット画像とスクリーンショットを比べて認識させるので、基本フロント
キーやマウス操作もある - 画像認識対象画像をあらかじめ用意する必要あり
カラープロファイルなどにより、違うPCにそのまま持っていっても使えない場合がある
imageSearch UDFだとカラーまで完全マッチングなので、スクリプト走らせるPCで再度画像を作る(スクショ)必要がある
2.2 コーディング流れ
WebDriverと基本同じです。
違うのは要素を探す(_WD_FineElement())のが画像認識に置き換わり、クリックはMouseClick(“left”, x,y)となるくらいです。
- スクリプトを走らせる
ブラウザをカレントにするなど準備したいなら
Sleep(20000)とか入れて、その間にログイン必要ならしておくなど - While 1 ; 繰り返し
- ;リフレッシュ
Send(“^r”) ; ^はCtrlなのでCtrl+rはページリフレッシュの意味
Sleep(500) - ;カート、買い物かごなどターゲットを画像認識
関数作成:見つかるまで500msec毎に20回(10秒)画像認識させる
Func findimage($filepath)
$cnt = 0
while 1
$ret = imagesearch($filepath,$x,$y..) OpenCVかimageSearchかによって違う
If $ret Then Return true EndIf
$cnt += 1
If $cnt >= 20 Then return false
WEnd
EndFunc - あればGlobal $x,$yにマウス座標があるので
MouseClick(“left”, $x,$y) - 次の画像をfindimage()で持っていく
という段取り
完全に人間の行動をコピーする。
PCの画面を見て、ボタンが出たと画像認識し、そのボタンをクリック。
出るまで人間はある一定の間隔で画像認識している(Sleep()入れてfindimage())
というのをコーディングしていくだけ。
ターゲット画像は、ボタン内側(赤枠)くらいでやるのがいいと思う。

3. UIAutomationを使う
まだ試していません。今後の為したらアップします。
HTMLのinputやbuttonタグなどは、オブジェクトとして認識できたはずなので、ブラウザ内の要素もUIAutomationで取得できると思います。
これとAutoIt->Send()、MouseClick()などを組み合わせれば画像認識と同じくらい高速に出来そうですね。
4. 自動化作成して任天堂Switch争奪戦争に勝てたのか?
某サイトのを作成したんですが、入荷していないのでまだ結果はわかりません。
ちなみに、転売する気はサラサラなく自分用です。
転売ヤー自体嫌いなので、転売するための自動化ではないです。
あと、ページリフレッシュはサーバに負荷がかかるので短期間でリフレッシュしまくると怒られるのでやめたほうが良いですね。
コメント