AutoItでnintendo Switchを購入するための自動化~その後~

AutoIT

以前、Nintendo Switch戦争に巻き込まれた・・の記事を書きました(だいぶ前)が、結果どうなったかというと。

無事購入出来て、あつ森プレイしています。

しかし、全部AuthItが購入までやってくれたかというと・・・
そんなことなく、在庫なし->在庫ありを検知した後は自分でカチカチしながらどうにか購入出来たところです。

スポンサーリンク

1.AutoItのスクリプト 楽天ブックス版

過去記事の、画像認識方法でやりました。(2章参照)

Chromeでターゲットとなるページを開いておき、AutoItスクリプトを実行。

  1. Ctrl+RでChromeページリロード
  2. 5秒間「買い物かご」画像を探しなければ10秒待って1に戻る
  3. あれば買い物かごをクリック
  4. 次のページで購入に進む・・・

という手順でした。
これの課題点の1つは、ターゲットとした商品しか見れないこと。
Nintendo Switchはグレー、ネオンの2種類と、liteも色が数種類あります。
仕入れによってはグレーだけだったり、ネオンだけだったり。
ターゲットをグレーにしていると、ネオン入荷しても見れないなど。

こういう場合は、Ctrl+TabでChromeのタブ切り替えがありますね。
これを、2番の買い物かごがなければ次のタブに移動して検索するようにすれば、他カラーも検索できるようになります。

Ctrl+Tabは、Send(“^{TAB}”); ですね。

1.1 スクリプト

ほぼ何も入れていないサブ機で走らせていたので、opencv使わずimagesearch使っています。
全部ではなく一部のみ掲載。買い物かごボタンがあれば次に進めると思います。

#Region
#AutoIt3Wrapper_UseX64=y
#EndRegion

#include "ImageSearch.au3"

Global $g_posx = 0
Global $g_posy = 0

Sleep(3000)
While 1
  Send("^r") ;Ctrl+rでページリロード
  Sleep(1000)

  Local $ret = judgeImage("kaimonokago.png") ;kaimonokago.pngがページ内にあるかチェック
  If $ret == false Then 
   ;;ここで他のページを巡回したい場合は、Send("^{TAB}")でとなりのタブ、でSleep短くして買い物かご検索させる
   Sleep(20000)
   ContinueLoop
  EndIf

  ;; 買い物かごがあったので、ボタンおす
  SEFOUND()  ; 見つかったので音ならす(これ重要)
  MouseClick("left", $g_posx, $g_posy)

  //買い物かごページなので、購入ボタンを探す
  $ret = judgeimage("konyu.png")
  If $ret == false Then 
    //通常はあるのだけど、503出た時はここに来るので何か考えたほうがいい
    ExitLoop
  EndIf
  ;購入ボタンを押す
  MouseClick("left, $g_posx, $g_posy)

  ;会員ログインページが出ることもあるので、

  ExitLoop
WEnd

Func SEFOUND()
  SoundPlay(@ScriptDir & "\found.mp3")
EndFunc

;; filenameの画像を探す。ページ読み込み速度の関係もあるから
;; 何回か回してそれでもなければないと判断する
Func judgeImage($filename)
  Local $cnt = 0
  While 1 
    Local $ret = matchimg($filename)
    If $ret Then
      Return true
    EndIf
    
    $cnt += 1
    If $cnt > 20 Then 
      ;;見つからなかったのでページリロードなどに戻る
      ExitLoop
    EndIf
    Sleep(500)
  WEnd
EndFunc

; image searchを使って探す
Func matchimg($filename)
  Local $filepath = @ScriptDir & $filename
  Local $ret = _ImageSearch($filepath, 1, $g_posx, $g_posy, 0)
  If $ret Then 
    Return true
  EndIf
  Return false
EndFunc

ImageSearch UDFについては下記で記事にしています。まず簡単なスクリプトを書いて、imagesearchが動くかチェックするのがいいですね。

1.2 上記スクリプトとファイル

自分は分けていますが、パスの設定だけなので上記スクリプトだと全部同じディレクトリに置いておきます。

  • スクリプト本体
  • ImageSearch.au3
  • ImageSearchDLL.dll
  • kaimonokago.png
  • konyu.png
  • found.mp3

イメージはボタン内側(輪郭は切り取る)をキャプチャし画像として保存。ImageSearchの場合、PCによってはColorManagementが効いて若干色が違っていたりする可能性があるので、スクリプトを走らせるPCでページを開き、画像を作ります。(ちょっとした曖昧画像検索も出来ない・精度が悪いのがImageSearchDLL.dllの面倒なところ。

2. 上記スクリプトでは買えない・・・

このスクリプトではSwitch戦争に勝てません。
何故なら503エラー(人数制限)が頻発するからです。
買い物かごはあっても、その先から入場制限かかって購入に進めません。

こういう時は、別途他のPCでも同じページを開いておき、また買い物かごページも開いておきます。で、買い物かごにまだ入っていなければ、商品ページで「買い物かごに入れる」を押す。

また買い物かごページを見て、入っていれば購入へ。

しかも買い物かごページからは503出まくります。
Ctrl+Rでページリロードか、他のタブで買い物かごページをリロードするなど、購入に進めるページを出すまで頑張ります。

3. スクリプトは「買い物かご」ボタンを発見するアラート

というわけで、自分の場合503出た時の対処を書いていないので、「買い物かご」が出てきた=在庫復活を知らせるアラートスクリプトにしかなりませんでした。

まぁそれでも、アラートが鳴ったおかげで購入出来、あつ森プレイ出来ているので良しとします。
もし、その先もやるなら503出た時の対処もスクリプトに書かないと駄目ですね。

あと、人がリロードしまくる頻度よりは少なくしましょう。
自分は30秒以上に一回を想定してSleepしています。それでもちゃんとアラートが鳴り購入できたので。

最近は11時近辺に入荷、木~金に入荷の場合は次週なし。といったところなので、無駄に24時間やるのは止めましょう。

720pのプロジェクターでやっています。

コメント

タイトルとURLをコピーしました