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)