diff --git a/js/qdreader_sign_autman.js b/js/qdreader_sign_autman.js index ad64239..f39f36b 100644 --- a/js/qdreader_sign_autman.js +++ b/js/qdreader_sign_autman.js @@ -554,18 +554,46 @@ function handleDelete(arg, store, bind) { setStore(store); setBindStore(bind); setRemarkStore(remarks) return "已删除 uid: " + duid } +function normalizeCookieInput(arg) { + var s = trim(arg) + var obj = safeJsonParse(s, null) + if (isObject(obj)) { + var out = [] + for (var uid in obj) if (obj.hasOwnProperty(uid)) { + var realUid = isRealUid(uid) + var cookie = trim(obj[uid]) + if (!realUid || !cookie) continue + out.push({ uid: realUid, cookie: cookie }) + } + return out + } + return [{ uid: "", cookie: s }] +} function handleSaveCookie(arg, store, bind) { - var cookie = arg - if (cookie.indexOf("=") < 0 || cookie.indexOf(";") < 0) return "未识别到 Cookie。请发送:启点ck " - var uid = extractUid(cookie) - if (!uid) return "无法从 Cookie 识别 uid。请确认 QX 抓的是启点读书福利中心 getlogininfo 请求,Cookie 内应包含 QDHeader 或 uid。" - var isNew = !store[uid] - var changed = store[uid] !== cookie + var entries = normalizeCookieInput(arg) + if (!entries.length) return "未识别到 Cookie。请发送:启点ck {\"uid\":\"cookie\"} 或 启点ck " var me = currentUserId() - store[uid] = cookie - if (me) bind[uid] = me + var lines = [] + for (var i = 0; i < entries.length; i++) { + var cookie = entries[i].cookie + if (cookie.indexOf("=") < 0 || cookie.indexOf(";") < 0) return "未识别到 Cookie。请发送:启点ck {\"uid\":\"cookie\"} 或 启点ck " + var parsedUid = extractUid(cookie) + var uid = entries[i].uid || parsedUid + if (!uid) return "无法从 Cookie 识别 uid。请确认 QX 抓的是启点读书福利中心 getlogininfo 请求,Cookie 内应包含 QDHeader 或 uid。" + var isNew = !store[uid] + var changed = store[uid] !== cookie + store[uid] = cookie + if (me) bind[uid] = me + lines.push("启点读书CK" + (isNew ? "新增" : (changed ? "更新" : "未变化")) + "成功") + lines.push("uid: " + uid) + if (entries.length > 1 && parsedUid && parsedUid !== uid) lines.push("提示: JSON uid 与 Cookie 解析 uid 不一致,已按 JSON uid 保存") + } setStore(store); setBindStore(bind) - return ["启点读书CK" + (isNew ? "新增" : (changed ? "更新" : "未变化")) + "成功", "uid: " + uid, me ? ("绑定用户: " + maskUid(me)) : "绑定用户: 未识别", "账号数: " + visibleUids(store, bind, false).length, "cookie: " + maskCookie(cookie), "签到:发送 启点签到"].join("\n") + lines.push(me ? ("绑定用户: " + maskUid(me)) : "绑定用户: 未识别") + lines.push("账号数: " + visibleUids(store, bind, false).length) + lines.push("cookie: " + maskCookie(entries[0].cookie)) + lines.push("签到:发送 启点签到") + return lines.join("\n") } function main() { var text = contentText() diff --git a/plugins/qdreader/qdreader_sign_autman.js b/plugins/qdreader/qdreader_sign_autman.js index ad64239..f39f36b 100644 --- a/plugins/qdreader/qdreader_sign_autman.js +++ b/plugins/qdreader/qdreader_sign_autman.js @@ -554,18 +554,46 @@ function handleDelete(arg, store, bind) { setStore(store); setBindStore(bind); setRemarkStore(remarks) return "已删除 uid: " + duid } +function normalizeCookieInput(arg) { + var s = trim(arg) + var obj = safeJsonParse(s, null) + if (isObject(obj)) { + var out = [] + for (var uid in obj) if (obj.hasOwnProperty(uid)) { + var realUid = isRealUid(uid) + var cookie = trim(obj[uid]) + if (!realUid || !cookie) continue + out.push({ uid: realUid, cookie: cookie }) + } + return out + } + return [{ uid: "", cookie: s }] +} function handleSaveCookie(arg, store, bind) { - var cookie = arg - if (cookie.indexOf("=") < 0 || cookie.indexOf(";") < 0) return "未识别到 Cookie。请发送:启点ck " - var uid = extractUid(cookie) - if (!uid) return "无法从 Cookie 识别 uid。请确认 QX 抓的是启点读书福利中心 getlogininfo 请求,Cookie 内应包含 QDHeader 或 uid。" - var isNew = !store[uid] - var changed = store[uid] !== cookie + var entries = normalizeCookieInput(arg) + if (!entries.length) return "未识别到 Cookie。请发送:启点ck {\"uid\":\"cookie\"} 或 启点ck " var me = currentUserId() - store[uid] = cookie - if (me) bind[uid] = me + var lines = [] + for (var i = 0; i < entries.length; i++) { + var cookie = entries[i].cookie + if (cookie.indexOf("=") < 0 || cookie.indexOf(";") < 0) return "未识别到 Cookie。请发送:启点ck {\"uid\":\"cookie\"} 或 启点ck " + var parsedUid = extractUid(cookie) + var uid = entries[i].uid || parsedUid + if (!uid) return "无法从 Cookie 识别 uid。请确认 QX 抓的是启点读书福利中心 getlogininfo 请求,Cookie 内应包含 QDHeader 或 uid。" + var isNew = !store[uid] + var changed = store[uid] !== cookie + store[uid] = cookie + if (me) bind[uid] = me + lines.push("启点读书CK" + (isNew ? "新增" : (changed ? "更新" : "未变化")) + "成功") + lines.push("uid: " + uid) + if (entries.length > 1 && parsedUid && parsedUid !== uid) lines.push("提示: JSON uid 与 Cookie 解析 uid 不一致,已按 JSON uid 保存") + } setStore(store); setBindStore(bind) - return ["启点读书CK" + (isNew ? "新增" : (changed ? "更新" : "未变化")) + "成功", "uid: " + uid, me ? ("绑定用户: " + maskUid(me)) : "绑定用户: 未识别", "账号数: " + visibleUids(store, bind, false).length, "cookie: " + maskCookie(cookie), "签到:发送 启点签到"].join("\n") + lines.push(me ? ("绑定用户: " + maskUid(me)) : "绑定用户: 未识别") + lines.push("账号数: " + visibleUids(store, bind, false).length) + lines.push("cookie: " + maskCookie(entries[0].cookie)) + lines.push("签到:发送 启点签到") + return lines.join("\n") } function main() { var text = contentText() diff --git a/tests/qdreader_plugin.test.mjs b/tests/qdreader_plugin.test.mjs index 2ad4666..6fd2c3d 100644 --- a/tests/qdreader_plugin.test.mjs +++ b/tests/qdreader_plugin.test.mjs @@ -73,6 +73,15 @@ test('manual cookie save falls back to ywguid when QDHeader uid is null', () => assert.equal(JSON.parse(r.store.qdreader_cookie_json)['54321'], fallbackCookie); }); +test('manual cookie save accepts upstream JSON map format', () => { + const jsonCookie = 'QDHeader=KG51bGwpfHg=; ywguid=54321; qdh=qdh; sessionyw=s; appId=10'; + const r = runPlugin({ content: '启点ck ' + JSON.stringify({ '475700975': jsonCookie }) }); + assert.match(r.replies.join('\n'), /CK新增成功/); + assert.match(r.replies.join('\n'), /uid: 475700975/); + assert.equal(JSON.parse(r.store.qdreader_cookie_json)['475700975'], jsonCookie); + assert.equal(JSON.parse(r.bucketStore['hermes_qidian.qdreader_user_bind_json'])['475700975'], 'user-a'); +}); + test('manual cookie save falls back to QDHeader embedded UserId before ywguid', () => { const streamQdheader = 'KG51bGwpfChudWxsKXwxMTc5fDI1NTZ8KG51bGwpfDE2LjEwfDB8aU9TL2lQaG9uZS8obnVsbCl8MHwobnVsbCl8KG51bGwpfDQ3NTcwMDk3NXwxNzc5MDA5MTM2MDAwfDB8KG51bGwpfHx8KG51bGwpfChudWxsKXww'; const streamCookie = `QDHeader=${streamQdheader}; ywguid=120098575768; qdh=qdh; sessionyw=s; appId=12`;