diff --git a/.gitignore b/.gitignore index c41bef6..202d160 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ client_config.json node_modules dist /mobile-dist/ +captcha_trace.md diff --git a/internal/provider/vk/internal/browserprofile/profile.go b/internal/provider/vk/internal/browserprofile/profile.go index d364f21..bdf72c4 100644 --- a/internal/provider/vk/internal/browserprofile/profile.go +++ b/internal/provider/vk/internal/browserprofile/profile.go @@ -94,8 +94,9 @@ type device struct { NotificationsPermission string `json:"notificationsPermission"` } -// Порядок заголовков h2 для fetch/XHR. Отсутствующие в запросе имена fhttp -// пропускает, поэтому один список покрывает GET и POST. +// Порядок заголовков h2. Отсутствующие в запросе имена fhttp пропускает, поэтому +// один список покрывает и навигацию (upgrade-insecure-requests, sec-fetch-user), +// и fetch/XHR (origin, content-type). var chromeHeaderOrder = []string{ "content-length", "sec-ch-ua-platform", @@ -103,14 +104,17 @@ var chromeHeaderOrder = []string{ "sec-ch-ua", "content-type", "sec-ch-ua-mobile", + "upgrade-insecure-requests", "accept", "origin", "sec-fetch-site", "sec-fetch-mode", + "sec-fetch-user", "sec-fetch-dest", "referer", "accept-encoding", "accept-language", + "cookie", "priority", } @@ -228,7 +232,12 @@ func ApplyFhttp(req *fhttp.Request, profile Profile) { req.Header.Set("sec-ch-ua-mobile", profile.SecChUaMobile) req.Header.Set("sec-ch-ua-platform", profile.SecChUaPlatform) req.Header.Set("Accept-Language", profile.AcceptLanguage) - req.Header.Set("Priority", "u=1, i") + // Навигация документа идёт с нулевым приоритетом, u=1 - профиль fetch/XHR. + if req.Header.Get("Sec-Fetch-Dest") == "document" { + req.Header.Set("Priority", "u=0, i") + } else { + req.Header.Set("Priority", "u=1, i") + } req.Header[fhttp.HeaderOrderKey] = chromeHeaderOrder } diff --git a/internal/provider/vk/internal/captcha/captcha.go b/internal/provider/vk/internal/captcha/captcha.go index bdcd479..5070c00 100644 --- a/internal/provider/vk/internal/captcha/captcha.go +++ b/internal/provider/vk/internal/captcha/captcha.go @@ -336,10 +336,16 @@ func captchaDomainFromRedirectURI(redirectURI string) string { func (s *captchaSession) fetchCaptchaHTML(redirectURI string) (string, error) { body, err := s.doRaw(fhttp.MethodGet, redirectURI, nil, map[string]string{ - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", - "Sec-Fetch-Dest": "document", - "Sec-Fetch-Mode": "navigate", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Upgrade-Insecure-Requests": "1", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + // Переход по редиректу считается пользовательской активацией. + "Sec-Fetch-User": "?1", "Sec-Fetch-Site": "cross-site", + // Referer кросс-сайтового перехода режется политикой до origin страницы, + // с которой ушли, а ей была страница звонка. + "Referer": "https://" + s.domain + "/", }) if err != nil { return "", err @@ -367,9 +373,13 @@ func (s *captchaSession) fetchDebugInfoJS(scriptURL string) (string, error) { return v, nil } } + // Бандл тянет тег