Skip to content

Instantly share code, notes, and snippets.

@tsubasa
Last active May 20, 2023 02:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsubasa/2682c7ed2dec0c2598ad4568900f3533 to your computer and use it in GitHub Desktop.
Save tsubasa/2682c7ed2dec0c2598ad4568900f3533 to your computer and use it in GitHub Desktop.
Amazon.co.jpで使った金額を集計するJS
(() => {
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