fix(qdreader): accept risk-conf video callbacks

This commit is contained in:
2026-06-20 14:14:00 +08:00
parent becdf739dc
commit fa0e80666a
3 changed files with 47 additions and 2 deletions
+9 -1
View File
@@ -691,6 +691,10 @@ function taskRunCount(task, def) {
return n return n
} }
function taskAccepted(res) { return taskResultOk(res) || Number(resultCode(res)) === 9 } 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) { function finishVideoTask(taskOrId, cookie, repeat) {
var tid = typeof taskOrId === "object" ? taskIdOf(taskOrId || {}) : taskOrId var tid = typeof taskOrId === "object" ? taskIdOf(taskOrId || {}) : taskOrId
var n = repeat || (typeof taskOrId === "object" ? taskRunCount(taskOrId, 1) : 1) 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 (!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" } if (taskFinished(tasks[tasks.length - 1])) return { name: "激励任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" }
var submittedCount = 0 var submittedCount = 0
var riskSubmitted = false
for (var i = 0; i < tasks.length; i++) { for (var i = 0; i < tasks.length; i++) {
var t = tasks[i] || {} var t = tasks[i] || {}
if (taskFinished(t)) continue if (taskFinished(t)) continue
@@ -733,12 +738,15 @@ function doAdvTask(cookie) {
if (!tid) continue if (!tid) continue
var fr = finishVideoTask(tid, cookie, 1) var fr = finishVideoTask(tid, cookie, 1)
submittedCount += fr.ok 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" } 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 verify = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
var after = advTaskList(verify) var after = advTaskList(verify)
var finished = !!(after && after.length && after.every(function (t) { return taskFinished(t) })) 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) { function taskReceived(task) {
return Number(field(task, ["IsReceived", "Received", "Status", "status"], 0)) === 1 return Number(field(task, ["IsReceived", "Received", "Status", "status"], 0)) === 1
+9 -1
View File
@@ -691,6 +691,10 @@ function taskRunCount(task, def) {
return n return n
} }
function taskAccepted(res) { return taskResultOk(res) || Number(resultCode(res)) === 9 } 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) { function finishVideoTask(taskOrId, cookie, repeat) {
var tid = typeof taskOrId === "object" ? taskIdOf(taskOrId || {}) : taskOrId var tid = typeof taskOrId === "object" ? taskIdOf(taskOrId || {}) : taskOrId
var n = repeat || (typeof taskOrId === "object" ? taskRunCount(taskOrId, 1) : 1) 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 (!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" } if (taskFinished(tasks[tasks.length - 1])) return { name: "激励任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" }
var submittedCount = 0 var submittedCount = 0
var riskSubmitted = false
for (var i = 0; i < tasks.length; i++) { for (var i = 0; i < tasks.length; i++) {
var t = tasks[i] || {} var t = tasks[i] || {}
if (taskFinished(t)) continue if (taskFinished(t)) continue
@@ -733,12 +738,15 @@ function doAdvTask(cookie) {
if (!tid) continue if (!tid) continue
var fr = finishVideoTask(tid, cookie, 1) var fr = finishVideoTask(tid, cookie, 1)
submittedCount += fr.ok 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" } 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 verify = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
var after = advTaskList(verify) var after = advTaskList(verify)
var finished = !!(after && after.length && after.every(function (t) { return taskFinished(t) })) 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) { function taskReceived(task) {
return Number(field(task, ["IsReceived", "Received", "Status", "status"], 0)) === 1 return Number(field(task, ["IsReceived", "Received", "Status", "status"], 0)) === 1
+29
View File
@@ -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', () => { test('daily task follows upstream sequence: surprise task, one-ad task, then three daily ad callbacks', () => {
const store = { const store = {
qdreader_cookie_json: JSON.stringify({ '12345': cookie }), qdreader_cookie_json: JSON.stringify({ '12345': cookie }),