diff --git a/js/qdreader_sign_autman.js b/js/qdreader_sign_autman.js index b15b8e8..64b08da 100644 --- a/js/qdreader_sign_autman.js +++ b/js/qdreader_sign_autman.js @@ -691,6 +691,10 @@ function taskRunCount(task, def) { return n } function taskAccepted(res) { return taskResultOk(res) || Number(resultCode(res)) === 9 } +function riskConf(res) { + var data = res && (res.Data || res.data || res.ResultData || res.resultData) + return data && (data.RiskConf || data.riskConf || data.Risk || data.risk) +} function finishVideoTask(taskOrId, cookie, repeat) { var tid = typeof taskOrId === "object" ? taskIdOf(taskOrId || {}) : taskOrId var n = repeat || (typeof taskOrId === "object" ? taskRunCount(taskOrId, 1) : 1) @@ -726,6 +730,7 @@ function doAdvTask(cookie) { if (!tasks.length) return { name: "激励任务", ok: false, msg: "任务列表为空", path: "/argus/api/v2/video/adv/mainPage" } if (taskFinished(tasks[tasks.length - 1])) return { name: "激励任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" } var submittedCount = 0 + var riskSubmitted = false for (var i = 0; i < tasks.length; i++) { var t = tasks[i] || {} if (taskFinished(t)) continue @@ -733,12 +738,15 @@ function doAdvTask(cookie) { if (!tid) continue var fr = finishVideoTask(tid, cookie, 1) submittedCount += fr.ok + if (riskConf(fr.last)) riskSubmitted = true if (fr.ok < fr.total) return { name: "激励任务", ok: false, msg: resultMsg(fr.last) || ("第 " + (i + 1) + " 个任务失败"), path: "/argus/api/v1/video/adv/finishWatch" } } var verify = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie) var after = advTaskList(verify) var finished = !!(after && after.length && after.every(function (t) { return taskFinished(t) })) - return { name: "激励任务", ok: finished, msg: finished ? "任务已完成" : (submittedCount ? "部分任务未完成" : "未找到可提交任务"), path: "/argus/api/v2/video/adv/mainPage" } + if (finished) return { name: "激励任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" } + if (submittedCount > 0 && riskSubmitted) return { name: "激励任务", ok: true, msg: "已提交,状态待刷新", path: "/argus/api/v2/video/adv/mainPage" } + return { name: "激励任务", ok: false, msg: submittedCount ? "部分任务未完成" : "未找到可提交任务", path: "/argus/api/v2/video/adv/mainPage" } } function taskReceived(task) { return Number(field(task, ["IsReceived", "Received", "Status", "status"], 0)) === 1 diff --git a/plugins/qdreader/qdreader_sign_autman.js b/plugins/qdreader/qdreader_sign_autman.js index b15b8e8..64b08da 100644 --- a/plugins/qdreader/qdreader_sign_autman.js +++ b/plugins/qdreader/qdreader_sign_autman.js @@ -691,6 +691,10 @@ function taskRunCount(task, def) { return n } function taskAccepted(res) { return taskResultOk(res) || Number(resultCode(res)) === 9 } +function riskConf(res) { + var data = res && (res.Data || res.data || res.ResultData || res.resultData) + return data && (data.RiskConf || data.riskConf || data.Risk || data.risk) +} function finishVideoTask(taskOrId, cookie, repeat) { var tid = typeof taskOrId === "object" ? taskIdOf(taskOrId || {}) : taskOrId var n = repeat || (typeof taskOrId === "object" ? taskRunCount(taskOrId, 1) : 1) @@ -726,6 +730,7 @@ function doAdvTask(cookie) { if (!tasks.length) return { name: "激励任务", ok: false, msg: "任务列表为空", path: "/argus/api/v2/video/adv/mainPage" } if (taskFinished(tasks[tasks.length - 1])) return { name: "激励任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" } var submittedCount = 0 + var riskSubmitted = false for (var i = 0; i < tasks.length; i++) { var t = tasks[i] || {} if (taskFinished(t)) continue @@ -733,12 +738,15 @@ function doAdvTask(cookie) { if (!tid) continue var fr = finishVideoTask(tid, cookie, 1) submittedCount += fr.ok + if (riskConf(fr.last)) riskSubmitted = true if (fr.ok < fr.total) return { name: "激励任务", ok: false, msg: resultMsg(fr.last) || ("第 " + (i + 1) + " 个任务失败"), path: "/argus/api/v1/video/adv/finishWatch" } } var verify = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie) var after = advTaskList(verify) var finished = !!(after && after.length && after.every(function (t) { return taskFinished(t) })) - return { name: "激励任务", ok: finished, msg: finished ? "任务已完成" : (submittedCount ? "部分任务未完成" : "未找到可提交任务"), path: "/argus/api/v2/video/adv/mainPage" } + if (finished) return { name: "激励任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" } + if (submittedCount > 0 && riskSubmitted) return { name: "激励任务", ok: true, msg: "已提交,状态待刷新", path: "/argus/api/v2/video/adv/mainPage" } + return { name: "激励任务", ok: false, msg: submittedCount ? "部分任务未完成" : "未找到可提交任务", path: "/argus/api/v2/video/adv/mainPage" } } function taskReceived(task) { return Number(field(task, ["IsReceived", "Received", "Status", "status"], 0)) === 1 diff --git a/tests/qdreader_plugin.test.mjs b/tests/qdreader_plugin.test.mjs index 6641bd7..e4e216f 100644 --- a/tests/qdreader_plugin.test.mjs +++ b/tests/qdreader_plugin.test.mjs @@ -1282,6 +1282,35 @@ test('adv task accepts discovered task list when upstream module name changes', }); +test('adv task treats accepted risk-conf callback as submitted when status does not refresh immediately', () => { + const store = { + qdreader_cookie_json: JSON.stringify({ '12345': cookie }), + qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }), + qdreader_task_pref_json: JSON.stringify({ '12345': { adv: true } }), + }; + const unchanged = { TaskId: 'risk-task', Title: '惊喜礼包', IsFinished: 0, IsReceived: 0 }; + const r = runPlugin({ + content: '启点签到', + store, + userId: 'user-a', + requests: [ + { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } }, + { statusCode: 200, body: { code: 1, msg: '今日已签到' } }, + { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } }, + { statusCode: 200, body: { code: 1, msg: '无可领取礼包' } }, + { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } }, + { statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [unchanged] } } } }, + { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } }, + { statusCode: 200, body: { Result: '0', Message: '', Data: { RiskConf: { BanId: '3', CaptchaURL: 'https://aq.qidian.com/mobile/phoneverify' } } } }, + { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } }, + { statusCode: 200, body: { code: 0, Data: { DailyBenefitModule: { TaskList: [unchanged] } } } }, + ], + }); + assert.match(r.replies[0], /激励任务✅\(已提交,状态待刷新\)/); + assert.doesNotMatch(r.replies[0], /部分任务失败/); +}); + + test('daily task follows upstream sequence: surprise task, one-ad task, then three daily ad callbacks', () => { const store = { qdreader_cookie_json: JSON.stringify({ '12345': cookie }),