207 lines
10 KiB
Markdown
207 lines
10 KiB
Markdown
# 启点读书 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. 立即执行签到
|
||
q. 退出
|
||
请回复序号
|
||
```
|
||
|
||
`启点账号` 内的“账号任务配置”负责完整任务模块开关,开关直接写入对应账号:
|
||
|
||
```text
|
||
启点账号管理
|
||
1. 查看账号
|
||
2. 添加/更新账号
|
||
3. 账号详情/修改备注
|
||
4. 账号任务配置
|
||
5. 删除账号
|
||
6. 清空账号
|
||
q. 退出
|
||
请回复序号
|
||
```
|
||
|
||
选择账号后显示该账号自己的任务开关:
|
||
|
||
```text
|
||
启点账号任务开关:12***45
|
||
1. 领取奖励:开启(固定)
|
||
2. 激励任务:关闭
|
||
3. 每日任务:关闭
|
||
4. 每日抽奖:关闭
|
||
5. 每周兑换:关闭(仅周日执行)
|
||
6. 章节卡片:关闭
|
||
7. 大咖荐书:关闭
|
||
回复:序号 on/off 切换,例如 2 on;all on 一键开启;all off 一键关闭;q 退出
|
||
```
|
||
|
||
默认只执行签到 + 领取奖励;其余任务按上游完全体模块接入但默认关闭,避免广告/抽奖/兑换类接口在未确认前自动运行。可用 `all on` / `all off` 对选中账号一键开启/关闭全部可选任务;开启后只对该账号生效,签到链路会按账号读取自己的任务配置,单个模块失败会记录为该账号“部分任务失败”,不会暴露 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 # 旧全局大咖荐书开关,v2.7 起不再作为运行依据
|
||
qdreader_task_pref_json # uid -> { taskKey: boolean },每个账号自己的附加任务开关
|
||
```
|
||
|
||
读取顺序:
|
||
|
||
```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. “今日已签到/已经签到/重复签到”等签到响应按成功处理,避免重复执行时误计失败。
|
||
5. 按账号读取 `qdreader_task_pref_json` 后追加完全体任务链路:
|
||
- 固定执行领取奖励:`POST /argus/api/v3/checkin/receivegifts`;
|
||
- 可选激励任务:严格按上游原项目控制流执行:`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`,仅北京时间周日执行;
|
||
- 可选章节卡片:`GET /argus/api/v1/readtime/scoremall/chaptercardwithbook`;
|
||
- 可选大咖荐书:按上游逻辑用 `UserId` 生成 base62 消息 token,先 `pullmessage` 拉会话列表,再带 `senderId` 拉消息、提取最近消息里的 `orderId`,随后调用 `/argus/api/v2/recommend/getrewarddetail` 和 `rewardcallback/addbookshelf` 处理奖励;不是只请求一次 `pullmessage`。
|
||
6. 对签名网关返回 `url 不在允许的接口列表内` 的可选任务,记为“已跳过”而不是账号失败,用于兼容网关白名单尚未覆盖的上游接口。
|
||
7. 写入单账号当日结果 `qdreader_last_result_json`,包括 `ok/msg/time/source/runId/tasks`。
|
||
8. 写入当日批次日志 `qdreader_last_run_json`,包括触发来源、开始/结束时间、成功/失败/总数和每账号结果;即使账号执行异常也会记录失败日志。
|
||
9. 插件内只有一个 cron:`1 7 * * *`。
|
||
10. 每日 07:01 触发时执行签到链路。
|
||
11. 签到运行结束后,马上把本次 `qdreader_last_run_json` 按完成日期写入 `qdreader_archive_json`,再清空 `qdreader_last_result_json` / `qdreader_last_run_json`;手动签到同样会立即归档。
|
||
12. 汇总每个账号签到/完整任务结果,并在回复中提示归档日期。
|
||
|
||
## 查询数据来源
|
||
|
||
`启点查询` 不请求起点实时接口,只读取最后执行日志:
|
||
|
||
```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
|
||
```
|
||
|
||
|
||
## v2.10.1 现场失败修正
|
||
|
||
- `finishWatch` 的上游/签名网关响应可能使用小写 `result=9`,现在和 `Result=9` 一样按“已受理,需回查”处理,避免激励任务误报 `任务 ... 失败`。
|
||
- 大咖荐书继续使用上游 base62 token,不再回退十进制 token;若线上仍返回“参数错误”,优先确认 Autman 已重新导入本版本,而不是旧版只请求一次 `pullmessage`。
|
||
|
||
|
||
## v2.10.2 现场失败修正
|
||
|
||
- `finishWatch` 兼容响应码嵌在 `data/Data.result` 的网关包装形态,避免空 message 时继续误报具体任务失败。
|
||
- 大咖荐书恢复执行时间窗口限制:仅北京时间 20:00-22:00 执行,其他时间标记为跳过,不再调用消息接口导致“参数错误”。
|