第一版
This commit is contained in:
113
services/auth.go
Normal file
113
services/auth.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user