This commit is contained in:
parent
4ec69fcc08
commit
ae4dd4bf63
1 changed files with 86 additions and 1 deletions
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue