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