From 11ab7559fe53e8191dd12ba70255ff2a085dcc64 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Fri, 22 May 2026 01:22:54 +0800 Subject: [PATCH] fix(qdreader): remove inferred adv task filters --- docs/autman-plugin-rules.md | 1 + js/qdreader_sign_autman.js | 11 ++--------- plugins/qdreader/README.md | 2 +- plugins/qdreader/qdreader_sign_autman.js | 11 ++--------- tests/qdreader_plugin.test.mjs | 15 ++++++++------- 5 files changed, 14 insertions(+), 26 deletions(-) diff --git a/docs/autman-plugin-rules.md b/docs/autman-plugin-rules.md index 26bd689..5f03894 100644 --- a/docs/autman-plugin-rules.md +++ b/docs/autman-plugin-rules.md @@ -697,6 +697,7 @@ QDReader 签到结果判定补充: - 激励任务 `finishWatch` 的 `Result/result = 9` 是上游可接受状态,要继续回查完成状态,而不是直接失败。 - BOSS 明确要求 QDReader 激励任务“依照原项目,不做我以为的逻辑修改”。原项目的激励任务控制流是:读取 `VideoRewardTab.TaskList`;如果最后一项 `IsFinished === 1` 直接完成;否则遍历所有未完成且有 `TaskId` 的列表项,每项提交一次 `/argus/api/v1/video/adv/finishWatch`;最后再回查 `mainPage`,仍以回查后列表最后一项 `IsFinished === 1` 作为完成判断。 - 因此不要在激励任务里加入本地推测过滤,例如跳过“每日签到/其它入口任务”、只校验本轮提交的 TaskId、按 `NeedCount - Count` 计算剩余次数、或者输出“跳过 N 个需其它入口任务”。这些看起来更严格/更安全,但已经被现场结果证明会和原项目语义偏离,导致误判未完成。 +- 如果修改了激励任务,一定补三类 VM 回归:① 非最后项已完成但最后项未完成时仍失败;② 回查最后项完成时即成功,即使前面提交过的条目仍显示未完成;③ 看起来像其它入口/签到的条目只要未完成且有 `TaskId`,也按上游循环提交一次,不做本地过滤。 - 可选任务如果被签名网关返回 `url 不在允许的接口列表内`,应标记为跳过 `⏭`,不要污染基础签到成功率。 - 大咖荐书必须用 base62 token,并带 `senderId` 拉取具体会话;单次 `pullmessage` 或十进制 token 容易导致“参数错误”。 diff --git a/js/qdreader_sign_autman.js b/js/qdreader_sign_autman.js index b607ded..0735f72 100644 --- a/js/qdreader_sign_autman.js +++ b/js/qdreader_sign_autman.js @@ -4,7 +4,7 @@ //[author: Hermes] //[service: BOSS] //[class: 工具类] -//[version: 2.10.7] +//[version: 2.10.8] //[platform: web,qq,wx,tg,tb,fs,we] //[public: false] //[price: 0] @@ -276,7 +276,7 @@ function contentText() { } function usage() { return [ - "启点读书签到插件 v2.10.7", + "启点读书签到插件 v2.10.8", "【一级菜单】", "账号管理:启点账号", "执行查询:启点查询", @@ -623,13 +623,6 @@ function finishVideoTask(taskOrId, cookie, repeat) { } return { ok: ok, total: n, last: last, taskId: tid } } -function advTaskActionable(task) { - var title = taskTitle(task) - var id = taskIdKey(taskIdOf(task || {})) - if (/签到|check.?in|每日任务|抽奖|lottery|兑换|exchange|章节|chapter|荐书|消息|message/i.test(title)) return false - if (/1165585369246138370$/.test(id)) return false - return true -} function makeBase62Token(num) { var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" var n = BigInt(num) diff --git a/plugins/qdreader/README.md b/plugins/qdreader/README.md index 2e17dd8..bfa2c98 100644 --- a/plugins/qdreader/README.md +++ b/plugins/qdreader/README.md @@ -159,7 +159,7 @@ set(key, value) 4. “今日已签到/已经签到/重复签到”等签到响应按成功处理,避免重复执行时误计失败。 5. 按账号读取 `qdreader_task_pref_json` 后追加完全体任务链路: - 固定执行领取奖励:`POST /argus/api/v3/checkin/receivegifts`; - - 可选激励任务:`GET /argus/api/v2/video/adv/mainPage`,再对未完成任务调用 `POST /argus/api/v1/video/adv/finishWatch`;上游返回 `result=9` 表示视频完成已受理,需要再拉取 `mainPage` 校验,不应直接判失败; + - 可选激励任务:严格按上游原项目控制流执行:`GET /argus/api/v2/video/adv/mainPage` 读取 `Data.VideoRewardTab.TaskList`;若最后一项已完成则直接视为完成;否则按顺序对每个未完成且带 `TaskId` 的条目各调用一次 `POST /argus/api/v1/video/adv/finishWatch`;上游返回 `result=9` 表示视频完成已受理;最后再次拉取 `mainPage`,只按回查后最后一项是否完成判断激励任务是否完成。这里不做本地推测过滤、不按已提交 TaskId 单独验收、不输出“跳过其它入口任务”。 - 可选每日任务:`GET /argus/api/v3/checkin/packagelist`,先处理惊喜福利/前置任务,再按标题精确选择“每日任务”执行三次 `finishWatch` 并回查完成状态; - 可选每日抽奖:先 `GET /argus/api/v2/checkin/detail`,有次数时 `POST /argus/api/v2/checkin/lottery`; - 可选每周兑换:`GET /argus/api/v3/checkin/checkinexchangepage`,可兑换时 `POST /argus/api/v3/checkin/exchangegoods`,仅北京时间周日执行; diff --git a/plugins/qdreader/qdreader_sign_autman.js b/plugins/qdreader/qdreader_sign_autman.js index b607ded..0735f72 100644 --- a/plugins/qdreader/qdreader_sign_autman.js +++ b/plugins/qdreader/qdreader_sign_autman.js @@ -4,7 +4,7 @@ //[author: Hermes] //[service: BOSS] //[class: 工具类] -//[version: 2.10.7] +//[version: 2.10.8] //[platform: web,qq,wx,tg,tb,fs,we] //[public: false] //[price: 0] @@ -276,7 +276,7 @@ function contentText() { } function usage() { return [ - "启点读书签到插件 v2.10.7", + "启点读书签到插件 v2.10.8", "【一级菜单】", "账号管理:启点账号", "执行查询:启点查询", @@ -623,13 +623,6 @@ function finishVideoTask(taskOrId, cookie, repeat) { } return { ok: ok, total: n, last: last, taskId: tid } } -function advTaskActionable(task) { - var title = taskTitle(task) - var id = taskIdKey(taskIdOf(task || {})) - if (/签到|check.?in|每日任务|抽奖|lottery|兑换|exchange|章节|chapter|荐书|消息|message/i.test(title)) return false - if (/1165585369246138370$/.test(id)) return false - return true -} function makeBase62Token(num) { var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" var n = BigInt(num) diff --git a/tests/qdreader_plugin.test.mjs b/tests/qdreader_plugin.test.mjs index 353ae0a..d6c06be 100644 --- a/tests/qdreader_plugin.test.mjs +++ b/tests/qdreader_plugin.test.mjs @@ -865,7 +865,7 @@ test('adv task does not report success when only unrelated task is finished afte assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/); }); -test('adv task reports failure when submitted target ids remain unfinished even if unrelated actionable task exists', () => { +test('adv task follows upstream final-item completion instead of submitted-id inference', () => { const store = { qdreader_cookie_json: JSON.stringify({ '12345': cookie }), qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }), @@ -891,19 +891,20 @@ test('adv task reports failure when submitted target ids remain unfinished even { 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: 'target-a', Title: '看视频领福利A', IsFinished: 0 }, { TaskId: 'target-b', Title: '看视频领福利B', IsFinished: 0 }, - { TaskId: 'unrelated-actionable', Title: '其它视频福利', IsFinished: 1 }, - { TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 0 }, + { TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 1 }, ] } } } }, ], }); - assert.match(r.replies[0], /激励任务❌\(任务未完成\)/); - assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/); + assert.match(r.replies[0], /激励任务✅\(已完成\)/); + assert.match(r.replies[0], /汇总:成功 1 \/ 失败 0 \/ 总计 1/); }); -test('adv task skips non-ad entries that must be handled by their own modules', () => { +test('adv task iterates every unfinished upstream entry without local non-ad filtering', () => { const store = { qdreader_cookie_json: JSON.stringify({ '12345': cookie }), qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }), @@ -965,7 +966,7 @@ test('adv task accepts nested data result 9 with empty message from sign gateway }); -test('adv task repeats same upstream fragment task until requested count before verification', () => { +test('adv task submits each unfinished upstream list item once before verification', () => { const store = { qdreader_cookie_json: JSON.stringify({ '12345': cookie }), qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }),