作者tian1997 (蛋蛋)
看板e-shopping
标题Re: [问题] 如何把虾皮过去一年的购买金额、总
时间Sat Oct 18 22:29:09 2025
※ 引述 《qw5526259 (B.K)》 之铭言:
:
: 在虾皮商场买了很多东西
: 如何总计
: 过去一年的购买金额呢?
: 找了好久
: 都找不到这个功能
: 该不会要自己一笔一笔的加总吧!
: 如果是这样
: 真得是很故意
:
小弟最近用AI做的,可以满足原PO的需要
我自己测试可以运作,但不知道别人能不能正常使用
有成功的再留言分享一下
教学,照图片顺序按:
先打开虾皮"购物清单"页面
1.按F12,选Console(主控台)
2.按禁止标志
3.在这里贴上代码後,按ENTER,不要动等它跑完,买得愈多跑愈久,我自己跑了2分钟
https://i.imgur.com/8PYlmke.jpeg
实际成果(ptt没办法贴emoji,所以实际是纯文字)
https://i.imgur.com/MU2SbrT.jpeg
代码
-------------------------------------------------
(async () => {
console.log("[开始] 自动滚动中,请勿操作滑鼠...");
let lastScroll = 0;
let sameCount = 0;
while (sameCount < 5) {
window.scrollTo(0, document.body.scrollHeight);
await new Promise(r => setTimeout(r, 1500));
const newScroll = document.body.scrollHeight;
if (newScroll === lastScroll) sameCount++;
else sameCount = 0;
lastScroll = newScroll;
}
console.log("[完成] 已滚到底部,开始分析订单...");
const orderCards = document.querySelectorAll("div.YL_VlX");
console.log("[资料] 抓到订单数量:", orderCards.length);
let completedOrPendingTotal = 0, completedOrPendingCount = 0;
let refundTotal = 0, refundCount = 0;
let cancelTotal = 0, cancelCount = 0;
// 【追踪最高金额订单】变数
let maxCompletedAmount = 0;
let maxCompletedTitle = "";
const COMPLETED_NAME = "已完成/待收货订单";
const REFUND_NAME = "退款/退货订单";
const CANCEL_NAME = "已取消订单";
orderCards.forEach((order, index) => {
const text = order.textContent;
let titleText = "";
let fullTitleText = "";
let highestPrice = 0;
// 1. 找到所有单一商品项目区块
const itemElements = order.querySelectorAll(".mZ1OWk");
itemElements.forEach(item => {
const nameEl = item.querySelector(".DWVWOJ");
const priceEl = item.querySelector(".nW_6Oi");
if (nameEl && priceEl) {
const currentName = nameEl.textContent.trim();
const priceMatch = priceEl.textContent.match(/[\d,]+/);
const currentPrice = priceMatch ? parseInt(priceMatch[0].replace(/,/g, "
")) : 0;
if (currentPrice > highestPrice) {
highestPrice = currentPrice;
fullTitleText = currentName;
titleText = currentName;
}
}
});
if (titleText.length > 20) titleText = titleText.slice(0, 20) + "...";
let amountValue = 0;
const totalAmountEl = order.querySelector(".LwXnUQ .t7TQaf");
if (totalAmountEl) {
const match = totalAmountEl.textContent.match(/[\d,]+/);
if (match) amountValue = parseInt(match[0].replace(/,/g, ""));
}
const statusEl = order.querySelector(".bv3eJE");
const cancelIndicator = order.querySelector('[aria-label*="你取消了订单"]');
if (cancelIndicator || (statusEl && /取消|卖家选择不接受/.test(statusEl.text
Content))) {
cancelCount++;
cancelTotal += amountValue;
const logStatus = (statusEl && /取消/.test(statusEl.textContent)) ? status
El.textContent : "已取消";
console.log(`[取消] 第 ${index + 1} 笔(${logStatus})→ ${amountValue.toL
ocaleString()} 元|商品:${titleText}`);
return;
}
const refundTag = order.querySelector(".jCAyGf");
if ((refundTag && /退款|退货/.test(refundTag.textContent)) || text.includes(
"退款成功")) {
refundCount++;
refundTotal += amountValue;
console.log(`[退货] 第 ${index + 1} 笔(退款/退货)→ ${amountValue.toLoca
leString()} 元|商品:${titleText}`);
return;
}
if (statusEl && /已评价|完成|已完成|待收货/.test(statusEl.textContent)) {
completedOrPendingCount++;
completedOrPendingTotal += amountValue;
if (amountValue > maxCompletedAmount) {
maxCompletedAmount = amountValue;
maxCompletedTitle = fullTitleText;
}
const logStatus = statusEl.textContent;
console.log(`[完成] 第 ${index + 1} 笔(${logStatus})→ ${amountValue.toL
ocaleString()} 元|商品:${titleText}`);
return;
}
console.log(`[未知] 第 ${index + 1} 笔状态不明|${amountValue.toLocaleString
()} 元|商品:${titleText}`);
});
console.log("----------------------------------");
console.log(`[完成] ${COMPLETED_NAME} 笔数:`, completedOrPendingCount);
console.log(`[完成] ${COMPLETED_NAME} 总金额:`, completedOrPendingTotal.toLoca
leString(), "元");
console.log("----------------------------------");
console.log(`[退货] ${REFUND_NAME} 笔数:`, refundCount);
console.log(`[退货] ${REFUND_NAME} 总金额:`, refundTotal.toLocaleString(), "元
");
console.log("----------------------------------");
console.log(`[取消] ${CANCEL_NAME} 笔数:`, cancelCount);
console.log(`[取消] ${CANCEL_NAME} 总金额:`, cancelTotal.toLocaleString(), "元
");
console.log("----------------------------------");
if (maxCompletedAmount > 0) {
console.log("[统计] 最大单笔消费");
console.log(`金额: ${maxCompletedAmount.toLocaleString()} 元`);
console.log(`商品: ${maxCompletedTitle}`);
console.log("----------------------------------");
}
let alertMessage =
`[完成] ${COMPLETED_NAME}:${completedOrPendingCount} 笔,总金额 ${completed
OrPendingTotal.toLocaleString()} 元\n` +
`[退货] ${REFUND_NAME}:${refundCount} 笔,总金额 ${refundTotal.toLocaleStri
ng()} 元\n` +
`[取消] ${CANCEL_NAME}:${cancelCount} 笔,总金额 ${cancelTotal.toLocaleStri
ng()} 元`;
if (maxCompletedAmount > 0) {
alertMessage += `\n\n[统计] 最大单笔消费\n`;
alertMessage += `金额:${maxCompletedAmount.toLocaleString()} 元\n`;
alertMessage += `商品:${maxCompletedTitle}`;
}
alert(alertMessage);
})();
-------------------------------------------------
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.169.225.105 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/e-shopping/M.1760797751.A.E4E.html
1F:推 shokotan: 好棒 有考虑上github上吗?111.250.156.215 10/18 23:41
我小白不会用那个东西
而且感觉这个代码应该过没多久就会失效了哈哈
重点是我到现在还不知道可用性,就怕别人不能用,还没看到有人分享
2F:推 tinabjqs: 厉害!1.161.84.137 10/19 00:40
3F:推 bogooeiu: 推一个114.136.248.245 10/19 10:18
4F:推 jiaj: 推220.143.30.179 10/19 11:36
※ 编辑: tian1997 (39.12.209.125 台湾), 10/19/2025 17:11:02
5F:推 mersma: 好厉害 42.77.29.42 10/19 18:27
6F:推 moon999tw: 赞喔 推一个 211.21.108.88 10/20 07:42
7F:推 thelmalin: 推 27.52.33.54 10/20 09:59
8F:推 Missprincess: 推 1.163.162.65 10/20 11:00
9F:推 wavier: 好强,感谢分享 114.136.68.116 10/21 13:49
10F:推 yuchi0978: 云端发票不就可以了 61.228.8.107 10/25 23:59
11F:推 hayato1085: 推 1.171.5.19 10/26 14:17