docs: align qx repo with legacy layout

This commit is contained in:
2026-05-17 12:37:34 +08:00
parent de33953c3c
commit 295e6bd0de
6 changed files with 186 additions and 80 deletions
+40 -78
View File
@@ -1,60 +1,58 @@
# qdreader-autman-sign
# QDReader QX Cookie Capture + Autman Sign
启点读书(QDReaderCookie 获取 + Autman 机器人签到插件
起点读书 / 启点读书 Cookie 抓取脚本。Quantumult X 只负责抓取 Cookie 并弹窗展示完整 Autman 快速提交命令;账号保存、备注、签到和最后执行日志由统一 Autman 插件仓库负责
设计修正后:**Quantumult X 只负责获取 Cookie****Autman 插件负责保存 Cookie 并执行签到**。签到请求复用上游 `Yuheng0101/X/Tasks/QDReader` 的核心方式:用 H5 Cookie 解析 `QDHeader/uid/guid/qimei`,调用签名网关 `https://api.120399.xyz/sign` 生成起点接口所需签名头,再请求起点 H5 福利中心签到接口。
## 仓库结构
## 目录
```text
conf/qdreader.conf # QX 远程重写订阅文本,参考 chickliu/qx 老仓库风格
js/qdreader_cookie.js # QX Rewrite 脚本入口
qx/subscribe/qdreader.subscription.json # 兼容旧订阅地址,内容同 conf/qdreader.conf
qx/subscribe/qdreader.qx.snippet # 兼容旧片段地址,内容同 conf/qdreader.conf
qx/rewrite/qdreader_cookie.js # 兼容旧脚本地址,内容同 js/qdreader_cookie.js
docs/qx-rewrite-lessons.md # 本次制作经验
source/qdreader.upstream.js # 上游 QDReader 脚本备份
```
- `qx/rewrite/qdreader_cookie.js`QX 重写 JS,拦截起点读书 `getlogininfo`,不本地持久化,只弹窗展示完整快速登录命令 + CK。
- `qx/subscribe/qdreader.qx.snippet`QX 订阅片段。
- `qx/subscribe/qdreader.subscription.json`:QX 重写远程订阅文本(按 BOSS 常用命名保留 `.json` 后缀,但内容是 Quantumult X 订阅文本,不是 JSON 对象)。
- Autman 正式插件已迁移到统一插件仓库:`Hermes/autman-plugins/plugins/qdreader/qdreader_sign_autman.js`
- `autman/qdreader_cookie_autman.js`:旧版仅保存 CK 插件,保留兼容,不再推荐。
- `source/qdreader.upstream.js`:上游 QDReader 脚本备份。
## QX 订阅地址
## 1. Quantumult X 获取 Cookie
推荐使用老仓库风格地址:
订阅地址:
```text
https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/conf/qdreader.conf
```
兼容旧地址:
```text
https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/qx/subscribe/qdreader.subscription.json
```
备用片段:
```text
https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/qx/subscribe/qdreader.qx.snippet
```
两者内容相同,都是 Quantumult X 可识别的远程重写文本:
## 订阅内容
```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/qdreader-qx-cookie-autman-bot/raw/branch/main/qx/rewrite/qdreader_cookie.js
^https:\/\/h5\.if\.qidian\.com\/argus\/api\/v1\/user\/getlogininfo url script-response-body https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/js/qdreader_cookie.js
```
手动配置核心内容:
## 使用流程
```ini
[mitm]
hostname = h5.if.qidian.com
[rewrite_local]
^https?:\/\/h5\.if\.qidian\.com\/argus\/api\/v1\/user\/getlogininfo url script-response-body https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/qx/rewrite/qdreader_cookie.js
```
抓取步骤:
1. QX 开启 MitM 并信任证书。
2. 启用上面的重写。
1. QX 添加上面的订阅地址。
2. 开启 MitM,并信任证书。
3. 打开起点读书 App → 我的 → 福利中心。
4. QX 通知/弹窗正文只包含完整 `启点ck <cookie>` 快速登录命令,可直接复制发给 Autman 机器人。
5. QX 不再写入本地持久化变量;账号保存由 Autman 插件完成。
4. QX 弹窗正文只显示:
## 2. Autman 签到插件
```text
启点ck <完整 Cookie>
```
导入推荐插件(统一 Autman 插件仓库):
5. 复制整段发给 Autman 机器人。
QX 不本地持久化 Cookie,也不主动请求 Autman。
## Autman 插件
正式插件在统一仓库:
```text
https://gitea.chickliu.fun/Hermes/autman-plugins/raw/branch/main/plugins/qdreader/qdreader_sign_autman.js
@@ -66,55 +64,19 @@ https://gitea.chickliu.fun/Hermes/autman-plugins/raw/branch/main/plugins/qdreade
https://gitea.chickliu.fun/Hermes/autman-plugins/raw/branch/main/js/qdreader_sign_autman.js
```
插件规则
主要命令
```text
启点ck <cookie>
启点账号
启点查询
启点ck ...
启点签到 ...
启点读书 ...
qdreader ...
```
定时运行:插件头注已内置 `//[cron: 15 7 * * *]`,每日 07:15 自动执行全部账号签到。
手动运行:直接给 Autman 机器人发送 `启点签到`;单账号发送 `启点签到 <uid>`
交互命令:
```text
启点账号
启点查询
启点ck <QX抓到的完整cookie>
启点签到
启点签到 <uid>
qdreader sign
```
保存位置:Autman 插件专属 bucket `hermes_qidian.qdreader_cookie_json`,格式兼容上游脚本环境变量 `QDREADER_COOKIE`
## 制作经验
```json
{"uid":"cookie"}
```
签名网关参数:`hermes_qidian.qdreader_sign_api`,默认:
详见:
```text
https://api.120399.xyz
docs/qx-rewrite-lessons.md
```
## 3. 签到实现说明
Autman 插件内置执行:
1. 从 Cookie 解析:`QDHeader/qdh/uid/guid/qimei/qimei36/sessionyw/appId`
2. 调用签名网关:`POST https://api.120399.xyz/sign`
3. 对起点接口发起签到:`POST https://h5.if.qidian.com/argus/api/v3/checkin/checkin`
4. 汇总每个 uid 的执行结果回复给机器人会话。
> 注意:签名算法依赖上游相同的第三方签名网关;如果 `api.120399.xyz` 失效,需要替换 `qdreader_sign_api` 或重做本地签名实现。
## 4. 风险提示
仅供个人学习、研究与自动化测试使用。目标接口、风控策略或签名网关变化都可能导致失效。
+2
View File
@@ -0,0 +1,2 @@
hostname = h5.if.qidian.com
^https:\/\/h5\.if\.qidian\.com\/argus\/api\/v1\/user\/getlogininfo url script-response-body https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/js/qdreader_cookie.js
+71
View File
@@ -0,0 +1,71 @@
# QX 重写制作经验(QDReader 复盘)
## 仓库结构
参考 `chickliu/qx` 老仓库风格,推荐保留这两个顶层目录:
```text
conf/ # Quantumult X 远程重写订阅文本
js/ # Rewrite 脚本入口,订阅文本直接引用这里
```
本仓库为了兼容历史路径,也保留:
```text
qx/subscribe/ # 旧订阅地址,内容与 conf/qdreader.conf 同步
qx/rewrite/ # 旧脚本地址,内容与 js/qdreader_cookie.js 同步
```
## 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/qdreader-qx-cookie-autman-bot/raw/branch/main/js/qdreader_cookie.js
```
注意:即使文件名叫 `*.json`,只要给 QX 作为重写订阅使用,内容也应该是这种文本格式,而不是 JSON object。
## QDReader 这类 Cookie 捕获脚本原则
1. QX 只负责抓取 Cookie,不直接调用 Autman。
2. 不在 QX 本地持久化 Cookie;账号保存交给 Autman 插件。
3. 弹窗正文只保留完整快速提交命令:
```text
启点ck <完整 Cookie>
```
4. 不要在弹窗正文加说明、账号数、变量名、截断摘要;BOSS 要直接复制整段命令。
5. 失败弹窗可以保留简短错误,例如“请求中没有 Cookie”“无法识别 uid”。
6. Rewrite 类型按实际取值选择:
- 只读请求头 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 --check qx/rewrite/qdreader_cookie.js`
- raw 地址返回 HTTP 200
- `conf/qdreader.conf`
- `js/qdreader_cookie.js`
- 兼容旧地址 `qx/subscribe/qdreader.subscription.json`
- 兼容旧地址 `qx/rewrite/qdreader_cookie.js`
- 订阅文本内容第一行是 `hostname = ...`,第二行是 rewrite rule。
+71
View File
@@ -0,0 +1,71 @@
/*
* 启点读书 Cookie 自动获取/更新 - Quantumult X
* 只负责抓取 Cookie 并弹窗展示“复制给 Autman 机器人”的快速登录命令,不主动请求 Autman,也不本地持久化。
*
* 抓取:打开起点读书 App → 我的 → 福利中心。
* 抓到后会:
* 1. 解析 uid 用于弹窗标题
* 2. 通知/弹窗里展示完整快速登录命令 + CK,便于直接复制
*/
function getHeader(headers, name) {
const lower = String(name).toLowerCase()
for (const k in (headers || {})) if (String(k).toLowerCase() === lower) return headers[k]
return ''
}
function parseCookie(cookie) {
const jar = {}
String(cookie || '').split(';').forEach(part => {
const i = part.indexOf('=')
if (i <= 0) return
const k = part.slice(0, i).trim()
const v = part.slice(i + 1).trim()
if (k) jar[k] = v
})
return jar
}
function b64decode(s) {
try { return decodeURIComponent(escape(atob(String(s || '')))) } catch (e) { return '' }
}
function uidFromQDHeader(qdheader) {
const decoded = b64decode(qdheader)
return decoded ? String(decoded.split('|')[0] || '').trim() : ''
}
function parseJson(s, def) { try { return JSON.parse(s) } catch (e) { return def } }
function getUid(cookie, body) {
const jar = parseCookie(cookie)
let uid = uidFromQDHeader(jar.QDHeader || jar.qdheader || jar.QDHEADER || '')
if (uid) return uid
if (jar.uid) return String(jar.uid)
const obj = parseJson(body || '', null)
uid = obj && obj.Data && obj.Data.UserInfo && (obj.Data.UserInfo.UserId || obj.Data.UserInfo.userId)
return uid ? String(uid) : ''
}
function notify(title, sub, msg, opts) {
try { $notify(title, sub || '', msg || '', opts || {}) } catch (e) { $notify(title, sub || '', msg || '') }
}
function copyAction(command) {
return {
'open-url': 'shortcuts://run-shortcut?name=Copy&input=text&text=' + encodeURIComponent(command),
'media-url': 'data:text/plain;charset=utf-8,' + encodeURIComponent(command)
}
}
const cookie = getHeader($request && $request.headers, 'Cookie')
if (!cookie) {
notify('启点读书', 'Cookie 获取失败', '请求中没有 Cookie')
$done({})
} else {
const body = typeof $response !== 'undefined' ? ($response.body || '') : ''
const uid = getUid(cookie, body)
if (!uid) {
notify('启点读书', 'Cookie 获取失败', '无法识别 uid,请确认已登录并进入福利中心')
$done({})
} else {
// 发给 Autman 机器人的完整快速登录命令。Autman 插件保留“启点ck <cookie>”快速提交通道。
const submitText = `启点ck ${cookie}`
const msg = submitText
notify('启点读书', `抓取成功 uid:${uid}`, msg, copyAction(submitText))
$done({})
}
}
+1 -1
View File
@@ -1,2 +1,2 @@
hostname = h5.if.qidian.com
^https:\/\/h5\.if\.qidian\.com\/argus\/api\/v1\/user\/getlogininfo url script-response-body https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/qx/rewrite/qdreader_cookie.js
^https:\/\/h5\.if\.qidian\.com\/argus\/api\/v1\/user\/getlogininfo url script-response-body https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/js/qdreader_cookie.js
+1 -1
View File
@@ -1,2 +1,2 @@
hostname = h5.if.qidian.com
^https:\/\/h5\.if\.qidian\.com\/argus\/api\/v1\/user\/getlogininfo url script-response-body https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/qx/rewrite/qdreader_cookie.js
^https:\/\/h5\.if\.qidian\.com\/argus\/api\/v1\/user\/getlogininfo url script-response-body https://gitea.chickliu.fun/Hermes/qdreader-qx-cookie-autman-bot/raw/branch/main/js/qdreader_cookie.js