愛しのべるさんの為に…♡

使い方
①　https://jp.nexon.com/mypage/point にアクセス
②　F12
③　コンソールにペタリ　（許可警告出たら　allow pasting　を打ち込んでください）
④　勝手にページ追って計算されて、最後にポップアップ出力されます

適当に作成した物なので許してクレメンス
ちょっと修正しました 2024/09/27

![point.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005994/4d82e776-6fb5-2c7d-6693-a13c28f6e9c9.png)

こんな感じで表示されます。
一応何でチャージしたか表示もするようにしてます

※お支払い方法はページ毎の合計だから気にしないでね（titleで取得してるから…)

動作環境
chrome、Brave 確認済

修正後
```
async function fetchHTML(url) {
    const response = await fetch(url);
    return new DOMParser().parseFromString(await response.text(), 'text/html');
}

function formatNumber(number) {
    return number.toLocaleString(); // 数字をカンマで区切り
}

async function getChargesFromPage(doc) {
    const charges = Array.from(doc.querySelectorAll('td:nth-child(2)'))
                         .map(td => parseInt(td.innerText.replace(/,/g, '')) || 0);
    
    // `td class="title"` から支払い方法を取得
    const methods = Array.from(doc.querySelectorAll('td.title'))
                        .map(el => el.innerText.trim())
                        .filter(method => !method.startsWith('お支払い方法:')); // お支払い方法:を除外

    return { charges, methods };
}

async function calculateTotalCharges() {
    let totalCharges = {};
    let chargeCounts = {}; // 各支払い方法のチャージ回数をカウント
    let currentPage = 1;
    const baseUrl = window.location.href.split('?')[0];

    while (true) {
        const doc = await fetchHTML(`${baseUrl}?page=${currentPage}`);
        const { charges, methods } = await getChargesFromPage(doc);

        charges.forEach((charge, index) => {
            const method = methods[index];
            if (method) {
                if (!totalCharges[method]) {
                    totalCharges[method] = 0;
                    chargeCounts[method] = 0; // 初期化
                }
                totalCharges[method] += charge;
                chargeCounts[method] += 1;
            }
        });

        const pageTotal = charges.reduce((sum, point) => sum + point, 0);
        console.log(`ページ ${currentPage} の合計: ${formatNumber(pageTotal)} ポイント`);
        console.log(`ページ ${currentPage} の支払い方法別合計: `, 
            Object.fromEntries(
                Object.entries(totalCharges).map(([method, total]) => [method, formatNumber(total)])
            )
        );

        const nextPageLi = doc.querySelector('li.now + li a');
        if (nextPageLi) {
            currentPage++;
        } else {
            break;
        }
    }

    const grandTotal = Object.values(totalCharges).reduce((sum, point) => sum + point, 0);
    const resultMessage = `総課金額: ${formatNumber(grandTotal)} ポイント\n` +
                          `全ページの支払い方法別合計:\n` +
                          Object.entries(totalCharges)
                                .map(([method, total]) => 
                                    `${method}: ${formatNumber(total)} ポイント (回数: ${chargeCounts[method]})`
                                )
                                .join('\n');

    console.log(resultMessage);
    alert(resultMessage); // ポップアップで結果を表示
}

// 計算を開始
calculateTotalCharges();
```

修正前
```
async function fetchHTML(url) {
    const response = await fetch(url);
    return new DOMParser().parseFromString(await response.text(), 'text/html');
}

function formatNumber(number) {
    return number.toLocaleString(); // 数字をカンマで区切り
}

async function getChargesFromPage(doc) {
    const charges = Array.from(doc.querySelectorAll('td:nth-child(2)'))
                         .map(td => parseInt(td.innerText.replace(/,/g, '')) || 0);
    
    // `class="title"` から支払い方法を取得
    const methods = Array.from(doc.querySelectorAll('.title'))
                        .map(el => el.innerText.trim());

    return { charges, methods };
}

async function calculateTotalCharges() {
    let totalCharges = {};
    let chargeCounts = {}; // 各支払い方法のチャージ回数をカウント
    let currentPage = 1;
    const baseUrl = window.location.href.split('?')[0];

    while (true) {
        const doc = await fetchHTML(`${baseUrl}?page=${currentPage}`);
        const { charges, methods } = await getChargesFromPage(doc);

        charges.forEach((charge, index) => {
            const method = methods[index];
            if (method) {
                if (!totalCharges[method]) {
                    totalCharges[method] = 0;
                    chargeCounts[method] = 0; // 初期化
                }
                totalCharges[method] += charge;
                chargeCounts[method] += 1;
            }
        });

        const pageTotal = charges.reduce((sum, point) => sum + point, 0);
        console.log(`ページ ${currentPage} の合計: ${formatNumber(pageTotal)} ポイント`);
        console.log(`ページ ${currentPage} の支払い方法別合計: `, 
            Object.fromEntries(
                Object.entries(totalCharges).map(([method, total]) => [method, formatNumber(total)])
            )
        );

        const nextPageLi = doc.querySelector('li.now + li a');
        if (nextPageLi) {
            currentPage++;
        } else {
            break;
        }
    }

    const grandTotal = Object.values(totalCharges).reduce((sum, point) => sum + point, 0);
    const resultMessage = `総課金額: ${formatNumber(grandTotal)} ポイント\n` +
                          `全ページの支払い方法別合計:\n` +
                          Object.entries(totalCharges)
                                .map(([method, total]) => 
                                    `${method}: ${formatNumber(total)} ポイント (回数: ${chargeCounts[method]})`
                                )
                                .join('\n');

    console.log(resultMessage);
    alert(resultMessage); // ポップアップで結果を表示
}

// 計算を開始
calculateTotalCharges();
```