From 295e6bd0de58811ab973678bb788a43dd8348add Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sun, 17 May 2026 12:37:34 +0800 Subject: [PATCH] docs: align qx repo with legacy layout --- README.md | 118 ++++++++---------------- conf/qdreader.conf | 2 + docs/qx-rewrite-lessons.md | 71 ++++++++++++++ js/qdreader_cookie.js | 71 ++++++++++++++ qx/subscribe/qdreader.qx.snippet | 2 +- qx/subscribe/qdreader.subscription.json | 2 +- 6 files changed, 186 insertions(+), 80 deletions(-) create mode 100644 conf/qdreader.conf create mode 100644 docs/qx-rewrite-lessons.md create mode 100644 js/qdreader_cookie.js diff --git a/README.md b/README.md index 6e185f0..bbbef42 100644 --- a/README.md +++ b/README.md @@ -1,60 +1,58 @@ -# qdreader-autman-sign +# QDReader QX Cookie Capture + Autman Sign -启点读书(QDReader)Cookie 获取 + 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 ` 快速登录命令,可直接复制发给 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 启点账号 启点查询 -启点ck ... -启点签到 ... -启点读书 ... -qdreader ... -``` - -定时运行:插件头注已内置 `//[cron: 15 7 * * *]`,每日 07:15 自动执行全部账号签到。 -手动运行:直接给 Autman 机器人发送 `启点签到`;单账号发送 `启点签到 `。 - -交互命令: - -```text -启点账号 -启点查询 -启点ck 启点签到 -启点签到 -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. 风险提示 - -仅供个人学习、研究与自动化测试使用。目标接口、风控策略或签名网关变化都可能导致失效。 - diff --git a/conf/qdreader.conf b/conf/qdreader.conf new file mode 100644 index 0000000..501349f --- /dev/null +++ b/conf/qdreader.conf @@ -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 diff --git a/docs/qx-rewrite-lessons.md b/docs/qx-rewrite-lessons.md new file mode 100644 index 0000000..9146164 --- /dev/null +++ b/docs/qx-rewrite-lessons.md @@ -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 +``` + +并由 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。 diff --git a/js/qdreader_cookie.js b/js/qdreader_cookie.js new file mode 100644 index 0000000..437efe7 --- /dev/null +++ b/js/qdreader_cookie.js @@ -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 ”快速提交通道。 + const submitText = `启点ck ${cookie}` + const msg = submitText + notify('启点读书', `抓取成功 uid:${uid}`, msg, copyAction(submitText)) + $done({}) + } +} diff --git a/qx/subscribe/qdreader.qx.snippet b/qx/subscribe/qdreader.qx.snippet index e06caa4..501349f 100644 --- a/qx/subscribe/qdreader.qx.snippet +++ b/qx/subscribe/qdreader.qx.snippet @@ -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 diff --git a/qx/subscribe/qdreader.subscription.json b/qx/subscribe/qdreader.subscription.json index e06caa4..501349f 100644 --- a/qx/subscribe/qdreader.subscription.json +++ b/qx/subscribe/qdreader.subscription.json @@ -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