fix(qdreader): restore upstream adv task flow
This commit is contained in:
@@ -695,9 +695,8 @@ QDReader 签到结果判定补充:
|
|||||||
|
|
||||||
- `今日已签到`、`重复签到`、`已领取`、`已完成`、`无可领取礼包` 等幂等提示应视为成功类,不应让账号失败。
|
- `今日已签到`、`重复签到`、`已领取`、`已完成`、`无可领取礼包` 等幂等提示应视为成功类,不应让账号失败。
|
||||||
- 激励任务 `finishWatch` 的 `Result/result = 9` 是上游可接受状态,要继续回查完成状态,而不是直接失败。
|
- 激励任务 `finishWatch` 的 `Result/result = 9` 是上游可接受状态,要继续回查完成状态,而不是直接失败。
|
||||||
- 激励任务不要只对每个任务 `finishWatch` 一次;如果上游任务体带 `NeedCount` / `Count` / `Times` 等次数字段(例如“激励碎片”),应按次数重复提交同一个 `TaskId`,再回查 `mainPage`。
|
- BOSS 明确要求 QDReader 激励任务“依照原项目,不做我以为的逻辑修改”。原项目的激励任务控制流是:读取 `VideoRewardTab.TaskList`;如果最后一项 `IsFinished === 1` 直接完成;否则遍历所有未完成且有 `TaskId` 的列表项,每项提交一次 `/argus/api/v1/video/adv/finishWatch`;最后再回查 `mainPage`,仍以回查后列表最后一项 `IsFinished === 1` 作为完成判断。
|
||||||
- 每日任务的原版链路是 `packagelist` 后先处理惊喜/前置任务,再处理“完成1个广告任务”,最后对标题为“每日任务”的目标按次数(通常 3 次)执行 `finishWatch`;不能只提交每日任务本身一次或跳过前置广告任务。
|
- 因此不要在激励任务里加入本地推测过滤,例如跳过“每日签到/其它入口任务”、只校验本轮提交的 TaskId、按 `NeedCount - Count` 计算剩余次数、或者输出“跳过 N 个需其它入口任务”。这些看起来更严格/更安全,但已经被现场结果证明会和原项目语义偏离,导致误判未完成。
|
||||||
- 回查完成状态时要优先校验本轮提交的具体 `TaskId`,不能因为其它旧任务已完成就把当前任务判定为成功。
|
|
||||||
- 可选任务如果被签名网关返回 `url 不在允许的接口列表内`,应标记为跳过 `⏭`,不要污染基础签到成功率。
|
- 可选任务如果被签名网关返回 `url 不在允许的接口列表内`,应标记为跳过 `⏭`,不要污染基础签到成功率。
|
||||||
- 大咖荐书必须用 base62 token,并带 `senderId` 拉取具体会话;单次 `pullmessage` 或十进制 token 容易导致“参数错误”。
|
- 大咖荐书必须用 base62 token,并带 `senderId` 拉取具体会话;单次 `pullmessage` 或十进制 token 容易导致“参数错误”。
|
||||||
|
|
||||||
|
|||||||
+10
-49
@@ -4,7 +4,7 @@
|
|||||||
//[author: Hermes]
|
//[author: Hermes]
|
||||||
//[service: BOSS]
|
//[service: BOSS]
|
||||||
//[class: 工具类]
|
//[class: 工具类]
|
||||||
//[version: 2.10.6]
|
//[version: 2.10.7]
|
||||||
//[platform: web,qq,wx,tg,tb,fs,we]
|
//[platform: web,qq,wx,tg,tb,fs,we]
|
||||||
//[public: false]
|
//[public: false]
|
||||||
//[price: 0]
|
//[price: 0]
|
||||||
@@ -276,7 +276,7 @@ function contentText() {
|
|||||||
}
|
}
|
||||||
function usage() {
|
function usage() {
|
||||||
return [
|
return [
|
||||||
"启点读书签到插件 v2.10.6",
|
"启点读书签到插件 v2.10.7",
|
||||||
"【一级菜单】",
|
"【一级菜单】",
|
||||||
"账号管理:启点账号",
|
"账号管理:启点账号",
|
||||||
"执行查询:启点查询",
|
"执行查询:启点查询",
|
||||||
@@ -603,18 +603,8 @@ function taskTitle(task) { return String(field(task, ["Title", "TaskName", "Name
|
|||||||
function taskIdOf(task) { return field(task, ["TaskId", "TaskID", "taskId", "TaskIDStr", "Id", "id"], "") }
|
function taskIdOf(task) { return field(task, ["TaskId", "TaskID", "taskId", "TaskIDStr", "Id", "id"], "") }
|
||||||
function taskFinished(task) { return Number(field(task, ["IsFinished", "Finished", "Status", "status"], 0)) === 1 }
|
function taskFinished(task) { return Number(field(task, ["IsFinished", "Finished", "Status", "status"], 0)) === 1 }
|
||||||
function taskIdKey(id) { return String(id === undefined || id === null ? "" : id) }
|
function taskIdKey(id) { return String(id === undefined || id === null ? "" : id) }
|
||||||
function taskRemainingCount(task) {
|
|
||||||
var cur = Number(field(task, ["Count", "count", "FinishedCount", "finishedCount", "FinishCount", "finishCount", "CurrentCount", "currentCount", "CompleteCount", "completeCount", "DoneCount", "doneCount", "Num", "num"], NaN))
|
|
||||||
var total = Number(field(task, ["NeedCount", "needCount", "TargetCount", "targetCount", "TotalCount", "totalCount", "MaxCount", "maxCount", "Times", "times", "Limit", "limit"], NaN))
|
|
||||||
if (!isNaN(total) && total > 0) {
|
|
||||||
if (!isNaN(cur) && cur >= 0 && cur < total) return Math.min(10, Math.max(1, Math.ceil(total - cur)))
|
|
||||||
return Math.min(10, Math.max(1, Math.ceil(total)))
|
|
||||||
}
|
|
||||||
if (!isNaN(cur) && cur > 1) return Math.min(10, Math.ceil(cur))
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
function taskRunCount(task, def) {
|
function taskRunCount(task, def) {
|
||||||
var n = taskRemainingCount(task)
|
var n = Number(field(task, ["NeedCount", "needCount", "Count", "count", "TotalCount", "totalCount", "Times", "times", "Limit", "limit"], def || 1))
|
||||||
if (!n || isNaN(n) || n < 1) n = def || 1
|
if (!n || isNaN(n) || n < 1) n = def || 1
|
||||||
if (n > 10) n = 10
|
if (n > 10) n = 10
|
||||||
return n
|
return n
|
||||||
@@ -655,55 +645,26 @@ function doReceiveGifts(cookie) {
|
|||||||
var ok = taskResultOk(res)
|
var ok = taskResultOk(res)
|
||||||
return { name: "领取奖励", ok: !!ok, msg: resultMsg(res) || (ok ? "领取成功" : "领取失败"), path: "/argus/api/v3/checkin/receivegifts" }
|
return { name: "领取奖励", ok: !!ok, msg: resultMsg(res) || (ok ? "领取成功" : "领取失败"), path: "/argus/api/v3/checkin/receivegifts" }
|
||||||
}
|
}
|
||||||
function advCompletionLooksUpstreamComplete(tasks, submittedIds) {
|
|
||||||
if (!tasks || !tasks.length) return false
|
|
||||||
if (tasks[tasks.length - 1] && taskFinished(tasks[tasks.length - 1])) return true
|
|
||||||
for (var i = 0; i < tasks.length; i++) {
|
|
||||||
var t = tasks[i]
|
|
||||||
var id = taskIdKey(taskIdOf(t))
|
|
||||||
if (id && submittedIds && submittedIds[id] && taskFinished(t)) return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
function doAdvTask(cookie) {
|
function doAdvTask(cookie) {
|
||||||
var main = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
|
var main = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
|
||||||
if (!taskResultOk(main)) return { name: "激励任务", ok: false, msg: resultMsg(main) || "获取任务失败", path: "/argus/api/v2/video/adv/mainPage" }
|
if (!taskResultOk(main)) return { name: "激励任务", ok: false, msg: resultMsg(main) || "获取任务失败", path: "/argus/api/v2/video/adv/mainPage" }
|
||||||
var tasks = firstArray(nested(main, ["Data", "VideoRewardTab", "TaskList"]), nested(main, ["data", "VideoRewardTab", "TaskList"]), nested(main, ["Data", "TaskList"]), nested(main, ["data", "TaskList"]))
|
var tasks = firstArray(nested(main, ["Data", "VideoRewardTab", "TaskList"]), nested(main, ["data", "VideoRewardTab", "TaskList"]), nested(main, ["Data", "TaskList"]), nested(main, ["data", "TaskList"]))
|
||||||
if (!tasks.length) return { name: "激励任务", ok: true, msg: "无待完成任务", path: "/argus/api/v2/video/adv/mainPage" }
|
if (!tasks.length) return { name: "激励任务", ok: false, msg: "未找到任务列表", path: "/argus/api/v2/video/adv/mainPage" }
|
||||||
if (advCompletionLooksUpstreamComplete(tasks, null)) 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 submittedIds = {}
|
|
||||||
var submittedCount = 0
|
var submittedCount = 0
|
||||||
var skippedCount = 0
|
|
||||||
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
|
||||||
var tid = taskIdOf(t)
|
var tid = taskIdOf(t)
|
||||||
if (!tid) continue
|
if (!tid) continue
|
||||||
if (!advTaskActionable(t)) { skippedCount++; continue }
|
var fr = finishVideoTask(t, cookie, 1)
|
||||||
var fr = finishVideoTask(t, cookie)
|
submittedCount += fr.ok
|
||||||
if (fr.taskId) { submittedIds[taskIdKey(fr.taskId)] = true; submittedCount += fr.ok }
|
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) || ("任务 " + tid + " 失败"), 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 = firstArray(nested(verify, ["Data", "VideoRewardTab", "TaskList"]), nested(verify, ["data", "VideoRewardTab", "TaskList"]), nested(verify, ["Data", "TaskList"]), nested(verify, ["data", "TaskList"]))
|
var after = firstArray(nested(verify, ["Data", "VideoRewardTab", "TaskList"]), nested(verify, ["data", "VideoRewardTab", "TaskList"]), nested(verify, ["Data", "TaskList"]), nested(verify, ["data", "TaskList"]))
|
||||||
var unfinishedSubmitted = 0
|
var finished = !!(after && after.length && taskFinished(after[after.length - 1]))
|
||||||
var actionableLeft = 0
|
return { name: "激励任务", ok: finished, msg: finished ? "已完成" : (submittedCount ? "任务未完成" : "未找到可提交任务"), path: "/argus/api/v2/video/adv/mainPage" }
|
||||||
var upstreamDone = advCompletionLooksUpstreamComplete(after, submittedIds)
|
|
||||||
for (var v = 0; v < after.length; v++) {
|
|
||||||
var at = after[v]
|
|
||||||
var aid = taskIdKey(taskIdOf(at))
|
|
||||||
if (!aid) continue
|
|
||||||
if (submittedIds[aid]) {
|
|
||||||
if (!taskFinished(at)) unfinishedSubmitted++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (!taskFinished(at) && advTaskActionable(at)) actionableLeft++
|
|
||||||
}
|
|
||||||
var submittedKeys = Object.keys(submittedIds)
|
|
||||||
var finished = upstreamDone || (submittedKeys.length ? unfinishedSubmitted === 0 : actionableLeft === 0)
|
|
||||||
var suffix = skippedCount ? (",跳过 " + skippedCount + " 个需其它入口任务") : ""
|
|
||||||
var left = submittedKeys.length ? unfinishedSubmitted : actionableLeft
|
|
||||||
return { name: "激励任务", ok: finished, msg: finished ? (submittedKeys.length ? ("已完成" + suffix) : ("无待完成任务" + suffix)) : (submittedCount ? ("已提交 " + submittedCount + " 个视频任务,仍有 " + left + " 个未完成" + suffix) : ("仍有 " + left + " 个未完成" + suffix)), path: "/argus/api/v2/video/adv/mainPage" }
|
|
||||||
}
|
}
|
||||||
function doDailyTask(cookie) {
|
function doDailyTask(cookie) {
|
||||||
var list = qdGet("/argus/api/v3/checkin/packagelist", {}, cookie)
|
var list = qdGet("/argus/api/v3/checkin/packagelist", {}, cookie)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
//[author: Hermes]
|
//[author: Hermes]
|
||||||
//[service: BOSS]
|
//[service: BOSS]
|
||||||
//[class: 工具类]
|
//[class: 工具类]
|
||||||
//[version: 2.10.6]
|
//[version: 2.10.7]
|
||||||
//[platform: web,qq,wx,tg,tb,fs,we]
|
//[platform: web,qq,wx,tg,tb,fs,we]
|
||||||
//[public: false]
|
//[public: false]
|
||||||
//[price: 0]
|
//[price: 0]
|
||||||
@@ -276,7 +276,7 @@ function contentText() {
|
|||||||
}
|
}
|
||||||
function usage() {
|
function usage() {
|
||||||
return [
|
return [
|
||||||
"启点读书签到插件 v2.10.6",
|
"启点读书签到插件 v2.10.7",
|
||||||
"【一级菜单】",
|
"【一级菜单】",
|
||||||
"账号管理:启点账号",
|
"账号管理:启点账号",
|
||||||
"执行查询:启点查询",
|
"执行查询:启点查询",
|
||||||
@@ -603,18 +603,8 @@ function taskTitle(task) { return String(field(task, ["Title", "TaskName", "Name
|
|||||||
function taskIdOf(task) { return field(task, ["TaskId", "TaskID", "taskId", "TaskIDStr", "Id", "id"], "") }
|
function taskIdOf(task) { return field(task, ["TaskId", "TaskID", "taskId", "TaskIDStr", "Id", "id"], "") }
|
||||||
function taskFinished(task) { return Number(field(task, ["IsFinished", "Finished", "Status", "status"], 0)) === 1 }
|
function taskFinished(task) { return Number(field(task, ["IsFinished", "Finished", "Status", "status"], 0)) === 1 }
|
||||||
function taskIdKey(id) { return String(id === undefined || id === null ? "" : id) }
|
function taskIdKey(id) { return String(id === undefined || id === null ? "" : id) }
|
||||||
function taskRemainingCount(task) {
|
|
||||||
var cur = Number(field(task, ["Count", "count", "FinishedCount", "finishedCount", "FinishCount", "finishCount", "CurrentCount", "currentCount", "CompleteCount", "completeCount", "DoneCount", "doneCount", "Num", "num"], NaN))
|
|
||||||
var total = Number(field(task, ["NeedCount", "needCount", "TargetCount", "targetCount", "TotalCount", "totalCount", "MaxCount", "maxCount", "Times", "times", "Limit", "limit"], NaN))
|
|
||||||
if (!isNaN(total) && total > 0) {
|
|
||||||
if (!isNaN(cur) && cur >= 0 && cur < total) return Math.min(10, Math.max(1, Math.ceil(total - cur)))
|
|
||||||
return Math.min(10, Math.max(1, Math.ceil(total)))
|
|
||||||
}
|
|
||||||
if (!isNaN(cur) && cur > 1) return Math.min(10, Math.ceil(cur))
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
function taskRunCount(task, def) {
|
function taskRunCount(task, def) {
|
||||||
var n = taskRemainingCount(task)
|
var n = Number(field(task, ["NeedCount", "needCount", "Count", "count", "TotalCount", "totalCount", "Times", "times", "Limit", "limit"], def || 1))
|
||||||
if (!n || isNaN(n) || n < 1) n = def || 1
|
if (!n || isNaN(n) || n < 1) n = def || 1
|
||||||
if (n > 10) n = 10
|
if (n > 10) n = 10
|
||||||
return n
|
return n
|
||||||
@@ -655,55 +645,26 @@ function doReceiveGifts(cookie) {
|
|||||||
var ok = taskResultOk(res)
|
var ok = taskResultOk(res)
|
||||||
return { name: "领取奖励", ok: !!ok, msg: resultMsg(res) || (ok ? "领取成功" : "领取失败"), path: "/argus/api/v3/checkin/receivegifts" }
|
return { name: "领取奖励", ok: !!ok, msg: resultMsg(res) || (ok ? "领取成功" : "领取失败"), path: "/argus/api/v3/checkin/receivegifts" }
|
||||||
}
|
}
|
||||||
function advCompletionLooksUpstreamComplete(tasks, submittedIds) {
|
|
||||||
if (!tasks || !tasks.length) return false
|
|
||||||
if (tasks[tasks.length - 1] && taskFinished(tasks[tasks.length - 1])) return true
|
|
||||||
for (var i = 0; i < tasks.length; i++) {
|
|
||||||
var t = tasks[i]
|
|
||||||
var id = taskIdKey(taskIdOf(t))
|
|
||||||
if (id && submittedIds && submittedIds[id] && taskFinished(t)) return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
function doAdvTask(cookie) {
|
function doAdvTask(cookie) {
|
||||||
var main = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
|
var main = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
|
||||||
if (!taskResultOk(main)) return { name: "激励任务", ok: false, msg: resultMsg(main) || "获取任务失败", path: "/argus/api/v2/video/adv/mainPage" }
|
if (!taskResultOk(main)) return { name: "激励任务", ok: false, msg: resultMsg(main) || "获取任务失败", path: "/argus/api/v2/video/adv/mainPage" }
|
||||||
var tasks = firstArray(nested(main, ["Data", "VideoRewardTab", "TaskList"]), nested(main, ["data", "VideoRewardTab", "TaskList"]), nested(main, ["Data", "TaskList"]), nested(main, ["data", "TaskList"]))
|
var tasks = firstArray(nested(main, ["Data", "VideoRewardTab", "TaskList"]), nested(main, ["data", "VideoRewardTab", "TaskList"]), nested(main, ["Data", "TaskList"]), nested(main, ["data", "TaskList"]))
|
||||||
if (!tasks.length) return { name: "激励任务", ok: true, msg: "无待完成任务", path: "/argus/api/v2/video/adv/mainPage" }
|
if (!tasks.length) return { name: "激励任务", ok: false, msg: "未找到任务列表", path: "/argus/api/v2/video/adv/mainPage" }
|
||||||
if (advCompletionLooksUpstreamComplete(tasks, null)) 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 submittedIds = {}
|
|
||||||
var submittedCount = 0
|
var submittedCount = 0
|
||||||
var skippedCount = 0
|
|
||||||
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
|
||||||
var tid = taskIdOf(t)
|
var tid = taskIdOf(t)
|
||||||
if (!tid) continue
|
if (!tid) continue
|
||||||
if (!advTaskActionable(t)) { skippedCount++; continue }
|
var fr = finishVideoTask(t, cookie, 1)
|
||||||
var fr = finishVideoTask(t, cookie)
|
submittedCount += fr.ok
|
||||||
if (fr.taskId) { submittedIds[taskIdKey(fr.taskId)] = true; submittedCount += fr.ok }
|
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) || ("任务 " + tid + " 失败"), 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 = firstArray(nested(verify, ["Data", "VideoRewardTab", "TaskList"]), nested(verify, ["data", "VideoRewardTab", "TaskList"]), nested(verify, ["Data", "TaskList"]), nested(verify, ["data", "TaskList"]))
|
var after = firstArray(nested(verify, ["Data", "VideoRewardTab", "TaskList"]), nested(verify, ["data", "VideoRewardTab", "TaskList"]), nested(verify, ["Data", "TaskList"]), nested(verify, ["data", "TaskList"]))
|
||||||
var unfinishedSubmitted = 0
|
var finished = !!(after && after.length && taskFinished(after[after.length - 1]))
|
||||||
var actionableLeft = 0
|
return { name: "激励任务", ok: finished, msg: finished ? "已完成" : (submittedCount ? "任务未完成" : "未找到可提交任务"), path: "/argus/api/v2/video/adv/mainPage" }
|
||||||
var upstreamDone = advCompletionLooksUpstreamComplete(after, submittedIds)
|
|
||||||
for (var v = 0; v < after.length; v++) {
|
|
||||||
var at = after[v]
|
|
||||||
var aid = taskIdKey(taskIdOf(at))
|
|
||||||
if (!aid) continue
|
|
||||||
if (submittedIds[aid]) {
|
|
||||||
if (!taskFinished(at)) unfinishedSubmitted++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (!taskFinished(at) && advTaskActionable(at)) actionableLeft++
|
|
||||||
}
|
|
||||||
var submittedKeys = Object.keys(submittedIds)
|
|
||||||
var finished = upstreamDone || (submittedKeys.length ? unfinishedSubmitted === 0 : actionableLeft === 0)
|
|
||||||
var suffix = skippedCount ? (",跳过 " + skippedCount + " 个需其它入口任务") : ""
|
|
||||||
var left = submittedKeys.length ? unfinishedSubmitted : actionableLeft
|
|
||||||
return { name: "激励任务", ok: finished, msg: finished ? (submittedKeys.length ? ("已完成" + suffix) : ("无待完成任务" + suffix)) : (submittedCount ? ("已提交 " + submittedCount + " 个视频任务,仍有 " + left + " 个未完成" + suffix) : ("仍有 " + left + " 个未完成" + suffix)), path: "/argus/api/v2/video/adv/mainPage" }
|
|
||||||
}
|
}
|
||||||
function doDailyTask(cookie) {
|
function doDailyTask(cookie) {
|
||||||
var list = qdGet("/argus/api/v3/checkin/packagelist", {}, cookie)
|
var list = qdGet("/argus/api/v3/checkin/packagelist", {}, cookie)
|
||||||
|
|||||||
@@ -861,7 +861,7 @@ test('adv task does not report success when only unrelated task is finished afte
|
|||||||
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
|
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
assert.match(r.replies[0], /激励任务❌\(已提交 1 个视频任务,仍有 1 个未完成\)/);
|
assert.match(r.replies[0], /激励任务❌\(任务未完成\)/);
|
||||||
assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/);
|
assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -899,7 +899,7 @@ test('adv task reports failure when submitted target ids remain unfinished even
|
|||||||
] } } } },
|
] } } } },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
assert.match(r.replies[0], /激励任务❌\(已提交 2 个视频任务,仍有 2 个未完成,跳过 1 个需其它入口任务\)/);
|
assert.match(r.replies[0], /激励任务❌\(任务未完成\)/);
|
||||||
assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/);
|
assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -932,9 +932,9 @@ test('adv task skips non-ad entries that must be handled by their own modules',
|
|||||||
] } } } },
|
] } } } },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
assert.match(r.replies[0], /激励任务✅\(已完成,跳过 1 个需其它入口任务\)/);
|
assert.match(r.replies[0], /激励任务❌\(任务未完成\)/);
|
||||||
assert.equal(r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).length, 1);
|
assert.equal(r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).length, 2);
|
||||||
assert.doesNotMatch(r.calls.find(c => /video\/adv\/finishWatch$/.test(c.url)).body, /1165585369246138370/);
|
assert.ok(r.calls.some(c => /video\/adv\/finishWatch$/.test(c.url) && /1165585369246138370/.test(c.body)));
|
||||||
});
|
});
|
||||||
|
|
||||||
test('adv task accepts nested data result 9 with empty message from sign gateway wrapper', () => {
|
test('adv task accepts nested data result 9 with empty message from sign gateway wrapper', () => {
|
||||||
@@ -985,16 +985,12 @@ test('adv task repeats same upstream fragment task until requested count before
|
|||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
||||||
{ statusCode: 200, body: { result: 9, message: '' } },
|
{ statusCode: 200, body: { result: 9, message: '' } },
|
||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
||||||
{ statusCode: 200, body: { result: 9, message: '' } },
|
|
||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
|
||||||
{ statusCode: 200, body: { result: 9, message: '' } },
|
|
||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
|
||||||
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 1, NeedCount: 3 }] } } } },
|
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 1, NeedCount: 3 }] } } } },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
|
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
|
||||||
const finishCalls = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url));
|
const finishCalls = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url));
|
||||||
assert.equal(finishCalls.length, 3);
|
assert.equal(finishCalls.length, 1);
|
||||||
assert.ok(finishCalls.every(c => /1187767793786748928/.test(c.body)));
|
assert.ok(finishCalls.every(c => /1187767793786748928/.test(c.body)));
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1024,6 +1020,8 @@ test('adv task follows upstream completion when final list item is finished afte
|
|||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
||||||
{ statusCode: 200, body: { result: 9, message: '' } },
|
{ statusCode: 200, body: { result: 9, message: '' } },
|
||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
||||||
|
{ statusCode: 200, body: { result: 9, message: '' } },
|
||||||
|
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
||||||
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
|
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
|
||||||
{ TaskId: 'target-a', Title: '看视频领福利A', IsFinished: 0 },
|
{ TaskId: 'target-a', Title: '看视频领福利A', IsFinished: 0 },
|
||||||
{ TaskId: 'target-b', Title: '看视频领福利B', IsFinished: 0 },
|
{ TaskId: 'target-b', Title: '看视频领福利B', IsFinished: 0 },
|
||||||
@@ -1031,11 +1029,12 @@ test('adv task follows upstream completion when final list item is finished afte
|
|||||||
] } } } },
|
] } } } },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
assert.match(r.replies[0], /激励任务✅\(已完成,跳过 1 个需其它入口任务\)/);
|
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
|
||||||
assert.match(r.replies[0], /汇总:成功 1 \/ 失败 0 \/ 总计 1/);
|
assert.match(r.replies[0], /汇总:成功 1 \/ 失败 0 \/ 总计 1/);
|
||||||
|
assert.equal(r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).length, 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('adv task derives remaining callbacks from Count and NeedCount metadata', () => {
|
test('adv task ignores count metadata and submits each unfinished upstream task once', () => {
|
||||||
const store = {
|
const store = {
|
||||||
qdreader_cookie_json: JSON.stringify({ '12345': cookie }),
|
qdreader_cookie_json: JSON.stringify({ '12345': cookie }),
|
||||||
qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }),
|
qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }),
|
||||||
@@ -1055,14 +1054,12 @@ test('adv task derives remaining callbacks from Count and NeedCount metadata', (
|
|||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
||||||
{ statusCode: 200, body: { result: 9, message: '' } },
|
{ statusCode: 200, body: { result: 9, message: '' } },
|
||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
||||||
{ statusCode: 200, body: { result: 9, message: '' } },
|
|
||||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
|
||||||
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'partial-task', Title: '看视频领福利', IsFinished: 1, Count: 3, NeedCount: 3 }] } } } },
|
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'partial-task', Title: '看视频领福利', IsFinished: 1, Count: 3, NeedCount: 3 }] } } } },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
|
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
|
||||||
const finishCalls = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url));
|
const finishCalls = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url));
|
||||||
assert.equal(finishCalls.length, 2);
|
assert.equal(finishCalls.length, 1);
|
||||||
assert.ok(finishCalls.every(c => /partial-task/.test(c.body)));
|
assert.ok(finishCalls.every(c => /partial-task/.test(c.body)));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user