From 838b244929990d8a7dc8951f13a7aa074da0b2f6 Mon Sep 17 00:00:00 2001 From: kurihada Date: Sun, 1 Mar 2026 16:57:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=99=BB=E5=87=BA?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E6=97=A0=E6=95=88=20=E2=80=94=20=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E6=B8=85=E9=99=A4=E7=A3=81=E7=9B=98=20cookie=20?= =?UTF-8?q?=E5=92=8C=E6=B5=8F=E8=A7=88=E5=99=A8=E5=86=85=E5=AD=98=20contex?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BrowserManager 新增 clearContext() 方法,关闭并丢弃平台 context - deleteCookies 同时调用 cookieStore.delete + browser.clearContext - 前端登出后直接 resetStatus,不再触发浏览器请求检查状态 --- src/browser/manager.ts | 15 +++++++++++++++ src/platforms/xiaohongshu/login.ts | 12 +++++------- web/src/hooks/useLoginStatus.ts | 8 +++++++- web/src/pages/LoginPage.tsx | 4 ++-- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/browser/manager.ts b/src/browser/manager.ts index 6e3968e..9d3122e 100644 --- a/src/browser/manager.ts +++ b/src/browser/manager.ts @@ -193,6 +193,21 @@ export class BrowserManager { logger.debug({ platform }, 'Cookies saved'); } + /** + * Close and discard the browser context for a platform so the next + * operation creates a fresh one (without any cookies or storage). + */ + async clearContext(platform: string): Promise { + const ctx = this.contexts.get(platform); + if (!ctx) return; + + this.contexts.delete(platform); + await ctx.close().catch((err: unknown) => { + logger.warn({ err, platform }, 'Error closing context during clearContext'); + }); + logger.info({ platform }, 'Browser context cleared'); + } + /** * Wait for every in-flight platform queue to settle. Useful during * graceful shutdown so that running operations finish before teardown. diff --git a/src/platforms/xiaohongshu/login.ts b/src/platforms/xiaohongshu/login.ts index f918e98..3c94a5e 100644 --- a/src/platforms/xiaohongshu/login.ts +++ b/src/platforms/xiaohongshu/login.ts @@ -140,15 +140,13 @@ export async function getLoginQRCode( // --------------------------------------------------------------------------- /** - * Delete persisted cookies for the Xiaohongshu platform. - * - * @param _browser - The shared BrowserManager instance (unused for now but - * passed for consistency; a future version may also clear - * the in-memory browser context). + * Delete persisted cookies and clear the in-memory browser context so the + * next operation starts with a clean session. */ -export async function deleteCookies(_browser: BrowserManager): Promise { +export async function deleteCookies(browser: BrowserManager): Promise { await cookieStore.delete(PLATFORM); - log.info('Xiaohongshu cookies deleted'); + await browser.clearContext(PLATFORM); + log.info('Xiaohongshu cookies deleted and browser context cleared'); } // --------------------------------------------------------------------------- diff --git a/web/src/hooks/useLoginStatus.ts b/web/src/hooks/useLoginStatus.ts index e028f82..5f43fa9 100644 --- a/web/src/hooks/useLoginStatus.ts +++ b/web/src/hooks/useLoginStatus.ts @@ -34,5 +34,11 @@ export function useLoginStatus(options: { auto?: boolean; intervalMs?: number } } }, [refresh, auto, intervalMs]); - return { status, error, loading, refresh }; + const reset = useCallback(() => { + setStatus(null); + setError(null); + setLoading(false); + }, []); + + return { status, error, loading, refresh, reset }; } diff --git a/web/src/pages/LoginPage.tsx b/web/src/pages/LoginPage.tsx index c14af8b..7965fbc 100644 --- a/web/src/pages/LoginPage.tsx +++ b/web/src/pages/LoginPage.tsx @@ -10,7 +10,7 @@ import { useToast } from '@/context/ToastContext'; import { getLoginQRCode, deleteCookies, checkLoginCookie } from '@/api/endpoints'; export function LoginPage() { - const { status, loading: statusLoading, refresh: refreshStatus } = useLoginStatus(); + const { status, loading: statusLoading, refresh: refreshStatus, reset: resetStatus } = useLoginStatus(); const { token } = useAuth(); const { toast } = useToast(); @@ -96,7 +96,7 @@ export function LoginPage() { const res = await deleteCookies(); if (res.success) { toast('success', '已成功登出'); - void refreshStatus(); + resetStatus(); } else { toast('error', res.error?.message || '登出失败'); }