package srun import ( "errors" "fmt" log "github.com/sirupsen/logrus" "io" "net/http" "net/url" "regexp" "strings" "unsafe" ) func (a *Api) NewDetector() *Detector { redirectReg, err := regexp.Compile( `| 1 { addr.RawQuery = locSplit[1] } else { addr.RawQuery = "" } return addr, nil } else { return url.Parse(loc) } } type _FollowRedirectConfig struct { // 获取到下一个请求地址时触发 onNextAddr func(addr *url.URL) error } func (a *Detector) _FollowRedirect(addr *url.URL, conf _FollowRedirectConfig) (*http.Response, []byte, error) { addrCopy := *addr addr = &addrCopy var body []byte var res *http.Response for { var err error res, err = a._NoDirectGET(addr.String()) if err != nil { return nil, nil, err } if res.StatusCode < 300 { body, err = io.ReadAll(res.Body) _ = res.Body.Close() if err != nil { return nil, nil, err } locMatch := a.redirectReg.FindSubmatch(body) if len(locMatch) >= 2 { for i := 1; i < len(locMatch); i++ { locBytes := locMatch[i] if len(locBytes) != 0 { addr, err = a._JoinRedirectLocation(addr, unsafe.String(unsafe.SliceData(locBytes), len(locBytes))) if err != nil { return nil, nil, err } break } } } else { break } } else { _, _ = io.Copy(io.Discard, res.Body) _ = res.Body.Close() if res.StatusCode < 400 { addr, err = a._JoinRedirectLocation(addr, res.Header.Get("location")) if err != nil { return nil, nil, err } } else { return nil, nil, fmt.Errorf("server return http status %d", res.StatusCode) } } if conf.onNextAddr != nil { if err = conf.onNextAddr(addr); err != nil { return nil, nil, err } } } return res, body, nil } func (a *Detector) _SearchAcid(query url.Values) (string, bool) { addr := query.Get(`ac_id`) return addr, addr != "" } // 用于直接获取登录页数据 func (a *Detector) _RequestPageBytes() ([]byte, error) { if a.pageUrl != "" { res, err := a._DirectGET(a.pageUrl) if err != nil { return nil, err } defer res.Body.Close() if res.StatusCode != 200 { _, _ = io.Copy(io.Discard, res.Body) return nil, fmt.Errorf("server return http status: %d", res.StatusCode) } a.page, err = io.ReadAll(res.Body) if err != nil { return nil, err } return a.page, nil } baseUrl, err := url.Parse(a.api.BaseUrl) if err != nil { return nil, err } _, a.page, err = a._FollowRedirect(baseUrl, _FollowRedirectConfig{}) return a.page, err } func (a *Detector) DetectEnc() (string, error) { if a.page == nil { _, err := a._RequestPageBytes() if err != nil { return "", err } } jsReg, err := regexp.Compile(`(?i)