geoGo/internal/collect
renzhiyuan 9c22a1dc07 3232 2026-04-26 01:00:30 +08:00
..
README.md 3443143 2026-04-24 18:49:41 +08:00
base.go 3232 2026-04-26 01:00:30 +08:00
deepseek.go 3232 2026-04-25 21:52:08 +08:00
doubao.go 3232 2026-04-26 00:48:50 +08:00
interface.go 22 2026-04-25 23:55:30 +08:00
manager.go 3232 2026-04-25 21:52:08 +08:00
qianwen.go 3232 2026-04-25 21:52:08 +08:00
utils.go 3232 2026-04-26 00:48:50 +08:00
utils_test.go 3232 2026-04-26 00:48:50 +08:00
wenxin.go 3232 2026-04-26 01:00:30 +08:00

README.md

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. 基本使用

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",
    },
}

工作流程

  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文件中修改 inputSelectorssendSelectorsanswerSelectors
  • 可以通过浏览器的开发者工具查看最新的元素选择器

4. 超时设置

  • 登录超时: 180-300秒
  • 回答超时: 120秒
  • 可根据实际情况在代码中调整

5. 无头模式

  • 开发调试时建议设置 Headless: false
  • 生产环境可以设置 Headless: true 节省资源

扩展新平台

如果要添加新的AI平台需要

  1. 创建新的Collector文件newplatform.go
  2. 实现 CollectorInterface 接口
  3. 继承 BaseCollector 基础结构
  4. interface.goCollectorMap 中注册

示例:

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序列化

许可证

与项目主许可证保持一致。