fix(qdreader): remove inferred adv task filters

This commit is contained in:
2026-05-22 01:22:54 +08:00
parent fc4b3bc587
commit 11ab7559fe
5 changed files with 14 additions and 26 deletions
+1
View File
@@ -697,6 +697,7 @@ QDReader 签到结果判定补充:
- 激励任务 `finishWatch``Result/result = 9` 是上游可接受状态,要继续回查完成状态,而不是直接失败。 - 激励任务 `finishWatch``Result/result = 9` 是上游可接受状态,要继续回查完成状态,而不是直接失败。
- BOSS 明确要求 QDReader 激励任务“依照原项目,不做我以为的逻辑修改”。原项目的激励任务控制流是:读取 `VideoRewardTab.TaskList`;如果最后一项 `IsFinished === 1` 直接完成;否则遍历所有未完成且有 `TaskId` 的列表项,每项提交一次 `/argus/api/v1/video/adv/finishWatch`;最后再回查 `mainPage`,仍以回查后列表最后一项 `IsFinished === 1` 作为完成判断。 - BOSS 明确要求 QDReader 激励任务“依照原项目,不做我以为的逻辑修改”。原项目的激励任务控制流是:读取 `VideoRewardTab.TaskList`;如果最后一项 `IsFinished === 1` 直接完成;否则遍历所有未完成且有 `TaskId` 的列表项,每项提交一次 `/argus/api/v1/video/adv/finishWatch`;最后再回查 `mainPage`,仍以回查后列表最后一项 `IsFinished === 1` 作为完成判断。
- 因此不要在激励任务里加入本地推测过滤,例如跳过“每日签到/其它入口任务”、只校验本轮提交的 TaskId、按 `NeedCount - Count` 计算剩余次数、或者输出“跳过 N 个需其它入口任务”。这些看起来更严格/更安全,但已经被现场结果证明会和原项目语义偏离,导致误判未完成。 - 因此不要在激励任务里加入本地推测过滤,例如跳过“每日签到/其它入口任务”、只校验本轮提交的 TaskId、按 `NeedCount - Count` 计算剩余次数、或者输出“跳过 N 个需其它入口任务”。这些看起来更严格/更安全,但已经被现场结果证明会和原项目语义偏离,导致误判未完成。
- 如果修改了激励任务,一定补三类 VM 回归:① 非最后项已完成但最后项未完成时仍失败;② 回查最后项完成时即成功,即使前面提交过的条目仍显示未完成;③ 看起来像其它入口/签到的条目只要未完成且有 `TaskId`,也按上游循环提交一次,不做本地过滤。
- 可选任务如果被签名网关返回 `url 不在允许的接口列表内`,应标记为跳过 `⏭`,不要污染基础签到成功率。 - 可选任务如果被签名网关返回 `url 不在允许的接口列表内`,应标记为跳过 `⏭`,不要污染基础签到成功率。
- 大咖荐书必须用 base62 token,并带 `senderId` 拉取具体会话;单次 `pullmessage` 或十进制 token 容易导致“参数错误”。 - 大咖荐书必须用 base62 token,并带 `senderId` 拉取具体会话;单次 `pullmessage` 或十进制 token 容易导致“参数错误”。
+2 -9
View File
@@ -4,7 +4,7 @@
//[author: Hermes] //[author: Hermes]
//[service: BOSS] //[service: BOSS]
//[class: 工具类] //[class: 工具类]
//[version: 2.10.7] //[version: 2.10.8]
//[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.7", "启点读书签到插件 v2.10.8",
"【一级菜单】", "【一级菜单】",
"账号管理:启点账号", "账号管理:启点账号",
"执行查询:启点查询", "执行查询:启点查询",
@@ -623,13 +623,6 @@ function finishVideoTask(taskOrId, cookie, repeat) {
} }
return { ok: ok, total: n, last: last, taskId: tid } 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) { function makeBase62Token(num) {
var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
var n = BigInt(num) var n = BigInt(num)
+1 -1
View File
@@ -159,7 +159,7 @@ set(key, value)
4. “今日已签到/已经签到/重复签到”等签到响应按成功处理,避免重复执行时误计失败。 4. “今日已签到/已经签到/重复签到”等签到响应按成功处理,避免重复执行时误计失败。
5. 按账号读取 `qdreader_task_pref_json` 后追加完全体任务链路: 5. 按账号读取 `qdreader_task_pref_json` 后追加完全体任务链路:
- 固定执行领取奖励:`POST /argus/api/v3/checkin/receivegifts` - 固定执行领取奖励:`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/v3/checkin/packagelist`,先处理惊喜福利/前置任务,再按标题精确选择“每日任务”执行三次 `finishWatch` 并回查完成状态;
- 可选每日抽奖:先 `GET /argus/api/v2/checkin/detail`,有次数时 `POST /argus/api/v2/checkin/lottery` - 可选每日抽奖:先 `GET /argus/api/v2/checkin/detail`,有次数时 `POST /argus/api/v2/checkin/lottery`
- 可选每周兑换:`GET /argus/api/v3/checkin/checkinexchangepage`,可兑换时 `POST /argus/api/v3/checkin/exchangegoods`,仅北京时间周日执行; - 可选每周兑换:`GET /argus/api/v3/checkin/checkinexchangepage`,可兑换时 `POST /argus/api/v3/checkin/exchangegoods`,仅北京时间周日执行;
+2 -9
View File
@@ -4,7 +4,7 @@
//[author: Hermes] //[author: Hermes]
//[service: BOSS] //[service: BOSS]
//[class: 工具类] //[class: 工具类]
//[version: 2.10.7] //[version: 2.10.8]
//[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.7", "启点读书签到插件 v2.10.8",
"【一级菜单】", "【一级菜单】",
"账号管理:启点账号", "账号管理:启点账号",
"执行查询:启点查询", "执行查询:启点查询",
@@ -623,13 +623,6 @@ function finishVideoTask(taskOrId, cookie, repeat) {
} }
return { ok: ok, total: n, last: last, taskId: tid } 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) { function makeBase62Token(num) {
var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
var n = BigInt(num) var n = BigInt(num)
+8 -7
View File
@@ -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/); 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 = { 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' }),
@@ -891,19 +891,20 @@ test('adv task reports failure when submitted target ids remain unfinished even
{ 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 },
{ TaskId: 'unrelated-actionable', Title: '其它视频福利', IsFinished: 1 }, { TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 1 },
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 0 },
] } } } }, ] } } } },
], ],
}); });
assert.match(r.replies[0], /激励任务\(任务未完成\)/); assert.match(r.replies[0], /激励任务\(完成\)/);
assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/); 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 = { 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' }),
@@ -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 = { 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' }),