Last active
May 20, 2023 02:19
-
-
Save tsubasa/2682c7ed2dec0c2598ad4568900f3533 to your computer and use it in GitHub Desktop.
Amazon.co.jpで使った金額を集計するJS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(() => { | |
let total = {}; | |
let year = new Date().getFullYear(); | |
let isAll = false; | |
const createElement = document.createElement.bind(document); | |
const querySelector = document.querySelector.bind(document); | |
year = window.prompt( | |
"集計する年を半角数字4桁で入力してください、全期間の場合は all と入力してください", | |
year | |
); | |
if (year.trim() === "all") { | |
isAll = true; | |
year = [...document.querySelectorAll("[name='orderFilter'] option")] | |
.reverse() | |
.find((v) => v.textContent.trim().match(/[0-9]{4}/g)) | |
.textContent.trim() | |
.match(/[0-9]{4}/g)[0]; | |
} | |
year = Number(year); | |
if (isNaN(year)) { | |
alert("年は半角数字4桁で入力してください"); | |
return; | |
} | |
const overlay = createElement("div"); | |
overlay.id = "js-overlay"; | |
overlay.style.cssText = `position:fixed;top:0;left:0;width:100%;height:100%;background:#000000a0;z-index:9999;display:flex;align-items:center;justify-content:center;color:#fff;font-size:2rem;`; | |
overlay.textContent = "集計中…"; | |
document.body.appendChild(overlay); | |
const main = async (num = 0) => { | |
querySelector("#js-overlay").textContent = | |
year + "年の集計中… / " + (num + 1) + "ページ目"; | |
try { | |
const results = await getData(num); | |
if (typeof total[year] === "undefined") { | |
total[year] = results; | |
} else { | |
total[year] = total[year].concat(results); | |
} | |
main(num + 1); | |
} catch { | |
if (isAll && new Date().getFullYear() > year) { | |
year++; | |
main(0); | |
} else { | |
const paymentTotal = Object.values(total).reduce( | |
(prev, cur) => prev + cur.reduce((p, c) => p + c.price, 0), | |
0 | |
); | |
querySelector("#js-overlay").textContent = | |
"合計 " + | |
new Intl.NumberFormat("ja-JP", { | |
style: "currency", | |
currency: "JPY", | |
}).format(paymentTotal) + | |
" 円"; | |
} | |
} | |
}; | |
const getData = (num) => | |
new Promise((resolve, reject) => { | |
querySelector("#js-iframe")?.remove(); | |
const iframe = createElement("iframe"); | |
iframe.id = "js-iframe"; | |
iframe.src = `https://www.amazon.co.jp/gp/css/order-history?digitalOrders=1&unifiedOrders=1&orderFilter=year-${year}&startIndex=${ | |
num * 10 | |
}`; | |
iframe.onload = () => { | |
const orders = | |
iframe.contentWindow.document.querySelectorAll("div.order"); | |
querySelector("#js-iframe")?.remove(); | |
if (orders.length === 0) reject(); | |
return resolve( | |
[...orders].map((order) => ({ | |
price: Number( | |
order | |
.querySelector("div.order-info .yohtmlc-order-total") | |
?.textContent.match(/[0-9]/g) | |
?.join("") ?? 0 | |
), | |
})) | |
); | |
}; | |
document.body.appendChild(iframe); | |
}); | |
main(); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment