preload.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // 使用 require 避免 ESM 问题
  2. const { contextBridge, ipcRenderer } = require('electron');
  3. // 暴露给渲染进程的 API
  4. contextBridge.exposeInMainWorld('electronAPI', {
  5. // 应用信息
  6. getAppVersion: () => ipcRenderer.invoke('get-app-version'),
  7. getPlatform: () => ipcRenderer.invoke('get-platform'),
  8. // 窗口控制
  9. minimizeWindow: () => ipcRenderer.send('window-minimize'),
  10. maximizeWindow: () => ipcRenderer.send('window-maximize'),
  11. closeWindow: () => ipcRenderer.send('window-close'),
  12. quitApp: () => ipcRenderer.send('app-quit'), // 真正退出应用
  13. isMaximized: () => ipcRenderer.invoke('window-is-maximized'),
  14. onMaximizedChange: (callback: (isMaximized: boolean) => void) => {
  15. ipcRenderer.on('window-maximized', (_event: unknown, isMaximized: boolean) => callback(isMaximized));
  16. },
  17. // 文件操作
  18. selectFile: (options?: { filters?: { name: string; extensions: string[] }[] }) =>
  19. ipcRenderer.invoke('select-file', options),
  20. selectFolder: () => ipcRenderer.invoke('select-folder'),
  21. // 通知
  22. showNotification: (title: string, body: string) =>
  23. ipcRenderer.send('show-notification', { title, body }),
  24. // 弹窗打开平台后台(独立窗口,不嵌入;实验用)
  25. openBackendExternal: (url: string, cookieData?: string, title?: string) =>
  26. ipcRenderer.invoke('open-backend-external', { url, cookieData, title }),
  27. // Webview Cookie 操作
  28. getWebviewCookies: (partition: string, url: string) =>
  29. ipcRenderer.invoke('get-webview-cookies', partition, url),
  30. clearWebviewCookies: (partition: string) =>
  31. ipcRenderer.invoke('clear-webview-cookies', partition),
  32. setWebviewCookies: (partition: string, cookies: Electron.CookiesSetDetails[]) =>
  33. ipcRenderer.invoke('set-webview-cookies', partition, cookies),
  34. // Webview 截图(用于 AI 分析)
  35. captureWebviewPage: (webContentsId: number) =>
  36. ipcRenderer.invoke('capture-webview-page', webContentsId),
  37. // Webview 自动操作
  38. webviewSendMouseClick: (webContentsId: number, x: number, y: number) =>
  39. ipcRenderer.invoke('webview-send-mouse-click', webContentsId, x, y),
  40. webviewSendTextInput: (webContentsId: number, text: string) =>
  41. ipcRenderer.invoke('webview-send-text-input', webContentsId, text),
  42. webviewGetElementPosition: (webContentsId: number, selector: string) =>
  43. ipcRenderer.invoke('webview-get-element-position', webContentsId, selector),
  44. webviewClickByText: (webContentsId: number, text: string) =>
  45. ipcRenderer.invoke('webview-click-by-text', webContentsId, text),
  46. // CDP 网络拦截
  47. enableNetworkIntercept: (webContentsId: number, patterns: Array<{match: string, key: string}>) =>
  48. ipcRenderer.invoke('enable-network-intercept', webContentsId, patterns),
  49. disableNetworkIntercept: (webContentsId: number) =>
  50. ipcRenderer.invoke('disable-network-intercept', webContentsId),
  51. updateNetworkPatterns: (webContentsId: number, patterns: Array<{match: string, key: string}>) =>
  52. ipcRenderer.invoke('update-network-patterns', webContentsId, patterns),
  53. onNetworkInterceptData: (callback: (data: { webContentsId: number; key: string; url: string; data: unknown }) => void) => {
  54. ipcRenderer.on('network-intercept-data', (_event: unknown, data: { webContentsId: number; key: string; url: string; data: unknown }) => callback(data));
  55. },
  56. removeNetworkInterceptListener: () => {
  57. ipcRenderer.removeAllListeners('network-intercept-data');
  58. },
  59. testServerConnection: (url: string) =>
  60. ipcRenderer.invoke('test-server-connection', { url }),
  61. testPythonServiceConnection: (url: string) =>
  62. ipcRenderer.invoke('test-python-service-connection', { url }),
  63. });
  64. // 类型声明
  65. declare global {
  66. interface Window {
  67. electronAPI: {
  68. getAppVersion: () => Promise<string>;
  69. getPlatform: () => Promise<string>;
  70. minimizeWindow: () => void;
  71. maximizeWindow: () => void;
  72. closeWindow: () => void;
  73. quitApp: () => void;
  74. isMaximized: () => Promise<boolean>;
  75. onMaximizedChange: (callback: (isMaximized: boolean) => void) => void;
  76. selectFile: (options?: { filters?: { name: string; extensions: string[] }[] }) => Promise<string | null>;
  77. selectFolder: () => Promise<string | null>;
  78. showNotification: (title: string, body: string) => void;
  79. getWebviewCookies: (partition: string, url: string) => Promise<Electron.Cookie[]>;
  80. clearWebviewCookies: (partition: string) => Promise<boolean>;
  81. setWebviewCookies: (partition: string, cookies: Electron.CookiesSetDetails[]) => Promise<boolean>;
  82. captureWebviewPage: (webContentsId: number) => Promise<string | null>;
  83. webviewSendMouseClick: (webContentsId: number, x: number, y: number) => Promise<boolean>;
  84. webviewSendTextInput: (webContentsId: number, text: string) => Promise<boolean>;
  85. webviewGetElementPosition: (webContentsId: number, selector: string) => Promise<{ x: number; y: number; width: number; height: number } | null>;
  86. webviewClickByText: (webContentsId: number, text: string) => Promise<boolean>;
  87. openBackendExternal: (url: string, cookieData?: string, title?: string) => Promise<{ ok: boolean }>;
  88. // CDP 网络拦截
  89. enableNetworkIntercept: (webContentsId: number, patterns: Array<{match: string, key: string}>) => Promise<boolean>;
  90. disableNetworkIntercept: (webContentsId: number) => Promise<boolean>;
  91. updateNetworkPatterns: (webContentsId: number, patterns: Array<{match: string, key: string}>) => Promise<boolean>;
  92. onNetworkInterceptData: (callback: (data: { webContentsId: number; key: string; url: string; data: unknown }) => void) => void;
  93. removeNetworkInterceptListener: () => void;
  94. testServerConnection: (url: string) => Promise<{ ok: boolean; error?: string }>;
  95. testPythonServiceConnection: (url: string) => Promise<{ ok: boolean; error?: string }>;
  96. };
  97. }
  98. }