68 lines
2.7 KiB
Markdown
68 lines
2.7 KiB
Markdown
# QX 重写制作经验(QDReader 复盘)
|
||
|
||
## 仓库结构
|
||
|
||
参考 `chickliu/qx` 老仓库风格,仓库只保留通用顶层目录,不再保留旧兼容路径:
|
||
|
||
```text
|
||
conf/ # Quantumult X 远程重写订阅文本
|
||
js/ # Rewrite 脚本入口,订阅文本直接引用这里
|
||
```
|
||
|
||
## QX 订阅格式
|
||
|
||
BOSS 常用的远程订阅不是 JSON 对象,而是类似下面的纯文本:
|
||
|
||
```text
|
||
hostname = h5.if.qidian.com
|
||
^https:\/\/h5\.if\.qidian\.com\/argus\/api\/v1\/user\/getlogininfo url script-response-body https://gitea.chickliu.fun/Hermes/qx/raw/branch/main/js/qdreader_cookie.js
|
||
```
|
||
|
||
注意:即使文件名叫 `*.json`,只要给 QX 作为重写订阅使用,内容也应该是这种文本格式,而不是 JSON object。
|
||
|
||
## QDReader 这类 Cookie 捕获脚本原则
|
||
|
||
1. QX 只负责抓取 Cookie,不直接调用 Autman。
|
||
2. 不在 QX 本地持久化 Cookie;账号保存交给 Autman 插件。
|
||
3. 弹窗正文只保留完整快速提交命令,格式优先保持原项目数据形态 `{"uid":"cookie"}`;通知不附加跳转动作,避免点击通知时直接运行快捷指令,影响进入通知详情复制。
|
||
|
||
```text
|
||
启点ck {"<uid>":"<完整 Cookie>"}
|
||
```
|
||
|
||
4. 不要在弹窗正文加说明、账号数、变量名、截断摘要;BOSS 要直接复制整段命令。
|
||
5. 失败弹窗可以保留简短错误,例如“请求中没有 Cookie”“无法识别 uid”。
|
||
6. uid 识别优先级:
|
||
- `QDHeader` 第一段是有效数字 uid 时优先使用;
|
||
- Stream 抓包确认:当 `QDHeader` 第一段是 `(null)` 时,第 12 段(索引 11)可能是真实 `UserId`,应优先于 `ywguid` 使用;
|
||
- 响应体里递归查找 `UserId` / `userId` / `uid`;
|
||
- 最后再回退到 Cookie 里的 `ywguid` / `gwguid` / `guid`,仅用于确认账号已识别,不在通知标题显示 uid。
|
||
- 只读请求头 Cookie:`script-request-header` 即可;
|
||
- 需要读取响应 body 辅助解析 uid:用 `script-response-body`。
|
||
QDReader 当前需要兼容从响应 body 取 `UserId`,所以使用 `script-response-body`。
|
||
|
||
## 与 Autman 插件配合
|
||
|
||
Autman 插件保留快捷命令:
|
||
|
||
```text
|
||
启点ck <cookie>
|
||
```
|
||
|
||
并由 Autman 负责:
|
||
|
||
- 解析 uid;
|
||
- 保存到专属 bucket,例如 `hermes_qidian`;
|
||
- 绑定发送者用户 ID;
|
||
- 后续账号管理、备注、签到和最后执行日志查询。
|
||
|
||
## 验证清单
|
||
|
||
- `node --check js/qdreader_cookie.js`
|
||
- `node tests/qdreader_cookie.test.mjs`
|
||
- raw 地址返回 HTTP 200:
|
||
- `conf/qdreader.conf`
|
||
- `js/qdreader_cookie.js`
|
||
- 订阅文本内容第一行是 `hostname = ...`,第二行是 rewrite rule。
|
||
- 新增重写时按 `conf/<name>.conf` + `js/<name>.js` 放置,不再创建 `qx/subscribe/` 或 `qx/rewrite/` 兼容目录。
|