Files
autman-plugins/plugins/qdreader/README.md
T

190 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 启点读书 QDReader 签到 Autman 插件
QDReader/起点读书 Autman 签到插件。用户侧触发词统一使用“启点”,避免平台关键词麻烦;QX 只负责抓取 Cookie。账号管理、执行查询、签到和日志归档都在同一个 Autman 插件内完成;只使用一个简单 cron 表达式 `1 7 * * *`:每日 07:01 执行签到,签到运行结束后马上把本次运行日志写入归档并清空最近运行日志,不再依赖零点归档定时。
## 文件位置
正式插件文件:
```text
plugins/qdreader/qdreader_sign_autman.js # 单插件单 cron:07:01 签到;运行后立即归档清日志
```
实机 JS 导入副本:
```text
js/qdreader_sign_autman.js
```
Raw 链接:
```text
https://gitea.chickliu.fun/Hermes/autman-plugins/raw/branch/main/plugins/qdreader/qdreader_sign_autman.js
https://gitea.chickliu.fun/Hermes/autman-plugins/raw/branch/main/js/qdreader_sign_autman.js
```
## 当前交互设计
### 一级菜单
```text
启点账号
启点查询
启点任务
```
`启点账号` 只负责账号管理:
```text
启点账号管理
1. 查看账号
2. 添加/更新账号
3. 账号详情/修改备注
4. 删除账号
5. 清空账号
q. 退出
请回复序号
```
`启点查询` 只负责最后执行日志和执行动作,不做实时接口查询:
```text
启点查询(最近签到记录)
1. 查看最近签到记录
2. 查询单个账号最近记录
3. 立即执行签到
q. 退出
请回复序号
```
`启点任务` 负责完整任务模块开关:
```text
启点完全体任务开关:
1. 领取奖励:开启(固定)
2. 激励任务:关闭
3. 每日任务:关闭
4. 每日抽奖:关闭
5. 每周兑换:关闭
6. 章节卡片:关闭
7. 大咖荐书:关闭
回复:序号 on/off 切换,例如 2 onq 退出
```
默认只执行签到 + 领取奖励;其余任务按上游完全体模块接入但默认关闭,避免广告/抽奖/兑换类接口在未确认前自动运行。开启后,签到链路会按账号依次追加对应模块,单个模块失败会记录为该账号“部分任务失败”,不会暴露 Cookie。
### 快速通道
```text
启点ck <QX抓到的完整cookie>
启点签到
启点签到 <uid>
启点归档
qdreader sign
qdreader archive
```
`启点ck` 只保留快速提交 Cookie,不再承担查询/导出/批量导入等管理功能。
## 账号与备注
- 保存 Cookie 后必须绑定当前 `sender.getUserID()`;无法识别当前用户时拒绝保存。
- 查询、删除、手动签到默认只操作当前用户绑定的账号。
- 未绑定到当前用户的全局 CK 不会在普通用户菜单中显示,也不会被普通用户手动签到使用。
- 已绑定其他用户的 UID 不能被当前用户覆盖更新。
- 账号详情、删除、单账号查询都使用编号选择,不要求用户复制/输入 UID。
- 添加/更新账号后会提示是否添加备注。
- 修改备注在“账号详情/修改备注”中完成。
- 删除账号或清空当前用户账号时,会同步清理对应备注。
- 普通回复只展示脱敏 UID 和备注,不输出完整 Cookie。
## 存储
主数据桶:
```text
hermes_qidian
```
主要 key
```text
qdreader_cookie_json # uid -> full cookie
qdreader_user_bind_json # uid -> sender.getUserID(),用户绑定索引
qdreader_remark_json # uid -> 备注名
qdreader_last_result_json # uid -> 单账号当前批次结果 JSON 字符串(签到运行后归档并清空)
qdreader_last_run_json # 当前批次日志、来源和汇总(签到运行后归档并清空)
qdreader_archive_json # yyyy-mm-dd -> 已归档批次日志,用于判断历史签到结果
qdreader_sign_api # 签名网关
qdreader_retry_count # 请求失败重试次数
qdreader_cron_silent # 定时无账号静默
qdreader_adv_job_enable # 激励任务开关,默认 false
qdreader_extra_adv_job_enable # 每日任务开关,默认 false
qdreader_lottery_enable # 每日抽奖开关,默认 false
qdreader_weekly_exchange_enable # 每周兑换开关,默认 false
qdreader_chapter_card_enable # 章节卡片开关,默认 false
qdreader_message_box_enable # 大咖荐书开关,默认 false
```
读取顺序:
```text
bucketGet("hermes_qidian", key)
↓ fallback
get(key)
```
写入顺序:
```text
bucketSet("hermes_qidian", key, value)
set(key, value)
```
说明:`qdreader_user_bind_json` 之前已经由代码写入,但早期插件头部只声明了 `qdreader_cookie_json` 等少数参数,部分 Autman 数据桶/参数 UI 只展示声明过的 key,所以你可能看不到绑定项。v2.3.4 已把绑定、备注、最近结果、最近批次日志都补成显式 `[param]`,便于在数据桶 UI 中直接查看。
## 签名与签到流程
1. 从 Cookie 解析账号标识与签名参数:
- 优先解析 `QDHeader` 第一段有效数字 uid
-`QDHeader` 第一段为 `(null)` 或无效,继续检查 `QDHeader` 第 12 段的真实 `UserId`
- 再读取 `uid/userid/userId/UserId`
- 最后才回退 `ywguid/gwguid/guid`,与 QX 抓包脚本保持一致;
- 同时提取 `qdh/QDHeader/guid/qimei/qimei36` 供签名网关使用,其中 `qdh` 只取 Cookie 的 `qdh/QDH`,不再用 `QDHeader` 顶替,避免签名网关 `decodeQDHAuto` 解码失败。
2. `POST <qdreader_sign_api>/sign` 获取请求签名头。默认签名网关基址是 `https://api.120399.xyz/qdreader`
3. `POST https://h5.if.qidian.com/argus/api/v3/checkin/checkin` 完成签到。
4. 追加完全体任务链路:
- 固定执行领取奖励状态查询:`GET /argus/api/v3/checkin/getcurrentweekcheckininfo`
- 可选激励任务:`GET /argus/api/v2/video/adv/mainPage`
- 可选每日任务:`GET /argus/api/v2/video/adv/packageList`
- 可选每日抽奖:`POST /argus/api/v2/video/lottery`
- 可选每周兑换:`GET /argus/api/v2/video/exchange/page`,仅北京时间周日执行;
- 可选章节卡片:`GET /argus/api/v2/video/chapterCard/info`
- 可选大咖荐书:`GET /ajax/message/getMessageBox`
5. 写入单账号当日结果 `qdreader_last_result_json`,包括 `ok/msg/time/source/runId/tasks`
6. 写入当日批次日志 `qdreader_last_run_json`,包括触发来源、开始/结束时间、成功/失败/总数和每账号结果;即使账号执行异常也会记录失败日志。
7. 插件内只有一个 cron`1 7 * * *`
8. 每日 07:01 触发时执行签到链路。
9. 签到运行结束后,马上把本次 `qdreader_last_run_json` 按完成日期写入 `qdreader_archive_json`,再清空 `qdreader_last_result_json` / `qdreader_last_run_json`;手动签到同样会立即归档。
10. 汇总每个账号签到/完整任务结果,并在回复中提示归档日期。
## 查询数据来源
`启点查询` 不请求起点实时接口,只读取最后执行日志:
```text
qdreader_last_run_json # 当日/当前批次
qdreader_last_result_json # 每个 uid 当日/当前批次结果
qdreader_archive_json # 每次签到后立即归档的历史批次
```
因此“查询”语义是“最近签到记录/最后执行日志”。刚添加但从未执行过的账号会显示“暂无执行记录”。因为签到完成后最近日志会立即归档并清空,`启点查询` 会回退到最近归档,根据归档中的账号结果判断最近签到情况并反馈给用户。查询输出会加工成“批次/来源/汇总/结果明细”结构,时间压缩到分钟,过长的接口错误/原始响应会截断,避免刷屏。所有日志时间和归档日期统一按北京时间计算,避免 UTC 跨日导致日期错位。
## 本地验证
```bash
node -c plugins/qdreader/qdreader_sign_autman.js
node -c js/qdreader_sign_autman.js
node tests/qdreader_plugin.test.mjs
```