fix: fallback qdreader uid to cookie guid

This commit is contained in:
2026-05-17 16:47:16 +08:00
parent 2a7a4fea91
commit 11530c342d
4 changed files with 37 additions and 11 deletions
+12 -5
View File
@@ -129,22 +129,29 @@ function cookieToString(jar) {
return arr.join("; ")
}
function b64decode(s) {
s = String(s || "")
s = String(s || "").trim()
try { s = decodeURIComponent(s) } catch (e) {}
s = s.replace(/-/g, "+").replace(/_/g, "/")
while (s.length % 4) s += "="
try { if (typeof Buffer !== "undefined") return Buffer.from(s, "base64").toString("utf8") } catch (e) {}
try { return decodeURIComponent(escape(atob(s))) } catch (e) { return "" }
}
function isRealUid(uid) {
uid = String(uid === undefined || uid === null ? "" : uid).trim()
return /^\d{5,}$/.test(uid) ? uid : ""
}
function uidFromQDHeader(qdheader) {
var decoded = b64decode(qdheader)
var uid = decoded ? trim(decoded.split("|")[0] || "") : ""
return /^\d+$/.test(uid) ? uid : ""
return isRealUid(uid)
}
function extractUid(cookie) {
var jar = parseCookieString(cookie)
var uid = uidFromQDHeader(jar.QDHeader || jar.qdheader || jar.QDHEADER || "")
if (uid) return uid
if (jar.uid) return String(jar.uid)
if (jar.userid) return String(jar.userid)
return ""
uid = isRealUid(jar.uid || jar.userid || jar.userId || jar.UserId)
if (uid) return uid
return isRealUid(jar.ywguid || jar.gwguid || jar.guid)
}
function maskCookie(cookie) {
cookie = String(cookie || "")
+5 -1
View File
@@ -117,7 +117,11 @@ set(key, value)
## 签名与签到流程
1. 从 Cookie 解析 `QDHeader/qdh/uid/guid/qimei/qimei36`
1. 从 Cookie 解析账号标识与签名参数:
- 优先解析 `QDHeader` 第一段有效数字 uid
- 其次读取 `uid/userid/userId/UserId`
-`QDHeader` 第一段为 `(null)` 或无效,回退 `ywguid/gwguid/guid`,与 QX 抓包脚本保持一致;
- 同时提取 `qdh/QDHeader/guid/qimei/qimei36` 供签名网关使用。
2. `POST <qdreader_sign_api>/sign` 获取请求签名头。
3. `POST https://h5.if.qidian.com/argus/api/v3/checkin/checkin` 完成签到。
4. 写入单账号最后结果 `qdreader_last_result_json`,包括 `ok/msg/time/source/runId`
+12 -5
View File
@@ -129,22 +129,29 @@ function cookieToString(jar) {
return arr.join("; ")
}
function b64decode(s) {
s = String(s || "")
s = String(s || "").trim()
try { s = decodeURIComponent(s) } catch (e) {}
s = s.replace(/-/g, "+").replace(/_/g, "/")
while (s.length % 4) s += "="
try { if (typeof Buffer !== "undefined") return Buffer.from(s, "base64").toString("utf8") } catch (e) {}
try { return decodeURIComponent(escape(atob(s))) } catch (e) { return "" }
}
function isRealUid(uid) {
uid = String(uid === undefined || uid === null ? "" : uid).trim()
return /^\d{5,}$/.test(uid) ? uid : ""
}
function uidFromQDHeader(qdheader) {
var decoded = b64decode(qdheader)
var uid = decoded ? trim(decoded.split("|")[0] || "") : ""
return /^\d+$/.test(uid) ? uid : ""
return isRealUid(uid)
}
function extractUid(cookie) {
var jar = parseCookieString(cookie)
var uid = uidFromQDHeader(jar.QDHeader || jar.qdheader || jar.QDHEADER || "")
if (uid) return uid
if (jar.uid) return String(jar.uid)
if (jar.userid) return String(jar.userid)
return ""
uid = isRealUid(jar.uid || jar.userid || jar.userId || jar.UserId)
if (uid) return uid
return isRealUid(jar.ywguid || jar.gwguid || jar.guid)
}
function maskCookie(cookie) {
cookie = String(cookie || "")
+8
View File
@@ -65,6 +65,14 @@ test('manual cookie save masks cookie and stores by uid', () => {
assert.equal(JSON.parse(r.bucketStore['hermes_qidian.qdreader_user_bind_json'])['12345'], 'user-a');
});
test('manual cookie save falls back to ywguid when QDHeader uid is null', () => {
const fallbackCookie = 'QDHeader=KG51bGwpfHg=; ywguid=54321; qdh=qdh; sessionyw=s; appId=10';
const r = runPlugin({ content: '启点ck ' + fallbackCookie });
assert.match(r.replies.join('\n'), /CK新增成功/);
assert.match(r.replies.join('\n'), /uid: 54321/);
assert.equal(JSON.parse(r.store.qdreader_cookie_json)['54321'], fallbackCookie);
});
test('manual sign and cron sign both call sign gateway then qidian checkin', () => {
const store = { qdreader_cookie_json: JSON.stringify({ '12345': cookie }) };
const manual = runPlugin({ content: '启点签到', store: { ...store } });