# Geo-Electron **Repository Path**: xymweb/geo-electron ## Basic Information - **Project Name**: Geo-Electron - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-05-21 - **Last Updated**: 2026-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GEO AI Platform Browser Automation Tool 这是一个基于 Electron 的桌面应用程序,用于自动化检测 AI 平台(DeepSeek、豆包、文心一言、Kimi等)对企业信息的收录情况。 ## 功能特性 - 🎨 简洁美观的图形用户界面 - 🏢 **企业-话题-问题三级导航结构** - 🔍 **收录检测**:批量检测多个 AI 平台对企业信息的收录情况 - 📝 **文章发布**:一键将文章发布到多个平台 - 🔐 **平台授权**:独立管理各平台的登录状态 - 🔐 登录状态持久化(Session 持久化) - ⏳ 实时状态显示 - 🔄 支持多次连续使用 - 🌐 支持平台:DeepSeek、豆包、文心一言、Kimi、智谱、腾讯元宝、纳米搜索 ## 项目结构 ``` geo_Electron/ ├── src/ │ ├── main.js # Electron 主进程入口 │ ├── preload.js # 预加载脚本(IPC API 暴露) │ ├── db.js # 数据库模块(PostgreSQL) │ ├── browser/ │ │ └── automation.js # 浏览器自动化核心 │ ├── config/ │ │ └── platforms.js # 平台配置(URL、选择器) │ ├── handlers/ │ │ ├── ipc.js # IPC 处理器注册 │ │ ├── auth.js # 用户认证处理器 │ │ ├── inclusion.js # 收录检测业务逻辑 │ │ └── publish.js # 文章发布处理器 │ └── utils/ │ └── helpers.js # 工具函数 ├── gui/ │ ├── index.html # GUI 界面 │ └── js/ │ ├── app.js # 应用入口模块 │ ├── auth.js # 用户认证模块 │ ├── inclusion.js # 收录检测模块 │ ├── platformAuth.js # 平台授权模块 │ ├── publish.js # 文章发布模块 │ └── settings.js # 设置模块 ├── debug-screenshots/ # 调试截图目录 ├── package.json └── README.md ``` ## 安装 ```bash npm install ``` ## 运行 ```bash npm start ``` ## 使用方法 ### 登录 1. 运行程序后,输入用户名和密码登录 2. 登录状态持久化,下次启动无需重复登录 ### 收录检测 收录检测采用 **企业 → 话题 → 问题** 三级导航结构: 1. 点击「收录检测」标签,进入企业列表 2. 选择目标企业,点击「进入」查看该企业下的话题 3. 选择目标话题,点击「进入」查看该话题下的问题 4. 点击问题的「收录检测」按钮,启动检测流程 5. 程序会自动: - 复制提示词到剪贴板 - 批量打开所有 AI 平台 - 用户在各平台粘贴提示词并手动发送 6. 点击「批量检测收录」自动抓取各平台回复 7. 程序自动比对回复内容与目标企业名称 8. 更新数据库中各平台的收录状态 ### 文章发布 1. 点击「文章发布」标签 2. 选择要发布的平台(知乎、头条、微博、B站等) 3. 程序会为每个平台打开独立的浏览器窗口 4. 在各窗口中完成文章发布操作 ### 平台授权 1. 点击「平台授权」标签 2. 显示所有支持的 AI 平台 3. 点击各平台的「授权」按钮打开登录窗口 4. 在窗口中完成登录操作 ## 技术实现 ### 核心要点 本项目解决了在 React 框架网页中自动化输入文本的技术难题。 #### 问题背景 AI 平台网页使用 React 框架构建,直接通过 JavaScript 设置 `textarea.value` 或 `element.textContent` 不会触发 React 的状态更新(setState),因此文本无法真正输入。 #### 解决方案 采用 **剪贴板粘贴** 方式: 1. 使用 `clipboard.writeText()` 将文本复制到系统剪贴板 2. 聚焦输入框元素 3. 调用 `webContents.paste()` 模拟 Ctrl+V 粘贴操作 4. 粘贴后验证输入是否成功 ```javascript // 关键代码示例 clipboard.writeText(promptText); // 1. 复制到剪贴板 element.focus(); // 2. 聚焦输入框 doubaoWindow.webContents.paste(); // 3. 粘贴 ``` #### 等待策略 页面是动态加载的,需要适当的等待时间: 1. 等待页面 `document.readyState === 'complete'`(约 3-5 秒) 2. 额外等待 2 秒让 React 组件完全渲染 3. 找到输入框后点击获得焦点 4. 粘贴后再等待 500ms 确认完成 ### 多平台配置 各平台的配置信息(URL、输入框选择器、回复选择器)统一在 `src/config/platforms.js` 中管理: | 平台 | URL | 输入框选择器 | |------|-----|-------------| | DeepSeek | https://chat.deepseek.com/ | textarea[placeholder*="输入"] | | 豆包 | https://www.doubao.com/chat/ | textarea.semi-input-textarea | | 文心一言 | https://yiyan.baidu.com/ | textarea[placeholder*="输入"] | | Kimi | https://kimi.moonshot.cn/chat | textarea[placeholder*="输入"] | | 智谱 | https://chatglm.cn/chat | textarea[placeholder*="输入"] | | 腾讯元宝 | https://yuanbao.tencent.com/ | textarea[placeholder*="输入"] | | 纳米搜索 | https://www.namisor.com/ | textarea[placeholder*="输入"] | ### Session 持久化 使用 Electron 的 `session.fromPartition` 实现登录状态持久化: ```javascript const doubaoSession = session.fromPartition('persist:doubao-session'); // 每个平台有独立的 session 分区 ``` 这样可以保持: - Cookie 持久化 - 登录状态保持 - 无需每次重新登录 ### 数据库结构 使用 PostgreSQL 数据库,关键表结构: - **users**: 用户表 - **enterprise**: 企业表(user_id 关联用户) - **topic**: 话题表(enterprise_id 关联企业) - **question**: 问题表(topic_id 关联话题,包含各平台收录状态) ### IPC 通信架构 ``` 渲染进程 (GUI) ↓ IPC invoke 预加载脚本 (preload.js) ↓ contextBridge 主进程 (main.js) ↓ handlers/ ├── auth.js # 用户认证 ├── inclusion.js # 收录检测 └── publish.js # 文章发布 ↓ db.js # 数据库操作 ``` ## 调试功能 程序会自动保存调试截图到 `debug-screenshots/{platform}/` 目录: - `{platform}/1-page-loaded.png` - 页面加载完成 - `{platform}/2-input-not-found.png` - 输入框未找到 - `{platform}/3-before-input.png` - 输入前截图 - `{platform}/4-after-input.png` - 输入后截图(可验证是否成功) 如需查看详细日志,运行: ```bash npm run dev ``` ## 添加新平台 如需添加新的 AI 平台,需要: 1. 在 `src/config/platforms.js` 中添加平台配置 2. 设置 URL、输入框选择器、回复选择器、会话名称 3. 在 `gui/js/inclusion.js` 的 platforms 数组中添加平台信息 4. 在数据库中添加对应的状态字段(如 `xxx_status`) 5. 测试并调整选择器和等待时间 ## 注意事项 1. **需要登录**:首次使用可能需要手动登录各平台 2. **等待时间**:页面加载需要时间,请耐心等待 3. **网络环境**:确保网络畅通 4. **选择器变更**:如页面更新导致选择器失效,需重新检查元素属性 5. **企业名称匹配**:收录检测基于企业名称匹配,准确度取决于企业名称的完整度 ## 技术栈 - **Electron**: 跨平台桌面应用框架 - **IPC 通信**: 主进程与渲染进程安全通信 - **clipboard API**: 系统剪贴板操作 - **webContents.paste()**: Electron 粘贴方法 - **session.fromPartition()**: Session 持久化 - **PostgreSQL**: 关系型数据库 - **bcrypt**: 密码加密