From bfc8dc2e60b38a6b1706000d4d59d6182179631e Mon Sep 17 00:00:00 2001 From: Allen Date: Wed, 30 Apr 2025 23:31:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E7=99=BB=E5=BD=95=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=9A=84cookie=E4=BC=A0=E9=80=92=E7=BB=99webview=E6=89=80?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E7=9A=84url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 2 ++ src/login.ts | 2 +- src/main.ts | 26 +++++++++++++++++++++++++- src/preload.ts | 11 +++++++---- src/types/electron.d.ts | 1 + 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/index.ts b/src/index.ts index a1962f7..ef06b29 100644 --- a/src/index.ts +++ b/src/index.ts @@ -109,6 +109,8 @@ function createMenuItem(item: MenuItem, menuList: MenuItem[]): HTMLLIElement { const result = await window.electronAPI.checkUrlAvailable(url); if (result.ok && result.status >= 200 && result.status < 400) { console.log('✅ URL 可访问:', result.status); + const cookies: string = window.electronAPI.getSessionStorage('cookie'); + await window.electronAPI.setWebviewCookie(url, cookies); (document.querySelector("webview") as WebviewTag).src = url; } else { console.warn('❌ URL 不可访问:', result.error ?? `status ${result.status}`); diff --git a/src/login.ts b/src/login.ts index f56b199..b72b318 100644 --- a/src/login.ts +++ b/src/login.ts @@ -51,7 +51,7 @@ async function handleLogin(account: string, password: string): Promise { errorMessage.textContent = rspBody.msg || '登录失败'; } else { // 登录成功,将data.Cookies拼接为字符串,存储cookie - const cookies = rspBody.data.Cookies.map(cookie => `${cookie.Key.trim()}=${cookie.Value.trim()}`).join('; '); + const cookies: string = JSON.stringify(rspBody.data.Cookies); window.electronAPI.setSessionStorage('cookie', cookies); // 跳转到主页面 window.location.href = 'index.html'; diff --git a/src/main.ts b/src/main.ts index 8092649..a35b624 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, globalShortcut, ipcMain, Menu, Tray } from 'electron'; +import { app, BrowserWindow, globalShortcut, ipcMain, Menu, Tray, session } from 'electron'; import path from 'node:path'; import started from 'electron-squirrel-startup'; import * as http from 'http'; @@ -63,6 +63,30 @@ ipcMain.handle('check-url-available', async (event, rawUrl: string) => { } }); +// 设置webview的cookie +ipcMain.handle('set-webview-cookie', async (event, url: string, cookie: string) => { + try { + const parsedUrl = new URL(url); + const cookies: Array<{ Key: string, Value: string }> = JSON.parse(cookie); + + for (const cookieItem of cookies) { + await session.defaultSession.cookies.set({ + url: url, + name: cookieItem.Key.trim(), + value: cookieItem.Value.trim(), + domain: parsedUrl.hostname, + path: '/', + secure: parsedUrl.protocol === 'https:', + httpOnly: true + }); + } + return true; + } catch (error) { + console.error('设置cookie失败:', error); + return false; + } +}); + const createWindow = () => { // Create the browser window. const win = new BrowserWindow({ diff --git a/src/preload.ts b/src/preload.ts index 5f86588..02c487b 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -6,22 +6,25 @@ import { contextBridge, ipcRenderer } from 'electron'; contextBridge.exposeInMainWorld('electronAPI', { // 检查URL是否可用 checkUrlAvailable: (url: string) => ipcRenderer.invoke('check-url-available', url), - + + // 设置webview的cookie + setWebviewCookie: (url: string, cookie: string) => ipcRenderer.invoke('set-webview-cookie', url, cookie), + // 设置 sessionStorage setSessionStorage: (key: string, value: string) => { window.sessionStorage.setItem(key, value); }, - + // 获取 sessionStorage getSessionStorage: (key: string) => { return window.sessionStorage.getItem(key); }, - + // 删除 sessionStorage removeSessionStorage: (key: string) => { window.sessionStorage.removeItem(key); }, - + // 清空 sessionStorage clearSessionStorage: () => { window.sessionStorage.clear(); diff --git a/src/types/electron.d.ts b/src/types/electron.d.ts index 2f85f20..cf46121 100644 --- a/src/types/electron.d.ts +++ b/src/types/electron.d.ts @@ -1,5 +1,6 @@ export interface ElectronAPI { checkUrlAvailable: (url: string) => Promise<{ ok: boolean; status: number; error?: string }>; + setWebviewCookie: (url: string, cookie: string) => Promise; setSessionStorage: (key: string, value: string) => void; getSessionStorage: (key: string) => string | null; removeSessionStorage: (key: string) => void;