|
|
||
|---|---|---|
| .. | ||
| README.md | ||
| base.go | ||
| deepseek.go | ||
| doubao.go | ||
| interface.go | ||
| manager.go | ||
| qianwen.go | ||
| utils.go | ||
| wenxin.go | ||
README.md
AI平台收集功能使用说明
概述
internal/collect 模块提供了访问多个AI平台并进行问答的功能,目前支持以下平台:
- 文心一言 (wenxin) - 百度AI助手
- DeepSeek (deepseek) - 深度求索AI
- 豆包 (doubao) - 字节跳动AI助手
- 通义千问 (qianwen) - 阿里云AI助手
架构设计
核心组件
-
CollectorInterface - 收集器接口
WaitLogin() (bool, string)- 等待登录AskQuestion(question string) (string, error)- 提问并获取答案
-
BaseCollector - 基础收集器
- 浏览器驱动管理
- Cookie管理(保存/加载)
- 页面操作工具方法
-
CollectManager - 收集管理器
- 统一管理不同平台的收集器
- 提供便捷的API调用
-
平台实现
WenxinCollector- 文心一言实现DeepseekCollector- DeepSeek实现DoubaoCollector- 豆包实现QianwenCollector- 通义千问实现
快速开始
1. 基本使用
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. 多平台对比
// 向多个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. 登录管理
// 首次使用时需要登录
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. 列出支持的平台
platforms := manager.ListPlatforms()
fmt.Printf("支持的平台: %v\n", platforms)
// 输出: 支持的平台: [wenxin deepseek doubao qianwen]
配置说明
必需的配置项
type SysConfig struct {
ChromePath string // Chrome浏览器可执行文件路径
ChromeDataDir string // Chrome用户数据目录
CookiesDir string // Cookie存储目录
LogsDir string // 日志文件目录
}
示例配置
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",
},
}
工作流程
- 初始化浏览器 - 启动Chrome浏览器实例
- 加载Cookie - 从本地文件加载之前的登录状态
- 检查登录 - 验证是否已登录
- 导航到聊天页面 - 打开AI平台的对话界面
- 输入问题 - 在输入框中输入问题
- 点击发送 - 触发AI回答
- 等待回答 - 等待AI生成完整答案
- 提取答案 - 从页面中提取回答内容
- 返回结果 - 将答案返回给调用者
注意事项
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平台,需要:
- 创建新的Collector文件,如
newplatform.go - 实现
CollectorInterface接口 - 继承
BaseCollector基础结构 - 在
interface.go的CollectorMap中注册
示例:
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 中注册:
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序列化
许可证
与项目主许可证保持一致。