第一版

This commit is contained in:
zyj
2026-02-09 16:05:56 +08:00
parent fcdc5b8f2d
commit 514d7f9b0e
11 changed files with 1137 additions and 365 deletions

113
services/auth.go Normal file
View File

@@ -0,0 +1,113 @@
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
}