From ae4dd4bf63d6434cca7465526f36f90ea02a8e6b Mon Sep 17 00:00:00 2001 From: nquidox Date: Sat, 20 Dec 2025 16:06:05 +0300 Subject: [PATCH] new client --- internal/parsers/mandarake.go | 87 ++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/internal/parsers/mandarake.go b/internal/parsers/mandarake.go index cf318aa..6249dc2 100644 --- a/internal/parsers/mandarake.go +++ b/internal/parsers/mandarake.go @@ -1,7 +1,10 @@ package parsers import ( + "context" "fmt" + "github.com/chromedp/cdproto/network" + "github.com/chromedp/chromedp" log "github.com/sirupsen/logrus" "golang.org/x/net/html" "net/http" @@ -68,7 +71,7 @@ func NewMandarakeParser(goroutinesNumber int) *MandarakeParser { func (s *MandarakeParser) HandleTasks(tasks []shared.Task, sender chan shared.TaskResult, state *appState.State) { log.Debug("Handling Mandarake tasks") - if err := s.initClient(); err != nil { + if err := s.initClient2(); err != nil { log.WithError(err).Error("Mandarake handler | Error initializing client") return } @@ -116,6 +119,7 @@ func (s *MandarakeParser) worker(receiver chan shared.Task, sender chan shared.T } } +// Deprecated: use initClient2 instead. func (s *MandarakeParser) initClient() error { //preload cookies for client req, err := http.NewRequest("GET", s.parseParams.cookieUrl, nil) @@ -123,6 +127,7 @@ func (s *MandarakeParser) initClient() error { return err } + //TODO сделать один клиент с одним джаром client := http.Client{} req.Header.Set("User-Agent", s.parseParams.userAgent) @@ -130,6 +135,7 @@ func (s *MandarakeParser) initClient() error { if err != nil { return err } + defer result.Body.Close() c := result.Cookies() log.WithField("cookies", c).Debug("Mandarake handler | Get cookies") @@ -288,3 +294,82 @@ func (s *MandarakeParser) getPrice(rawStr []string) int { } return 0 } + +//new client + +func (s *MandarakeParser) initClient2() error { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + ctx, _ = chromedp.NewContext(ctx) + + if err := chromedp.Run(ctx, + chromedp.Navigate(s.parseParams.cookieUrl), + chromedp.WaitVisible("body", chromedp.ByQuery), + ); err != nil { + return fmt.Errorf("failed to navigate: %w", err) + } + + var cookies []*network.Cookie + err := chromedp.Run(ctx, chromedp.ActionFunc(func(ctx context.Context) error { + var err error + cookies, err = network.GetCookies().Do(ctx) + return err + })) + if err != nil { + return fmt.Errorf("failed to get cookies: %w", err) + } + + var httpCookies []*http.Cookie + for _, c := range cookies { + httpCookies = append(httpCookies, &http.Cookie{ + Name: c.Name, + Value: c.Value, + Path: c.Path, + Domain: c.Domain, + Expires: float64ToTime(c.Expires), + Secure: c.Secure, + HttpOnly: c.HTTPOnly, + SameSite: convertSameSite(c.SameSite), + }) + } + + jar, err := cookiejar.New(nil) + if err != nil { + return err + } + + u, err := url.Parse(s.parseParams.cookieUrl) + if err != nil { + return err + } + + jar.SetCookies(u, httpCookies) + + client := &http.Client{ + Jar: jar, + Timeout: 30 * time.Second, + } + + s.client = client + return nil +} + +func convertSameSite(s network.CookieSameSite) http.SameSite { + switch s { + case network.CookieSameSiteStrict: + return http.SameSiteStrictMode + case network.CookieSameSiteLax: + return http.SameSiteLaxMode + case network.CookieSameSiteNone: + return http.SameSiteNoneMode + default: + return http.SameSiteDefaultMode + } +} + +func float64ToTime(unixFloat float64) time.Time { + sec := int64(unixFloat) + nsec := int64((unixFloat - float64(sec)) * 1e9) + return time.Unix(sec, nsec) +}