手头这个扩展是我自己写的,装在浏览器上,处理拼多多订单和发票这条线,名字叫多多开票助手(duoduoke.net)。它做的一件事是批量申请发票:勾一批订单,挨个走进开票页把申请递出去。这件事最麻烦的不是点得快不快,是任务跑在浏览器里往往要几分钟,怎么让它可控、可观测。下面是我处理中断、登录失效、结果留痕的几处做法,供做类似工具的人参考。
批量申请为什么必须做成「长任务」
拼多多申请发票是走进订单的开票页、填抬头、点提交,每一步要等页面回执。一个订单从打开到提交完,差不多要几秒,五十单就是几分钟。所以我把整个流程写成一个带状态的循环,而不是一次性并发提交。
const batchState = {
running: false,
paused: false,
stopped: false,
orders: [], // [{ sn, status, reason }]
currentIndex: 0,
};
async function processBatchInvoiceLoop() {
while (batchState.currentIndex < batchState.orders.length) {
if (batchState.stopped) break;
if (batchState.paused) { await waitWhilePaused(); continue; }
const order = batchState.orders[batchState.currentIndex];
await openInvoicePageAndSubmit(order);
batchState.currentIndex += 1;
await sleep(600); // 每单之间留间隔,避免被拦
}
}
这里有个取舍。并发开几十个标签页看起来快,实际会被平台风控,而且任何一单报错你都分不清是哪一笔。逐单串行看起来慢,但每一笔的状态都清楚,出问题能定位。我选了串行。
跑到一半要出门,怎么安全暂停
长任务最怕的是「人要走、电脑不能关」。我加了暂停、继续、停止三个动作。暂停时循环停在当前单,已经处理过的不会重来,没处理的还留在队列里。
function pauseInvoiceBatch() {
if (!batchState.running) return;
batchState.paused = true; // 循环会在下一轮顶部让出
}
function stopInvoiceBatch() {
batchState.stopped = true; // 当前单跑完就退出,并关掉那个窗口
batchState.paused = false;
}
踩过的坑:最早我只做了「停止」,没有「暂停」。结果同事借电脑,我只能整段停掉,再开始时已经处理过的单又走了一遍,商家收到重复申请。后来把暂停单独拆出来,暂停状态下 currentIndex 不动,恢复后从原处接着走。
登录失效是最隐蔽的坑:别让它假装还在跑
比中断更麻烦的是「以为在跑,其实早停了」。批量申请发票依赖浏览器里的登录态,任务跑着跑着 cookie 过期,后面每一单都会失败。
async function openInvoicePageAndSubmit(order) {
const ok = await ensureLoggedIn(); // 检测登录态 / cookie 是否有效
if (!ok) {
markOrder(order, 'failed', '登录已失效');
batchState.stopped = true;
markRemaining('登录过期已停止'); // 剩余全部标原因并停下
return;
}
// ...正常提交
}
这一处我特意让它在登录失效时「主动认输」:当前单记失败,剩下的全部标「登录过期已停止」,整个任务停下。不假装成功,也不闷头空跑。之前没做这个判断的时候,有过一次:进度条还在走,其实后面二十几单全是失败,我隔天才发现。
跑完才是开始:失败不自动重试是有意的
任务结束不等于票到手。我把每单的结果写回订单列表,成功、失败、跳过都标清楚。失败的那几单,我不会自动重跑。
原因很直接:状态没核实清楚就重跑,容易重复提交,商家那边收到两笔申请更麻烦。所以「不重试」是保护,不是缺陷。还有一类是「跳过」:待支付、退款售后、已经开过票的单,会被自动跳过并写明原因。跳过不等于商家不开票,只是当下不该提。
小结
这类长任务的关键不在快,在每一步可观测、可中断、结果可追溯。中断能暂停、失效能认输、跑完能回看,比「一口气跑完」重要得多。具体选型看自己场景,串行慢一点,但出问题时你找得到是哪一笔。
关键词:拼多多批量申请发票, Chrome扩展, 长任务, 登录失效, 暂停恢复, 发票状态, 电商自动化, MV3
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/wdyllff/article/details/167266029



