diff --git a/scripts/nodejs/publish_browser.js b/scripts/nodejs/publish_browser.js index 2ca49b4..0e78b71 100644 --- a/scripts/nodejs/publish_browser.js +++ b/scripts/nodejs/publish_browser.js @@ -87,9 +87,39 @@ async function getPublishBrowser(platform, accountId) { return browser; } +async function closeBlankPages(browser, keepPage) { + try { + const pages = await browser.pages(); + for (const p of pages) { + if (keepPage && p === keepPage) continue; + const u = p.url(); + if (!u || u === "about:blank") { + try { + await p.close(); + } catch { + /* ignore */ + } + } + } + } catch { + /* ignore */ + } +} + async function newPublishPage(platform, accountId, cookies) { const browser = await getPublishBrowser(platform, accountId); - const page = await browser.newPage(); + const pages = await browser.pages(); + let page = + pages.find((p) => { + try { + return p.url() === "about:blank"; + } catch { + return false; + } + }) || null; + if (!page) { + page = await browser.newPage(); + } await page.setUserAgent(DEFAULT_USER_AGENT); await page.evaluateOnNewDocument(STEALTH_INIT_SCRIPT); page.setDefaultNavigationTimeout(60000); @@ -101,9 +131,22 @@ async function newPublishPage(platform, accountId, cookies) { console.warn("setCookie 失败:", e.message); } } + await closeBlankPages(browser, page); return page; } +async function closePublishBrowser(platform, accountId) { + const key = contextKey(platform, accountId); + const browser = browsers.get(key); + if (!browser) return; + browsers.delete(key); + try { + await browser.close(); + } catch { + /* ignore */ + } +} + const LOGIN_URLS = { douyin: "https://creator.douyin.com/", kuaishou: "https://cp.kuaishou.com/", @@ -118,4 +161,5 @@ module.exports = { userDataDir, LOGIN_URLS, getChromiumExecutablePath, + closePublishBrowser, }; diff --git a/scripts/nodejs/publish_login.js b/scripts/nodejs/publish_login.js index 0d4c6e5..caadf5c 100644 --- a/scripts/nodejs/publish_login.js +++ b/scripts/nodejs/publish_login.js @@ -1,6 +1,11 @@ "use strict"; -const { delay, newPublishPage, LOGIN_URLS } = require("./publish_browser.js"); +const { + delay, + newPublishPage, + LOGIN_URLS, + closePublishBrowser, +} = require("./publish_browser.js"); const LOGIN_SELECTORS = { douyin: ["#header-avatar", ".creator-avatar", 'input[type="file"]'], @@ -28,6 +33,34 @@ async function checkLoggedIn(page, platform) { return false; } +async function resolveUid(page) { + try { + const uidFromDom = await page.evaluate(() => { + const node = document.querySelector("[data-user-id], [data-uid]"); + return node?.getAttribute("data-user-id") || node?.getAttribute("data-uid") || ""; + }); + if (uidFromDom) return String(uidFromDom); + } catch { + /* ignore */ + } + try { + const local = await page.evaluate(() => { + const keys = Object.keys(localStorage || {}); + for (const k of keys) { + if (/(uid|user.?id|sec_uid|openid)/i.test(k)) { + const v = localStorage.getItem(k); + if (v) return v; + } + } + return ""; + }); + if (local) return String(local).slice(0, 128); + } catch { + /* ignore */ + } + return ""; +} + globalThis.__nodejsMain = async function main(params) { const p = params || {}; const platform = String(p.platform || "").trim(); @@ -48,6 +81,7 @@ globalThis.__nodejsMain = async function main(params) { while (Date.now() - start < maxMs) { if (await checkLoggedIn(page, platform)) { const cookies = await page.cookies(); + const resolvedUid = await resolveUid(page); let nickname = ""; try { nickname = await page.$eval( @@ -57,11 +91,22 @@ globalThis.__nodejsMain = async function main(params) { } catch { nickname = "已登录用户"; } + let avatar = ""; + try { + avatar = + (await page.$eval( + "img.avatar, img[class*='avatar'], .avatar img", + (el) => el?.src || "", + )) || ""; + } catch { + avatar = ""; + } return { success: true, message: "登录成功", nickname: nickname || "已登录用户", - uid: `user_${Date.now()}`, + uid: resolvedUid || `user_${Date.now()}`, + avatar, cookies, }; } @@ -76,7 +121,12 @@ globalThis.__nodejsMain = async function main(params) { try { await page.close(); } catch { - /* keep browser for user */ + /* ignore */ + } + try { + await closePublishBrowser(platform, accountId); + } catch { + /* ignore */ } } };