fix(qdreader): restore upstream ad task flow
This commit is contained in:
@@ -363,7 +363,7 @@ test('manual sign and cron sign both call sign gateway then qidian checkin', ()
|
||||
qdreader_cookie_json: JSON.stringify({ '12345': cookie }),
|
||||
qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }),
|
||||
};
|
||||
const manual = runPlugin({ content: '启点签到', store: { ...store } });
|
||||
const manual = runPlugin({ content: '启点签到', store: { ...store }, globals: { Date: fixedDateClass('2026-05-20T07:01:00.000+08:00') } });
|
||||
assert.equal(manual.calls.length, 4);
|
||||
assert.match(manual.calls[0].url, /api\.120399\.xyz\/qdreader\/sign$/);
|
||||
assert.match(manual.calls[1].url, /h5\.if\.qidian\.com\/argus\/api\/v3\/checkin\/checkin$/);
|
||||
@@ -410,9 +410,9 @@ test('optional QDReader full tasks use upstream executable endpoints and sign ab
|
||||
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
|
||||
{ statusCode: 200, body: { code: 0, msg: '视频完成' } },
|
||||
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
|
||||
{ statusCode: 200, body: { code: 0, Data: { TaskList: [{ TaskId: 'daily-1', TaskName: '每日任务', IsFinished: 0, NeedWatchCount: 1 }] } } },
|
||||
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'adv-1', IsFinished: 1 }] } } } },
|
||||
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
|
||||
{ statusCode: 200, body: { code: 0, msg: '每日视频完成' } },
|
||||
{ statusCode: 200, body: { code: 0, Data: { TaskList: [{ TaskId: 'daily-1', TaskName: '每日任务', IsFinished: 1, NeedWatchCount: 1 }] } } },
|
||||
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
|
||||
{ statusCode: 200, body: { code: 0, Data: { HasVideoUrge: 0, LotteryCount: 1 } } },
|
||||
(req) => String(req.url).includes('/sign') ? { body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } } : { statusCode: 200, body: { code: 0, msg: 'ok' } },
|
||||
@@ -802,11 +802,11 @@ test('adv task treats upstream result 9 as accepted and verifies finished state'
|
||||
{ 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: { VideoRewardTab: { TaskList: [{ TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
|
||||
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
|
||||
{ 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: '1165585369246138372', Title: '看视频领福利', IsFinished: 1 }] } } } },
|
||||
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 1 }] } } } },
|
||||
],
|
||||
});
|
||||
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
|
||||
@@ -815,6 +815,67 @@ test('adv task treats upstream result 9 as accepted and verifies finished state'
|
||||
assert.match(r.calls.find(c => /video\/adv\/finishWatch$/.test(c.url)).body, /1165585369246138372/);
|
||||
});
|
||||
|
||||
test('adv task does not report success when only unrelated task is finished after callback', () => {
|
||||
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 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: { VideoRewardTab: { TaskList: [{ TaskId: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
|
||||
{ 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: 'old-done', Title: '已完成旧任务', IsFinished: 1 }, { TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 }] } } } },
|
||||
],
|
||||
});
|
||||
assert.match(r.replies[0], /激励任务❌\(已提交 1 个视频任务,仍有 1 个未完成\)/);
|
||||
assert.match(r.replies[0], /汇总:成功 0 \/ 失败 1 \/ 总计 1/);
|
||||
});
|
||||
|
||||
test('adv task skips non-ad entries that must be handled by their own modules', () => {
|
||||
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 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: { VideoRewardTab: { TaskList: [
|
||||
{ TaskId: '1165585369246138372', Title: '看视频领福利', IsFinished: 0 },
|
||||
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 0 }
|
||||
] } } } },
|
||||
{ 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: '1165585369246138372', Title: '看视频领福利', IsFinished: 1 },
|
||||
{ TaskId: '1165585369246138370', Title: '每日签到', IsFinished: 0 }
|
||||
] } } } },
|
||||
],
|
||||
});
|
||||
assert.match(r.replies[0], /激励任务✅\(已完成,跳过 1 个需其它入口任务\)/);
|
||||
assert.equal(r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).length, 1);
|
||||
assert.doesNotMatch(r.calls.find(c => /video\/adv\/finishWatch$/.test(c.url)).body, /1165585369246138370/);
|
||||
});
|
||||
|
||||
test('adv task accepts nested data result 9 with empty message from sign gateway wrapper', () => {
|
||||
const store = {
|
||||
qdreader_cookie_json: JSON.stringify({ '12345': cookie }),
|
||||
@@ -843,6 +904,88 @@ 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', () => {
|
||||
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 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: { VideoRewardTab: { TaskList: [{ TaskId: '1187767793786748928', Title: '激励碎片', IsFinished: 0, NeedCount: 3 }] } } } },
|
||||
{ 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: { 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 }] } } } },
|
||||
],
|
||||
});
|
||||
assert.match(r.replies[0], /激励任务✅\(已完成\)/);
|
||||
const finishCalls = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url));
|
||||
assert.equal(finishCalls.length, 3);
|
||||
assert.ok(finishCalls.every(c => /1187767793786748928/.test(c.body)));
|
||||
});
|
||||
|
||||
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 }),
|
||||
qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }),
|
||||
qdreader_task_pref_json: JSON.stringify({ '12345': { extraAdv: true } }),
|
||||
};
|
||||
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: {
|
||||
CurrentTask: { TaskId: '1209756598013788162', Title: '惊喜福利任务', IsFinished: 0 },
|
||||
PackageList: { TaskList: [
|
||||
{ TaskId: '1165585369246138373', Title: '完成1个广告任务', IsFinished: 0 },
|
||||
{ TaskId: '1165585369246138372', Title: '每日任务', IsFinished: 0, NeedCount: 3 },
|
||||
] }
|
||||
} } },
|
||||
{ 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: { 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: { result: 9, message: '' } },
|
||||
{ body: { code: 0, data: { headers: { 'QD-Sign': 'sig' } } } },
|
||||
{ statusCode: 200, body: { code: 0, Data: { VideoRewardTab: { TaskList: [
|
||||
{ TaskId: '1165585369246138373', Title: '完成1个广告任务', IsFinished: 1 },
|
||||
{ TaskId: '1165585369246138372', Title: '每日任务', IsFinished: 1, NeedCount: 3 },
|
||||
] } } } },
|
||||
],
|
||||
});
|
||||
assert.match(r.replies[0], /每日任务✅\(已完成\)/);
|
||||
const bodies = r.calls.filter(c => /video\/adv\/finishWatch$/.test(c.url)).map(c => c.body);
|
||||
assert.equal(bodies.length, 5);
|
||||
assert.match(bodies[0], /1209756598013788162/);
|
||||
assert.match(bodies[1], /1165585369246138373/);
|
||||
assert.equal(bodies.filter(b => /1165585369246138372/.test(b)).length, 3);
|
||||
});
|
||||
|
||||
|
||||
test('message box skips outside Beijing 20-22 window without calling message API', () => {
|
||||
const store = {
|
||||
qdreader_cookie_json: JSON.stringify({ '12345': cookie }),
|
||||
|
||||
Reference in New Issue
Block a user