htsign's blog

ノンジャンルで書くつもりだけど技術系が多いんじゃないかと思います

BookLiveで今まで使ってきた金額を出すスクリプト書いた

いやー久しぶりにJavaScript書いたわー。

(function(d){var s=d.createElement("script");s.src="//dl.dropboxusercontent.com/u/414379/www/BookLivePaid/script.js";d.body.appendChild(s)})(document)

一時期Amazon.co.jpで使った額を調べるスクリプトが流行ったことがありましたが、アレのBookLive版だと思えば大体あってます。

使い方

  1. 上のコードをコピーします。
  2. http://booklive.jp/my/top に移動してBookLiveにログインします。
    • すでにログイン済みならトップページで実行しても問題ないはず。
  3. 開発者コンソール出す。
    • IE/Firefox/Chromeなど主要ブラウザなら「F12」キーで出せます。
  4. 貼り付けてEnter。
  5. コンソールに結果が出力されます。


動作確認はIE11でしかしていません。
たぶん他でも動くと思いますが、Firefoxさん辺りは実行前に警告文出すかも。

IE/Firefox/Chromeのそれぞれ最新版で正常に動作することを確認しました。

ソース

実際に実行されるスクリプトの中身です。
呼び出すソースはDropboxにアップロードしたものですが、コードは同一です。

main();

function main() {
    var now = new Date();
    var startYear = now.getFullYear();
    var startMonth = now.getMonth() + 1;
    
    var paid = 0;
    var least = prompt("何年まで遡りますか?", startYear);
    if (!/^[0-9]{4}$/.test(least)) {
        console.warn("半角4文字の西暦で入力してください。");
        return;
    }
    
    for (var y = startYear + 1; --y >= least; ) {
        for (var m = (y === startYear ? startMonth : 12) + 1; --m > 0; ) {
            paid += monthSum(y, m);
            console.info("ここまでの累計: " + paid + "円");
        }
    }
    console.info("合計: " + paid + "円");
}

function monthSum(year, month) {
    var sum = 0;
    console.info(year + "年" + month + "月のリクエスト中...");
    var doc = request("/my/product?year=" + year + "&month=" + month);
    var nodes = doc.querySelectorAll('[id^="myproduct_display"]');
    
    if (nodes.length !== 0) {
        sum = [].slice.call(nodes)
            .map(function(e){ return e.textContent.trim(); })
            .filter(function(text){ return text.indexOf("円") === text.length - 1; })
            .map(function(price){ return parseInt(price.split(",").join("")); })
            .reduce(function(a, b){ return a + b; });
    }
    
    console.info(sum + "円");
    return sum;
}

function request(url) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, false);
    xhr.send(null);
    
    var range = document.createRange();
    return range.createContextualFragment(xhr.responseText);
}

ちなみに

私の消費金額は2013年1月から7月12日現在で654,126円らしいです。