package services import ( "encoding/json" "log" "os" "time" "go-taobao/config" "go-taobao/libs" "github.com/go-rod/rod" "github.com/go-rod/rod/lib/proto" ) // Auth 认证服务,管理登录和 Cookie type Auth struct { browser *libs.BrowserInfo cfg *config.RushConfig } // NewAuth 创建认证服务 func NewAuth(cfg *config.RushConfig) *Auth { return &Auth{cfg: cfg} } // Login 打开登录页面,等待用户扫码,保存 Cookie func (a *Auth) Login() error { var mgr libs.Browser a.browser = mgr.GetBrowser(a.cfg.AccountID, &libs.Fingerprint{}) page := a.browser.Page page.MustNavigate(config.LoginURL).MustWaitLoad() page.MustWaitNavigation() page.MustWaitLoad() page.MustWaitIdle() page.MustActivate() log.Println("[登录] 请扫码登录...") // 轮询等待登录成功(URL 变化表示登录完成) for { uri := page.MustEval("() => window.location.href").String() log.Printf("[登录] 当前 URL: %s", uri) if uri != config.LoginURL { log.Println("[登录] 登录成功!") break } time.Sleep(3 * time.Second) } // 导航到购物车页面获取完整 Cookie page.MustNavigate(config.CartURL).MustWaitLoad() page.MustWaitNavigation() page.MustWaitLoad() page.MustWaitIdle() // 提取并保存 Cookie cookies := a.extractCookies(page, config.CartURL) if err := a.SaveCookies(cookies); err != nil { return err } log.Printf("[登录] Cookie 已保存到 %s", a.cfg.CookieFile) a.browser.Browser.MustClose() return nil } // LoadCookies 从文件加载 Cookie func (a *Auth) LoadCookies() ([]*proto.NetworkCookieParam, error) { data, err := os.ReadFile(a.cfg.CookieFile) if err != nil { return nil, err } var cookies []*proto.NetworkCookieParam if err := json.Unmarshal(data, &cookies); err != nil { return nil, err } log.Printf("[认证] 已加载 %d 条 Cookie", len(cookies)) return cookies, nil } // SaveCookies 保存 Cookie 到文件 func (a *Auth) SaveCookies(cookies []*proto.NetworkCookieParam) error { data, err := json.MarshalIndent(cookies, "", " ") if err != nil { return err } return os.WriteFile(a.cfg.CookieFile, data, 0644) } // InjectCookies 将 Cookie 注入浏览器 func (a *Auth) InjectCookies(browser *rod.Browser, cookies []*proto.NetworkCookieParam) error { return browser.SetCookies(cookies) } // extractCookies 从页面提取 Cookie func (a *Auth) extractCookies(page *rod.Page, url string) []*proto.NetworkCookieParam { cookieArr, _ := page.Cookies([]string{url}) var cookies []*proto.NetworkCookieParam for _, cookie := range cookieArr { cookies = append(cookies, &proto.NetworkCookieParam{ Name: cookie.Name, Value: cookie.Value, Domain: cookie.Domain, Path: cookie.Path, Expires: cookie.Expires, HTTPOnly: cookie.HTTPOnly, Secure: cookie.Secure, }) } return cookies }