@zaofan/dsh-qqbot 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,608 @@
1
+ /**
2
+ * qun-login.ts — 免扫码登录 qun.qq.com(自带浏览器 + CDP,**零第三方依赖**)
3
+ *
4
+ * ── 原理(2026-10-02 实测结论,别再猜)──
5
+ * ① 「点头像授权登录」靠两个来源,任意一个在就能用:
6
+ * a) 浏览器 profile 里的 QQ 长期登录 cookie(ptui_loginuin / qlogin_uid / pt4_token / RK …)
7
+ * b) 本机 QQ 客户端的本地服务(https://localhost.ptlogin2.qq.com:4301/pt_get_uins)
8
+ * 实测:QQ 客户端关掉后 (b) 立刻消失(端口无监听、页面只剩"扫码登录"),
9
+ * 但只要 (a) 还在,登录页**照样显示头像**、点一下就能换新凭据。
10
+ * ② 因此本模块的核心价值:**只要 profile 活着,登录就是全自动的,永远不用再扫码**。
11
+ * 第一次(profile 里还没有 QQ cookie)才需要扫码 —— 那时把二维码截图交给上层发给用户。
12
+ * ③ skey 约 1 天过期,但过期后不需要用户做任何事:重新打开登录页 → 自动点头像 → 换新的。
13
+ *
14
+ * ── 实现 ──
15
+ * 启动系统 Edge/Chrome 的 headless + 独立 user-data-dir + 调试端口,
16
+ * 用 Node 内置 WebSocket 连 CDP,执行 JS 点头像 / 读 cookie。
17
+ * 用户零安装、插件零依赖。
18
+ */
19
+ import { spawn } from 'node:child_process';
20
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
21
+ import { join } from 'node:path';
22
+ import { loadQunCookie } from './qun-admin.js';
23
+ /**
24
+ * 登录入口用 qun.qq.com 本体,而不是 xui.ptlogin2 的快捷登录页。
25
+ * 原因:qun.qq.com 能同时覆盖两种情况 ——
26
+ * 已登录 → 直接进群管理页,读 cookie 就完事(**一次都不用登**);
27
+ * 未登录 → 自动落到登录页,那上面正好是「快捷登录」面板(有头像就点头像,没有就出二维码)。
28
+ * 而 xlogin 页只认 ptlogin2 域的 ptui_loginuin,会忽略 qun.qq.com 已有的登录态(实测踩过)。
29
+ */
30
+ const LOGIN_URL = 'https://qun.qq.com/';
31
+ /** 二维码元素的候选选择器(页面改版时在这里加就行) */
32
+ const QR_SELECTORS = [
33
+ '#qrlogin_img',
34
+ '#qrlogin_img_box img',
35
+ '#qr_img',
36
+ '.qrcode img',
37
+ '#qlogin_qr img',
38
+ ];
39
+ const sleep = (ms) => new Promise((r) => { setTimeout(r, ms); });
40
+ // ───────────────────────── 找浏览器 ─────────────────────────
41
+ /** 找系统浏览器(Edge 优先:Windows 必装)。可用 QUN_BROWSER 环境变量覆盖。 */
42
+ export function findSystemBrowser() {
43
+ const env = String(process.env['QUN_BROWSER'] ?? '').trim();
44
+ if (env && existsSync(env))
45
+ return env;
46
+ const pf = process.env['ProgramFiles'] ?? 'C:\\Program Files';
47
+ const pf86 = process.env['ProgramFiles(x86)'] ?? 'C:\\Program Files (x86)';
48
+ const lad = process.env['LOCALAPPDATA'] ?? '';
49
+ const cands = [
50
+ join(pf86, 'Microsoft', 'Edge', 'Application', 'msedge.exe'),
51
+ join(pf, 'Microsoft', 'Edge', 'Application', 'msedge.exe'),
52
+ join(pf, 'Google', 'Chrome', 'Application', 'chrome.exe'),
53
+ join(pf86, 'Google', 'Chrome', 'Application', 'chrome.exe'),
54
+ join(lad, 'Google', 'Chrome', 'Application', 'chrome.exe'),
55
+ '/usr/bin/microsoft-edge', '/usr/bin/google-chrome', '/usr/bin/chromium',
56
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
57
+ '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge',
58
+ ];
59
+ for (const c of cands) {
60
+ try {
61
+ if (c && existsSync(c))
62
+ return c;
63
+ }
64
+ catch { /* ignore */ }
65
+ }
66
+ return null;
67
+ }
68
+ async function connectCdp(wsUrl) {
69
+ const ws = new WebSocket(wsUrl);
70
+ await new Promise((res, rej) => {
71
+ const t = setTimeout(() => rej(new Error('CDP 连接超时')), 15000);
72
+ ws.addEventListener('open', () => { clearTimeout(t); res(); }, { once: true });
73
+ ws.addEventListener('error', () => { clearTimeout(t); rej(new Error('CDP 连接失败')); }, { once: true });
74
+ });
75
+ let seq = 0;
76
+ const pending = new Map();
77
+ ws.addEventListener('message', (ev) => {
78
+ try {
79
+ const m = JSON.parse(String(ev.data));
80
+ if (typeof m.id !== 'number')
81
+ return;
82
+ const p = pending.get(m.id);
83
+ if (!p)
84
+ return;
85
+ pending.delete(m.id);
86
+ if (m.error)
87
+ p.rej(new Error(m.error.message ?? 'CDP error'));
88
+ else
89
+ p.res(m.result);
90
+ }
91
+ catch { /* ignore */ }
92
+ });
93
+ return {
94
+ send(method, params) {
95
+ const id = ++seq;
96
+ return new Promise((res, rej) => {
97
+ pending.set(id, { res, rej });
98
+ try {
99
+ ws.send(JSON.stringify({ id, method, params: params ?? {} }));
100
+ }
101
+ catch (e) {
102
+ pending.delete(id);
103
+ rej(e);
104
+ return;
105
+ }
106
+ setTimeout(() => { if (pending.has(id)) {
107
+ pending.delete(id);
108
+ rej(new Error('CDP 超时: ' + method));
109
+ } }, 30000);
110
+ });
111
+ },
112
+ close() { try {
113
+ ws.close();
114
+ }
115
+ catch { /* ignore */ } },
116
+ };
117
+ }
118
+ async function evalJs(cdp, expr) {
119
+ const r = await cdp.send('Runtime.evaluate', { expression: expr, returnByValue: true, awaitPromise: true });
120
+ return r?.result?.value;
121
+ }
122
+ /** 清掉 profile 的进程锁(残留进程占用时,浏览器会以 code=21 立刻退出) */
123
+ function cleanProfileLocks(dir) {
124
+ for (const f of ['SingletonLock', 'SingletonCookie', 'SingletonSocket']) {
125
+ try {
126
+ rmSync(join(dir, f), { force: true, recursive: true });
127
+ }
128
+ catch { /* ignore */ }
129
+ }
130
+ }
131
+ /**
132
+ * 杀掉浏览器**整个进程树**。
133
+ * ⚠️ 不能用 proc.kill():它只杀主进程,渲染/GPU 子进程会活下来继续锁住 profile,
134
+ * 下次启动就 code=21(实测踩坑)。
135
+ */
136
+ function killTree(proc) {
137
+ try {
138
+ if (process.platform === 'win32' && proc.pid) {
139
+ spawn('taskkill', ['/PID', String(proc.pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true });
140
+ return;
141
+ }
142
+ }
143
+ catch { /* 落到下面的兜底 */ }
144
+ try {
145
+ proc.kill('SIGKILL');
146
+ }
147
+ catch { /* ignore */ }
148
+ }
149
+ async function launchBrowser(exe, userDataDir, headless) {
150
+ try {
151
+ mkdirSync(userDataDir, { recursive: true });
152
+ }
153
+ catch { /* ignore */ }
154
+ cleanProfileLocks(userDataDir);
155
+ const args = [
156
+ ...(headless ? ['--headless=new'] : []),
157
+ '--remote-debugging-port=0',
158
+ '--user-data-dir=' + userDataDir,
159
+ '--no-first-run',
160
+ '--no-default-browser-check',
161
+ '--disable-gpu',
162
+ '--disable-extensions',
163
+ '--disable-background-networking',
164
+ '--disable-sync',
165
+ '--window-size=560,760',
166
+ // 沙箱里跑的浏览器不需要额外权限;headless 下这几项能少很多噪音日志
167
+ '--no-service-autorun',
168
+ '--password-store=basic',
169
+ LOGIN_URL,
170
+ ];
171
+ // ⚠️ windowsHide 千万不能设 true:对 msedge 这类 GUI 程序,它会让浏览器主窗口**根本显示不出来**
172
+ // (实测:进程起来了、CDP 也通,但 11 个进程 MainWindowHandle 全为 0,用户看不到二维码)
173
+ const proc = spawn(exe, args, { stdio: ['ignore', 'ignore', 'pipe'], windowsHide: false });
174
+ const port = await new Promise((res, rej) => {
175
+ let buf = '';
176
+ const t = setTimeout(() => rej(new Error('浏览器启动超时(没拿到调试端口)')), 25000);
177
+ proc.stderr?.on('data', (d) => {
178
+ buf += d.toString();
179
+ const m = /DevTools listening on ws:\/\/127\.0\.0\.1:(\d+)\//.exec(buf);
180
+ if (m && m[1]) {
181
+ clearTimeout(t);
182
+ res(Number(m[1]));
183
+ }
184
+ });
185
+ proc.on('exit', (c) => { clearTimeout(t); rej(new Error('浏览器提前退出 code=' + String(c))); });
186
+ proc.on('error', (e) => { clearTimeout(t); rej(e); });
187
+ });
188
+ const kill = () => { killTree(proc); };
189
+ return { proc, port, kill };
190
+ }
191
+ /** 等页面目标出现,返回它的 debugger ws 地址 */
192
+ async function pageWsUrl(port, timeoutMs = 20000) {
193
+ const deadline = Date.now() + timeoutMs;
194
+ while (Date.now() < deadline) {
195
+ try {
196
+ const r = await fetch(`http://127.0.0.1:${port}/json/list`);
197
+ const list = (await r.json());
198
+ const page = list.find((t) => t.type === 'page' && t.webSocketDebuggerUrl);
199
+ if (page?.webSocketDebuggerUrl)
200
+ return page.webSocketDebuggerUrl;
201
+ }
202
+ catch { /* ignore */ }
203
+ await sleep(300);
204
+ }
205
+ throw new Error('没找到浏览器页面目标');
206
+ }
207
+ const sessions = new Map();
208
+ function closeSession(dataRoot) {
209
+ const s = sessions.get(dataRoot);
210
+ if (!s)
211
+ return;
212
+ try {
213
+ s.cdp.close();
214
+ }
215
+ catch { /* ignore */ }
216
+ try {
217
+ s.handle.kill();
218
+ }
219
+ catch { /* ignore */ }
220
+ sessions.delete(dataRoot);
221
+ }
222
+ // ── 进程兜底:绝不让浏览器进程攒着(2026-10-02 实测踩到:攒了 9 个同 profile 的 msedge)──
223
+ /** 会话空闲多久自动关掉(与 wait 的 5 分钟上限一致) */
224
+ const SESSION_IDLE_MS = 5 * 60 * 1000;
225
+ /**
226
+ * 宿主退出时把所有浏览器一起带走。
227
+ * ⚠️ 不装这个钩子的话,宿主一退出子进程就成**孤儿**,会一直挂在后台(而且锁着 profile,
228
+ * 下次启动还会 code=21)。
229
+ */
230
+ let exitHookInstalled = false;
231
+ function installExitHook() {
232
+ if (exitHookInstalled)
233
+ return;
234
+ exitHookInstalled = true;
235
+ const killAll = () => {
236
+ for (const dr of Array.from(sessions.keys())) {
237
+ try {
238
+ closeSession(dr);
239
+ }
240
+ catch { /* ignore */ }
241
+ }
242
+ };
243
+ try {
244
+ process.on('exit', killAll);
245
+ }
246
+ catch { /* ignore */ }
247
+ try {
248
+ process.on('SIGINT', () => { killAll(); process.exit(0); });
249
+ }
250
+ catch { /* ignore */ }
251
+ try {
252
+ process.on('SIGTERM', () => { killAll(); process.exit(0); });
253
+ }
254
+ catch { /* ignore */ }
255
+ }
256
+ /** 空闲清理:每分钟扫一次,超过 SESSION_IDLE_MS 没动静的会话连浏览器一起关掉 */
257
+ let sweeper = null;
258
+ function ensureSweeper() {
259
+ if (sweeper)
260
+ return;
261
+ sweeper = setInterval(() => {
262
+ const now = Date.now();
263
+ for (const [dr, s] of Array.from(sessions.entries())) {
264
+ if (now - s.at > SESSION_IDLE_MS) {
265
+ try {
266
+ closeSession(dr);
267
+ }
268
+ catch { /* ignore */ }
269
+ }
270
+ }
271
+ // 没会话了就把定时器也停掉(别让空转的 timer 拖住进程退出)
272
+ if (sessions.size === 0 && sweeper) {
273
+ clearInterval(sweeper);
274
+ sweeper = null;
275
+ }
276
+ }, 60 * 1000);
277
+ try {
278
+ sweeper.unref?.();
279
+ }
280
+ catch { /* ignore */ }
281
+ }
282
+ /** 杀掉占用指定 profile 的**残留**浏览器进程(历史泄漏的兜底清理;只在启动出问题时调用) */
283
+ function killByProfile(profileDir) {
284
+ if (process.platform !== 'win32')
285
+ return;
286
+ try {
287
+ const safe = profileDir.replace(/'/g, "''");
288
+ const cmd = 'Get-CimInstance Win32_Process -Filter "Name=\'msedge.exe\'"'
289
+ + ` | Where-Object { $_.CommandLine -like '*${safe}*' }`
290
+ + ' | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }';
291
+ spawn('powershell', ['-NoProfile', '-Command', cmd], { stdio: 'ignore', windowsHide: true });
292
+ }
293
+ catch { /* ignore */ }
294
+ }
295
+ export function qunLoginSessionAlive(dataRoot) {
296
+ return sessions.has(dataRoot);
297
+ }
298
+ export function qunLoginSessionClose(dataRoot) {
299
+ closeSession(dataRoot);
300
+ }
301
+ /** 从 document.cookie 串里抠出凭据 */
302
+ function parseCookie(raw) {
303
+ const pick = (k) => {
304
+ const m = new RegExp('(?:^|;\\s*)' + k + '=([^;]*)').exec(raw);
305
+ return m && m[1] ? m[1] : '';
306
+ };
307
+ const uinRaw = pick('uin') || pick('p_uin');
308
+ const uin = (/(\d{5,12})/.exec(uinRaw) ?? [])[1] ?? '';
309
+ const skey = pick('skey');
310
+ const p_skey = pick('p_skey');
311
+ if (!uin || !skey)
312
+ return null;
313
+ return { uin, skey, p_skey };
314
+ }
315
+ /** 页面还在登录页吗(用来判断是否已跳进 qun.qq.com) */
316
+ async function currentHref(cdp) {
317
+ try {
318
+ return (await evalJs(cdp, 'location.href')) ?? '';
319
+ }
320
+ catch {
321
+ return '';
322
+ }
323
+ }
324
+ /** 尝试在页面上读凭据;读到就返回 */
325
+ async function tryReadCookie(cdp) {
326
+ try {
327
+ const href = await currentHref(cdp);
328
+ if (!/qun\.qq\.com/.test(href) || /\/login/.test(href))
329
+ return null;
330
+ const raw = (await evalJs(cdp, 'document.cookie')) ?? '';
331
+ return parseCookie(String(raw));
332
+ }
333
+ catch {
334
+ return null;
335
+ }
336
+ }
337
+ /**
338
+ * 找头像元素并点它;返回点了几个。
339
+ * ⚠️ 不能只看容器存不存在 —— `#qlogin_list` 在"没有可授权账号"时也照样存在(空容器),
340
+ * 必须要求里面有**可见的** a/img 才算真头像(实测踩过:误判导致日志说"点了头像但没跳转")。
341
+ */
342
+ async function clickAvatar(cdp) {
343
+ const expr = `(function(){
344
+ const root = document.querySelector('#qlogin_list')
345
+ || document.querySelector('.qlogin_list')
346
+ || document.querySelector('#qlogin');
347
+ if (!root) return 0;
348
+ const cand = root.querySelectorAll('a, img, .face');
349
+ for (const el of cand) {
350
+ const r = el.getBoundingClientRect();
351
+ if (!r || r.width < 16 || r.height < 16) continue; // 不可见的忽略
352
+ const target = (el.tagName === 'IMG' && el.parentElement) ? el.parentElement : el;
353
+ try { target.click(); } catch (e) { /* ignore */ }
354
+ return 1;
355
+ }
356
+ return 0;
357
+ })()`;
358
+ try {
359
+ const n = await evalJs(cdp, expr);
360
+ return Number(n) || 0;
361
+ }
362
+ catch {
363
+ return 0;
364
+ }
365
+ }
366
+ /** 把二维码元素截图存盘(找不到元素就整页截图兜底) */
367
+ async function shotQr(cdp, dataRoot) {
368
+ const out = join(dataRoot, 'qun-login-qr.png');
369
+ try {
370
+ const sels = JSON.stringify(QR_SELECTORS);
371
+ const box = await evalJs(cdp, `(function(){
372
+ const sels = ${sels};
373
+ for (const s of sels) {
374
+ const el = document.querySelector(s);
375
+ if (el && el.getBoundingClientRect) {
376
+ const r = el.getBoundingClientRect();
377
+ if (r.width > 40 && r.height > 40) return { x: r.x, y: r.y, w: r.width, h: r.height };
378
+ }
379
+ }
380
+ const img = Array.from(document.images || []).find(function(i){ return i.width > 80 && i.height > 80; });
381
+ if (img) { const r = img.getBoundingClientRect(); return { x: r.x, y: r.y, w: r.width, h: r.height }; }
382
+ return null;
383
+ })()`);
384
+ const params = { format: 'png', captureBeyondViewport: true };
385
+ if (box && box.w > 40 && box.h > 40) {
386
+ params['clip'] = { x: Math.max(0, box.x - 8), y: Math.max(0, box.y - 8), width: box.w + 16, height: box.h + 16, scale: 1 };
387
+ }
388
+ const r = await cdp.send('Page.captureScreenshot', params);
389
+ const b64 = r?.data;
390
+ if (!b64)
391
+ return undefined;
392
+ try {
393
+ mkdirSync(dataRoot, { recursive: true });
394
+ }
395
+ catch { /* ignore */ }
396
+ writeFileSync(out, Buffer.from(b64, 'base64'));
397
+ return out;
398
+ }
399
+ catch {
400
+ return undefined;
401
+ }
402
+ }
403
+ /**
404
+ * 第一步:开浏览器 → 有头像就自动点(免扫码),没头像就出二维码。
405
+ * 拿到凭据就返回 cookie 并关掉浏览器;需要扫码则**保留浏览器**,让上层把 qrPath 发给用户,
406
+ * 之后用 qunBrowserLoginWait 继续等。
407
+ */
408
+ export async function qunBrowserLoginStart(dataRoot, opts = {}) {
409
+ const exe = findSystemBrowser();
410
+ if (!exe) {
411
+ return { ok: false, msg: '没找到系统浏览器(Edge/Chrome)。可设环境变量 QUN_BROWSER 指向浏览器可执行文件。' };
412
+ }
413
+ // ★ 已有活着的会话就**直接复用**,绝不"先杀掉再新建":
414
+ // 反复启停正是 code=21 的根源(短命进程持有长命 profile,Windows 的文件锁来不及释放)。
415
+ const existing = sessions.get(dataRoot);
416
+ if (existing) {
417
+ try {
418
+ const ck0 = await tryReadCookie(existing.cdp);
419
+ if (ck0) {
420
+ closeSession(dataRoot);
421
+ return { ok: true, msg: `复用已有浏览器会话并拿到凭据,uin=${ck0.uin}`, cookie: ck0 };
422
+ }
423
+ // 会话还活着但没登录 → 试试点头像(本机 QQ 客户端/身份 cookie 可能已就绪)
424
+ const n0 = await clickAvatar(existing.cdp);
425
+ if (n0 > 0) {
426
+ existing.clicked = true;
427
+ await sleep(2500);
428
+ const ck1 = await tryReadCookie(existing.cdp);
429
+ if (ck1) {
430
+ closeSession(dataRoot);
431
+ return { ok: true, msg: `复用会话 + 点头像授权成功,uin=${ck1.uin}`, cookie: ck1 };
432
+ }
433
+ }
434
+ // 还是没登录 → 就把上一次的二维码继续用(3 分钟内有效)
435
+ if (existing.qrPath) {
436
+ existing.at = Date.now();
437
+ return { ok: true, qrPath: existing.qrPath, msg: '复用上一次的二维码(仍在有效期内)。请扫完调 wait。' };
438
+ }
439
+ }
440
+ catch { /* 会话坏了 → 往下走,重新开一个 */ }
441
+ }
442
+ closeSession(dataRoot); // 清掉可能残留的坏会话
443
+ const profileDir = opts.profileDir ?? join(dataRoot, 'browser-profile');
444
+ const headless = opts.headless !== false;
445
+ let handle;
446
+ try {
447
+ handle = await launchBrowser(exe, profileDir, headless);
448
+ }
449
+ catch {
450
+ // code=21 = profile 被上次残留的进程占着
451
+ // → 先杀掉占用该 profile 的残留进程(历史泄漏兜底),再清锁、等一下、重试
452
+ killByProfile(profileDir);
453
+ cleanProfileLocks(profileDir);
454
+ await sleep(1500);
455
+ try {
456
+ handle = await launchBrowser(exe, profileDir, headless);
457
+ }
458
+ catch (e2) {
459
+ return { ok: false, msg: '启动浏览器失败:' + String(e2?.message ?? e2).slice(0, 160) };
460
+ }
461
+ }
462
+ let cdp = null;
463
+ try {
464
+ const wsUrl = await pageWsUrl(handle.port);
465
+ cdp = await connectCdp(wsUrl);
466
+ await cdp.send('Runtime.enable');
467
+ await cdp.send('Page.enable');
468
+ // 有头模式下把窗口顶到最前面(不然可能被别的窗口盖住,用户找不到二维码)
469
+ if (opts.headless === false) {
470
+ try {
471
+ await cdp.send('Page.bringToFront');
472
+ }
473
+ catch { /* ignore */ }
474
+ }
475
+ // ★ 关键一步:把插件保存的凭据注入浏览器。
476
+ // 为什么必须这么做:浏览器 profile 里的 **session cookie 不会持久化**
477
+ // (Chromium 正常退出时会清掉它们,实测同一 profile 第二次打开 qun.qq.com 仍是未登录)。
478
+ // 所以插件自己的 cookie 文件才是唯一真相源:每次启动都把凭据喂回浏览器,
479
+ // 页面直接就是已登录状态;skey 若已过期,页面会落到登录页,那就走点头像/扫码。
480
+ const saved = loadQunCookie(dataRoot);
481
+ if (saved) {
482
+ try {
483
+ await cdp.send('Network.enable');
484
+ const pairs = [
485
+ ['uin', 'o' + saved.uin],
486
+ ['p_uin', 'o' + saved.uin],
487
+ ['skey', saved.skey],
488
+ ];
489
+ if (saved.p_skey)
490
+ pairs.push(['p_skey', saved.p_skey]);
491
+ for (const [name, value] of pairs) {
492
+ if (!value)
493
+ continue;
494
+ try {
495
+ await cdp.send('Network.setCookie', { name, value, domain: '.qq.com', path: '/', secure: true });
496
+ }
497
+ catch { /* 单个 cookie 失败不影响其它 */ }
498
+ }
499
+ await cdp.send('Page.navigate', { url: LOGIN_URL });
500
+ await sleep(1800);
501
+ }
502
+ catch { /* 注入失败就照常走未登录流程 */ }
503
+ }
504
+ // 等页面就绪:**先看 profile 里还登着没**(登着就一次都不用登,直接拿走)
505
+ let hit = null;
506
+ for (let i = 0; i < 24; i++) {
507
+ await sleep(500);
508
+ const ready = await evalJs(cdp, 'document.readyState');
509
+ if (ready !== 'complete' && ready !== 'interactive')
510
+ continue;
511
+ // ① 最快路径:已有有效登录态
512
+ hit = await tryReadCookie(cdp);
513
+ if (hit)
514
+ break;
515
+ // ② 登录面板渲染出来了吗(头像/二维码都是 JS 动态塞的)
516
+ const has = await evalJs(cdp, `(function(){ return (document.querySelector('#qlogin_list') || document.querySelector('#qrlogin_img') || document.querySelector('#qr_login') || document.querySelector('.qlogin_list')) ? 1 : 0; })()`);
517
+ if (Number(has) === 1 && i >= 3)
518
+ break;
519
+ }
520
+ if (hit) {
521
+ closeSession(dataRoot);
522
+ return { ok: true, msg: `免扫码:profile 里的登录态还有效,直接取用(uin=${hit.uin})`, cookie: hit };
523
+ }
524
+ // 再补一次(页面可能刚跳完)
525
+ hit = await tryReadCookie(cdp);
526
+ if (hit) {
527
+ closeSession(dataRoot);
528
+ return { ok: true, msg: `免扫码:profile 里的登录态还有效,直接取用(uin=${hit.uin})`, cookie: hit };
529
+ }
530
+ // ③ 尝试免扫码:点头像授权(profile 里或本机 QQ 客户端提供了账号)
531
+ const n = await clickAvatar(cdp);
532
+ if (n > 0) {
533
+ for (let i = 0; i < 30; i++) {
534
+ await sleep(500);
535
+ const ck = await tryReadCookie(cdp);
536
+ if (ck) {
537
+ closeSession(dataRoot);
538
+ return { ok: true, msg: `免扫码登录成功(点头像授权),uin=${ck.uin}`, cookie: ck };
539
+ }
540
+ }
541
+ // 点了但没跳过去:可能是环境校验,继续走扫码兜底
542
+ }
543
+ // ④ 兜底:出二维码
544
+ const qrPath = await shotQr(cdp, dataRoot);
545
+ sessions.set(dataRoot, { handle, cdp, dataRoot, at: Date.now(), qrPath, clicked: n > 0 });
546
+ installExitHook(); // 宿主退出时把浏览器一起带走(不然会成孤儿进程)
547
+ ensureSweeper(); // 空闲超时自动关(不然扫码没扫成会一直挂着)
548
+ return {
549
+ ok: true,
550
+ qrPath,
551
+ msg: n > 0
552
+ ? '点了头像但没跳转成功,已改出二维码。请把二维码发给用户,扫完后调 wait 继续。'
553
+ : '这台机器没有可用的 QQ 登录态(浏览器 profile 里没有、本机也没有 QQ 客户端),已出二维码。请发给用户扫,扫完后调 wait 继续。',
554
+ };
555
+ }
556
+ catch (e) {
557
+ try {
558
+ if (cdp)
559
+ cdp.close();
560
+ }
561
+ catch { /* ignore */ }
562
+ closeSession(dataRoot);
563
+ handle.kill();
564
+ return { ok: false, msg: '浏览器登录出错:' + String(e?.message ?? e).slice(0, 200) };
565
+ }
566
+ }
567
+ /**
568
+ * 第二步:在已开的会话上继续等(扫码 or 点头像跳转完成)。
569
+ * budgetMs 默认 25 秒 —— 别让工具调用卡太久,用户可以多次调。
570
+ */
571
+ export async function qunBrowserLoginWait(dataRoot, budgetMs = 25000) {
572
+ const s = sessions.get(dataRoot);
573
+ if (!s)
574
+ return { ok: false, done: false, msg: '没有正在进行的登录会话,请重新调 start' };
575
+ if (Date.now() - s.at > 5 * 60 * 1000) {
576
+ closeSession(dataRoot);
577
+ return { ok: false, done: false, msg: '登录会话超过 5 分钟已关闭,请重新调 start' };
578
+ }
579
+ const deadline = Date.now() + Math.max(3000, budgetMs);
580
+ let last = '等待扫码/授权…';
581
+ while (Date.now() < deadline) {
582
+ const ck = await tryReadCookie(s.cdp);
583
+ if (ck) {
584
+ closeSession(dataRoot);
585
+ return { ok: true, done: true, msg: `登录成功,uin=${ck.uin}`, cookie: ck };
586
+ }
587
+ // 用户可能扫码后卡在确认;顺带再看看头像(万一 QQ 客户端中途起来了)
588
+ if (!s.clicked) {
589
+ const n = await clickAvatar(s.cdp);
590
+ if (n > 0)
591
+ s.clicked = true;
592
+ }
593
+ const href = await currentHref(s.cdp);
594
+ if (href)
595
+ last = /xui\.ptlogin2/.test(href) ? '等待扫码/授权…' : '已跳转,正在取凭据…';
596
+ await sleep(1500);
597
+ }
598
+ return { ok: true, done: false, msg: `${last}(这一轮没等到,可以再调 wait;二维码 3 分钟内有效)` };
599
+ }
600
+ /** 退出登录:清掉浏览器 profile 里的 QQ 登录态(一般不用,留着以后"切换账号"用) */
601
+ export function clearBrowserProfile(dataRoot) {
602
+ closeSession(dataRoot);
603
+ try {
604
+ rmSync(join(dataRoot, 'browser-profile'), { recursive: true, force: true });
605
+ }
606
+ catch { /* ignore */ }
607
+ }
608
+ //# sourceMappingURL=qun-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qun-login.js","sourceRoot":"","sources":["../../src/features/qun-login.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}