geoGo/internal/collect/README.md

307 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AI平台收集功能使用说明
## 概述
`internal/collect` 模块提供了访问多个AI平台并进行问答的功能目前支持以下平台
- **文心一言** (wenxin) - 百度AI助手
- **DeepSeek** (deepseek) - 深度求索AI
- **豆包** (doubao) - 字节跳动AI助手
- **通义千问** (qianwen) - 阿里云AI助手
## 架构设计
### 核心组件
1. **CollectorInterface** - 收集器接口
- `WaitLogin() (bool, string)` - 等待登录
- `AskQuestion(question string) (string, error)` - 提问并获取答案
2. **BaseCollector** - 基础收集器
- 浏览器驱动管理
- Cookie管理保存/加载)
- 页面操作工具方法
3. **CollectManager** - 收集管理器
- 统一管理不同平台的收集器
- 提供便捷的API调用
4. **平台实现**
- `WenxinCollector` - 文心一言实现
- `DeepseekCollector` - DeepSeek实现
- `DoubaoCollector` - 豆包实现
- `QianwenCollector` - 通义千问实现
## 快速开始
### 1. 基本使用
```go
package main
import (
"context"
"fmt"
"geo/internal/collect"
"geo/internal/config"
"log"
"os"
)
func main() {
// 加载配置
cfg := &config.Config{
Sys: config.SysConfig{
ChromePath: "chrome/chrome.exe", // Chrome浏览器路径
ChromeDataDir: "chrome_data", // Chrome数据目录
CookiesDir: "cookies", // Cookie存储目录
LogsDir: "logs", // 日志目录
},
}
ctx := context.Background()
logger := log.New(os.Stdout, "", log.LstdFlags)
// 创建管理器
manager := collect.NewCollectManager(ctx, cfg, logger)
// 设置参数
params := &collect.CollectParams{
Headless: false, // 是否无头模式false显示浏览器窗口
UserIndex: "user_001", // 用户索引
PlatIndex: "wenxin", // 平台索引
RequestID: "req_001", // 请求ID
Platform: "wenxin", // 平台类型
}
// 向文心一言提问
question := "请介绍一下Go语言的特点"
answer, err := manager.AskQuestion("wenxin", params, question)
if err != nil {
fmt.Printf("错误: %v\n", err)
return
}
fmt.Printf("问题: %s\n", question)
fmt.Printf("答案: %s\n", answer)
}
```
### 2. 多平台对比
```go
// 向多个AI平台提问同一个问题
platforms := []string{"wenxin", "deepseek", "doubao", "qianwen"}
question := "什么是人工智能?"
for _, platform := range platforms {
params := &collect.CollectParams{
Headless: true,
UserIndex: "user_001",
PlatIndex: platform,
RequestID: fmt.Sprintf("req_%s", platform),
Platform: platform,
}
answer, err := manager.AskQuestion(platform, params, question)
if err != nil {
fmt.Printf("[%s] 错误: %v\n", platform, err)
continue
}
fmt.Printf("[%s] 答案: %s\n\n", platform, answer)
}
```
### 3. 登录管理
```go
// 首次使用时需要登录
params := &collect.CollectParams{
Headless: false, // 显示浏览器窗口以便扫码登录
UserIndex: "user_001",
PlatIndex: "wenxin",
RequestID: "login_req",
Platform: "wenxin",
}
// 等待登录(会打开浏览器窗口,需要手动扫码或输入账号密码)
success, msg := manager.WaitLogin("wenxin", params)
if success {
fmt.Println("登录成功Cookie已保存")
} else {
fmt.Printf("登录失败: %s\n", msg)
}
// 后续使用会自动加载Cookie无需重复登录
params.Headless = true // 可以切换到无头模式
answer, _ := manager.AskQuestion("wenxin", params, "你好")
```
### 4. 列出支持的平台
```go
platforms := manager.ListPlatforms()
fmt.Printf("支持的平台: %v\n", platforms)
// 输出: 支持的平台: [wenxin deepseek doubao qianwen]
```
## 配置说明
### 必需的配置项
```go
type SysConfig struct {
ChromePath string // Chrome浏览器可执行文件路径
ChromeDataDir string // Chrome用户数据目录
CookiesDir string // Cookie存储目录
LogsDir string // 日志文件目录
}
```
### 示例配置
```go
cfg := &config.Config{
Sys: config.SysConfig{
ChromePath: "/usr/bin/google-chrome", // Linux
// ChromePath: "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", // Windows
ChromeDataDir: "./chrome_data",
CookiesDir: "./cookies",
LogsDir: "./logs",
},
}
```
## 工作流程
1. **初始化浏览器** - 启动Chrome浏览器实例
2. **加载Cookie** - 从本地文件加载之前的登录状态
3. **检查登录** - 验证是否已登录
4. **导航到聊天页面** - 打开AI平台的对话界面
5. **输入问题** - 在输入框中输入问题
6. **点击发送** - 触发AI回答
7. **等待回答** - 等待AI生成完整答案
8. **提取答案** - 从页面中提取回答内容
9. **返回结果** - 将答案返回给调用者
## 注意事项
### 1. 首次使用需要登录
每个平台首次使用时需要手动登录:
- 设置 `Headless: false` 显示浏览器窗口
- 调用 `WaitLogin()` 方法
- 在浏览器中完成登录操作(扫码或输入账号密码)
- 登录成功后Cookie会自动保存
### 2. Cookie管理
- Cookie保存在 `cookies/{UserIndex}/{PlatIndex}.json`
- 下次使用会自动加载Cookie无需重复登录
- 如果登录失效,重新调用 `WaitLogin()` 即可
### 3. 选择器适配
由于AI平台的页面结构可能会更新如果遇到问题可能需要调整CSS选择器
- 在对应的Collector文件中修改 `inputSelectors`、`sendSelectors`、`answerSelectors`
- 可以通过浏览器的开发者工具查看最新的元素选择器
### 4. 超时设置
- 登录超时: 180-300秒
- 回答超时: 120秒
- 可根据实际情况在代码中调整
### 5. 无头模式
- 开发调试时建议设置 `Headless: false`
- 生产环境可以设置 `Headless: true` 节省资源
## 扩展新平台
如果要添加新的AI平台需要
1. 创建新的Collector文件`newplatform.go`
2. 实现 `CollectorInterface` 接口
3. 继承 `BaseCollector` 基础结构
4.`interface.go``CollectorMap` 中注册
示例:
```go
package collect
import (
"context"
"geo/internal/config"
"log"
)
type NewPlatformCollector struct {
*BaseCollector
}
func NewNewPlatformCollector(ctx context.Context, params *CollectParams, cfg *config.Config, logger *log.Logger) CollectorInterface {
collector := &NewPlatformCollector{
BaseCollector: NewBaseCollector(ctx, params, cfg, logger),
}
collector.LoginURL = "https://example.com/login"
collector.ChatURL = "https://example.com/chat"
return collector
}
// 实现 CheckLoginStatus、WaitLogin、AskQuestion 等方法
// ...
```
然后在 `interface.go` 中注册:
```go
var CollectorMap = map[string]*CollectorValue{
// ... 其他平台
"newplatform": {
Name: "新平台",
InitMethod: NewNewPlatformCollector,
Platform: "newplatform",
},
}
```
## 故障排查
### 1. 浏览器启动失败
- 检查 `ChromePath` 是否正确
- 确认Chrome版本是否兼容
- 查看日志文件了解详细错误
### 2. 找不到输入框或发送按钮
- 页面结构可能已更新
- 打开浏览器Headless: false查看实际DOM结构
- 更新对应的选择器
### 3. 登录状态失效
- 删除对应的Cookie文件
- 重新调用 `WaitLogin()` 登录
- 检查账号是否正常
### 4. 获取不到答案
- 增加超时时间
- 检查网络连接
- 查看页面是否有验证码或其他拦截
## 技术栈
- **go-rod**: Chrome DevTools Protocol的Go语言封装
- **Chrome/Chromium**: 浏览器引擎
- **Context**: Go上下文管理
- **JSON**: Cookie序列化
## 许可证
与项目主许可证保持一致。