This commit is contained in:
parent
4ec69fcc08
commit
ae4dd4bf63
1 changed files with 86 additions and 1 deletions
|
|
@ -1,7 +1,10 @@
|
||||||
package parsers
|
package parsers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/chromedp/cdproto/network"
|
||||||
|
"github.com/chromedp/chromedp"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/html"
|
"golang.org/x/net/html"
|
||||||
"net/http"
|
"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) {
|
func (s *MandarakeParser) HandleTasks(tasks []shared.Task, sender chan shared.TaskResult, state *appState.State) {
|
||||||
log.Debug("Handling Mandarake tasks")
|
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")
|
log.WithError(err).Error("Mandarake handler | Error initializing client")
|
||||||
return
|
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 {
|
func (s *MandarakeParser) initClient() error {
|
||||||
//preload cookies for client
|
//preload cookies for client
|
||||||
req, err := http.NewRequest("GET", s.parseParams.cookieUrl, nil)
|
req, err := http.NewRequest("GET", s.parseParams.cookieUrl, nil)
|
||||||
|
|
@ -123,6 +127,7 @@ func (s *MandarakeParser) initClient() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO сделать один клиент с одним джаром
|
||||||
client := http.Client{}
|
client := http.Client{}
|
||||||
req.Header.Set("User-Agent", s.parseParams.userAgent)
|
req.Header.Set("User-Agent", s.parseParams.userAgent)
|
||||||
|
|
||||||
|
|
@ -130,6 +135,7 @@ func (s *MandarakeParser) initClient() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
defer result.Body.Close()
|
||||||
|
|
||||||
c := result.Cookies()
|
c := result.Cookies()
|
||||||
log.WithField("cookies", c).Debug("Mandarake handler | Get cookies")
|
log.WithField("cookies", c).Debug("Mandarake handler | Get cookies")
|
||||||
|
|
@ -288,3 +294,82 @@ func (s *MandarakeParser) getPrice(rawStr []string) int {
|
||||||
}
|
}
|
||||||
return 0
|
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