Files
go-taobao/services/auth.go
2026-02-09 16:05:56 +08:00

114 lines
2.8 KiB
Go
Raw Permalink 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.
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
}