/** * 获取某一天 0 点本地时间的时间戳秒 * param {number} timestamp - 任意时间戳秒 * returns {number} 当天 0 点的本地时间戳秒 */ function getLocalDateZero(timestamp) { const d new Date(timestamp * 1000); d.setHours(0, 0, 0, 0); return Math.floor(d.getTime() / 1000); } /** * 补签循环自动根据连续签到天数计算断签日并从断签日开始补签 * param {number} continuousDays - 当前连续签到天数例如从接口获取的 691 * param {number} [supplyDays] - 需要补签的天数不传或为 0 表示无限补签 */ async function runLoop(continuousDays, supplyDays) { const now Math.floor(Date.now() / 1000); // 今天 0 点本地时间 const todayZero getLocalDateZero(now); // 断签日 今天 0 点 - (连续签到天数 1) 天 const baseDate todayZero - (continuousDays 1) * 86400; let count 1; let i 0; // 补签索引 console.log(当前日期${new Date(now * 1000).toLocaleDateString()}); console.log(连续签到天数${continuousDays}); console.log(断签日补签起点${new Date(baseDate * 1000).toLocaleDateString()}); if (supplyDays supplyDays 0) { console.log(本次补签总天数${supplyDays}\n); } else { console.log(补签模式无限补签将持续补签直到手动停止或出错\n); } while (true) { // 如果指定了补签天数且已达到则退出 if (supplyDays supplyDays 0 i supplyDays) { break; } // 计算当前要补签的日期从断签日开始往前推且保证为 0 点 const date baseDate - i * 86400; const json { date: date }; try { const response await fetch(https://api.juejin.cn/growth_api/v1/check_in_supp?aid2608uuid7391778031159658024spider0, { method: POST, credentials: include, headers: { content-type: application/json }, body: JSON.stringify(json) }); const data await response.json(); console.log( 第 ${i 1} 次请求日期: ${new Date(date * 1000).toLocaleDateString()} count: ${count}响应:, data ); // 如果补签失败err_no 不为 0打印原因并停止循环 if (data.err_no ! 0) { console.log(补签失败 (err_no: ${data.err_no}, msg: ${data.err_msg || 未知错误})停止补签); break; } } catch (err) { console.error( 请求失败日期: ${new Date(date * 1000).toLocaleDateString()}错误:, err ); break; } count; i; await sleep(1500); // 间隔 1.5 秒 } console.log(补签流程结束); } /** 延时函数 */ function sleep(ms) { return new Promise(resolve setTimeout(resolve, ms)); } // 调用示例 // 补签 70 天从断签日开始 // runLoop(691, 70); // 无限补签直到失败或手动停止 // runLoop(691); // runLoop(691, 0);