diff --git a/README.md b/README.md index 8a73aed..0c4f2dd 100644 --- a/README.md +++ b/README.md @@ -62,15 +62,18 @@ GET /api/sms/stats 初始通用仓库骨架已创建。等待 BOSS 上传既有 Autman 插件后,再按实际风格补齐实现。 -### 起点读书 QDReader 签到插件 +### 启点读书 QDReader 签到插件 - 正式源码:`plugins/qdreader/qdreader_sign_autman.js` - 实机 JS 副本:`js/qdreader_sign_autman.js` - 定时运行:`cron: 1 7 * * *`,每日 07:01 自动签到;签到结束后立即归档并清空最近运行日志 - 手动运行:`启点签到` / `启点签到 ` - Cookie 维护:`启点账号` / `启点ck ` / `启点查询` -- 完全体任务:`启点任务` 菜单按需开启激励任务、每日任务、每日抽奖、每周兑换、章节卡片、大咖荐书;默认只执行签到 + 领取奖励 -- v2.6.0:适配上游 QDReader 完全体任务框架,保留 Autman 单插件、独立 bucket、多用户隔离、手动只跑当前用户、cron 跑全部账号、运行后立即归档清日志。 +- 任务配置入口:`启点账号` → `账号任务配置`,按账号保存到 `qdreader_task_pref_json`;`all on/off` 只影响选中的账号 +- 默认执行:主签到 `/argus/api/v3/checkin/checkin` + 固定低风险领取奖励 `/argus/api/v3/checkin/receivegifts` +- 可选任务(默认关闭):激励任务 `mainPage`/`finishWatch`、每日任务 `packagelist`/`finishWatch`、每日抽奖 `detail`/`lottery`、每周兑换 `checkinexchangepage`/`exchangegoods`(仅周日)、章节卡片 `chaptercardwithbook`、大咖荐书 `pullmessage`(仅北京时间 20:00-22:00) +- 签名环境:相对路径走 `https://h5.if.qidian.com`;大咖荐书使用绝对地址 `https://magev6.if.qidian.com/argus/api/v2/message/pullmessage`;请求签名 method 使用小写;Autman 运行时需支持 `BigInt`(插件避免使用 BigInt 字面量以兼容较旧 JS 解析器) +- v2.10.3:复核全部任务矩阵、补齐执行窗口/接口文档,并移除 BigInt 字面量,保留 Autman 单插件、独立 bucket、多用户隔离、手动只跑当前用户、cron 跑全部账号、运行后立即归档清日志。 Raw 导入: diff --git a/js/qdreader_sign_autman.js b/js/qdreader_sign_autman.js index 0609f9a..0b1ec3d 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.2] +//[version: 2.10.3] //[platform: web,qq,wx,tg,tb,fs,we] //[public: false] //[price: 0] @@ -605,9 +605,11 @@ function taskFinished(task) { return Number(field(task, ["IsFinished", "Finished function makeBase62Token(num) { var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" var n = BigInt(num) - if (n === BigInt(0)) return "0" + var zero = BigInt(0) + var base = BigInt(62) + if (n === zero) return "0" var out = "" - while (n > 0n) { out = alphabet[Number(n % 62n)] + out; n = n / 62n } + while (n > zero) { out = alphabet[Number(n % base)] + out; n = n / base } return out } function doReceiveGifts(cookie) { diff --git a/plugins/qdreader/qdreader_sign_autman.js b/plugins/qdreader/qdreader_sign_autman.js index 0609f9a..0b1ec3d 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.2] +//[version: 2.10.3] //[platform: web,qq,wx,tg,tb,fs,we] //[public: false] //[price: 0] @@ -605,9 +605,11 @@ function taskFinished(task) { return Number(field(task, ["IsFinished", "Finished function makeBase62Token(num) { var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" var n = BigInt(num) - if (n === BigInt(0)) return "0" + var zero = BigInt(0) + var base = BigInt(62) + if (n === zero) return "0" var out = "" - while (n > 0n) { out = alphabet[Number(n % 62n)] + out; n = n / 62n } + while (n > zero) { out = alphabet[Number(n % base)] + out; n = n / base } return out } function doReceiveGifts(cookie) { diff --git a/tests/qdreader_plugin.test.mjs b/tests/qdreader_plugin.test.mjs index e2d20e8..327c21c 100644 --- a/tests/qdreader_plugin.test.mjs +++ b/tests/qdreader_plugin.test.mjs @@ -70,6 +70,31 @@ function test(name, fn) { } } + + +test('plugin source avoids BigInt literal syntax for older Autman JS parsers', () => { + assert.doesNotMatch(code, /\b\d+n\b/); +}); + +test('README documents QDReader task schedule windows and required endpoints', () => { + const readme = fs.readFileSync(new URL('../README.md', import.meta.url), 'utf8'); + for (const token of [ + 'cron: 1 7 * * *', + 'qdreader_task_pref_json', + 'receivegifts', + 'mainPage', + 'finishWatch', + 'packagelist', + 'lottery', + 'checkinexchangepage', + 'exchangegoods', + 'chaptercardwithbook', + '20:00-22:00', + 'magev6.if.qidian.com/argus/api/v2/message/pullmessage', + 'BigInt', + ]) assert.match(readme, new RegExp(token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); +}); + test('manual cookie save masks cookie and stores by uid', () => { const r = runPlugin({ content: '启点ck ' + cookie }); assert.match(r.replies.join('\n'), /CK新增成功/);