小狼15454头像
关注

多多开票助手踩坑记:拼多多批量申请发票的长任务,怎么处理中断和登录失效

手头这个扩展是我自己写的,装在浏览器上,处理拼多多订单和发票这条线,名字叫多多开票助手(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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--