feat: 支持模拟进入页行为
This commit is contained in:
@@ -25,8 +25,23 @@ func Login(eth *tools.Eth, debugOutput bool) error {
|
||||
CustomHeader: config.Settings.CustomHeader,
|
||||
})
|
||||
|
||||
// 嗅探 acid
|
||||
// Reality 与 Acid
|
||||
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")
|
||||
acid, err := srunClient.DetectAcid()
|
||||
if err != nil {
|
||||
|
||||
@@ -136,6 +136,12 @@ func (a *Api) FollowRedirect(addr *url.URL, onNext func(addr *url.URL) error) (*
|
||||
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) {
|
||||
baseUrl, err := url.Parse(a.BaseUrl)
|
||||
if err != nil {
|
||||
@@ -145,16 +151,50 @@ func (a *Api) DetectAcid() (string, error) {
|
||||
var AcidFound = errors.New("acid found")
|
||||
var acid string
|
||||
_, err = a.FollowRedirect(baseUrl, func(addr *url.URL) error {
|
||||
acid = addr.Query().Get(`ac_id`)
|
||||
if acid != "" {
|
||||
var ok bool
|
||||
acid, ok = a.searchAcid(addr.Query())
|
||||
if ok {
|
||||
return AcidFound
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil && !errors.Is(err, AcidFound) {
|
||||
if err != nil {
|
||||
if errors.Is(err, AcidFound) {
|
||||
return acid, nil
|
||||
}
|
||||
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 {
|
||||
|
||||
@@ -145,3 +145,7 @@ func (c Srun) DoLogin(clientIP string) error {
|
||||
func (c Srun) DetectAcid() (string, error) {
|
||||
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