feat: 支持模拟进入页行为
This commit is contained in:
@@ -25,8 +25,23 @@ func Login(eth *tools.Eth, debugOutput bool) error {
|
|||||||
CustomHeader: config.Settings.CustomHeader,
|
CustomHeader: config.Settings.CustomHeader,
|
||||||
})
|
})
|
||||||
|
|
||||||
// 嗅探 acid
|
// Reality 与 Acid
|
||||||
if flags.AutoAcid {
|
if config.Settings.Reality.Enable {
|
||||||
|
log.Debugln("开始 Reality 流程")
|
||||||
|
acid, _, err := srunClient.Reality(config.Settings.Reality.Addr, flags.AutoAcid)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorln("Reality 请求异常:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if flags.AutoAcid {
|
||||||
|
if acid != "" {
|
||||||
|
log.Debugf("使用嗅探 acid: %s", acid)
|
||||||
|
srunClient.LoginInfo.Meta.Acid = acid
|
||||||
|
} else {
|
||||||
|
log.Errorln("找不到 acid,使用配置 acid")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if flags.AutoAcid {
|
||||||
log.Debugln("开始嗅探 acid")
|
log.Debugln("开始嗅探 acid")
|
||||||
acid, err := srunClient.DetectAcid()
|
acid, err := srunClient.DetectAcid()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -136,6 +136,12 @@ func (a *Api) FollowRedirect(addr *url.URL, onNext func(addr *url.URL) error) (*
|
|||||||
return addr, nil
|
return addr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *Api) searchAcid(query url.Values) (string, bool) {
|
||||||
|
addr := query.Get(`ac_id`)
|
||||||
|
return addr, addr != ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// DetectAcid err 为 nil 时 acid 一定存在
|
||||||
func (a *Api) DetectAcid() (string, error) {
|
func (a *Api) DetectAcid() (string, error) {
|
||||||
baseUrl, err := url.Parse(a.BaseUrl)
|
baseUrl, err := url.Parse(a.BaseUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -145,16 +151,50 @@ func (a *Api) DetectAcid() (string, error) {
|
|||||||
var AcidFound = errors.New("acid found")
|
var AcidFound = errors.New("acid found")
|
||||||
var acid string
|
var acid string
|
||||||
_, err = a.FollowRedirect(baseUrl, func(addr *url.URL) error {
|
_, err = a.FollowRedirect(baseUrl, func(addr *url.URL) error {
|
||||||
acid = addr.Query().Get(`ac_id`)
|
var ok bool
|
||||||
if acid != "" {
|
acid, ok = a.searchAcid(addr.Query())
|
||||||
|
if ok {
|
||||||
return AcidFound
|
return AcidFound
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil && !errors.Is(err, AcidFound) {
|
if err != nil {
|
||||||
|
if errors.Is(err, AcidFound) {
|
||||||
|
return acid, nil
|
||||||
|
}
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return acid, nil
|
return "", ErrAcidCannotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reality acid 可能为空字符串
|
||||||
|
func (a *Api) Reality(addr string, getAcid bool) (acid string, online bool, err error) {
|
||||||
|
startUrl, err := url.Parse(addr)
|
||||||
|
if err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
var AlreadyOnline = errors.New("already online")
|
||||||
|
var finalUrl *url.URL
|
||||||
|
finalUrl, err = a.FollowRedirect(startUrl, func(addr *url.URL) error {
|
||||||
|
// 任一跳转没有跳出初始域名说明已经在线
|
||||||
|
if addr.Host == startUrl.Host {
|
||||||
|
return AlreadyOnline
|
||||||
|
}
|
||||||
|
if getAcid {
|
||||||
|
acid, _ = a.searchAcid(addr.Query())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, AlreadyOnline) {
|
||||||
|
online = true
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
online = finalUrl.Host == startUrl.Host
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoginRequest struct {
|
type LoginRequest struct {
|
||||||
|
|||||||
@@ -145,3 +145,7 @@ func (c Srun) DoLogin(clientIP string) error {
|
|||||||
func (c Srun) DetectAcid() (string, error) {
|
func (c Srun) DetectAcid() (string, error) {
|
||||||
return c.api.DetectAcid()
|
return c.api.DetectAcid()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c Srun) Reality(addr string, acid bool) (string, bool, error) {
|
||||||
|
return c.api.Reality(addr, acid)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user