Nightmare.js を見かけて、調べてみたら思いのほか簡単に扱えそうだったため、Switchの購入を自動化できないか試してみました。
Nightmareがv2(Electronベース)になり、使いやすく感動したのでLIGブログのPV/UUデータ取得を自動化してみた。
以下は、2分毎にカートに入っているか確認し、カートに入っていた場合は 「ご注文手続きへ」ボタンを押下させるスクリプトです。
CART_URL には、任意のSwitchをカートに入れた後のURLを設定する必要あり。
app.js
var Nightmare = require('nightmare');
var vo = require('vo');
var nightmare = Nightmare({ show: true });
// カートに入れた後のURLを設定
// 以下は「赤・黒・青・黒」のカラーリングのSwitchと、ゼルダのパッケージ版。
var CART_URL = "https://store.nintendo.co.jp/cart_index.html?request=insert&cx24base=HAC_S_KAYAA&cx24set1=KA&cx24set2=KA&cx24set3=BA&&cx24set4=PA&item_cd_list=HAC_P_AAAAA";
// カートにアイテムが入ったかを確認
// 商品リスト部分のHTMLに「HAC_S_KAYAA」(Switchの商品コード)が含まれているかを確認
// indexOfの結果を返す
function checkItem(nightmare) {
return nightmare
.goto(CART_URL)
.evaluate(function () {
return document.querySelector('.item_area').innerHTML.indexOf("HAC_S_KAYAA");
});
}
// 「ご注文手続きへ」ボタンを押下する
function addToCart(nightmare) {
return nightmare
.click('#cartFlow .buttonarea .add')
}
// 商品リストチェックのループ用関数
// チェック結果次第で、ループするか、進むかを分岐
function* run() {
// カートを開く
yield nightmare
.goto(CART_URL);
// カートに入ったかを確認
let match = yield checkItem(nightmare);
if(match<1) {
// 商品リストにSwitchが含まれていなかった場合
// 2分待ってリロードし、再度チェック
yield nightmare
.wait(120000)
.refresh();
vo(run)(function(err, result) {
if (err) throw err;
console.log(result);
});
} else {
// 商品リストにSwitchが含まれていた場合
// 次のページへ進む!
yield addToCart(nightmare);
}
return match;
}
// チェック開始!
vo(run)(function(err, result) {
if (err) throw err;
console.log(result);
});
チェックに成功すると、ログイン画面で待機状態になります。
ログインだとかはややこしそうなので省きました。