feat: 支持模拟进入页行为

This commit is contained in:
Mmx233
2024-01-01 15:30:10 +08:00
parent 3d812a361f
commit b0f042775e
3 changed files with 65 additions and 6 deletions

View File

@@ -25,8 +25,23 @@ func Login(eth *tools.Eth, debugOutput bool) error {
CustomHeader: config.Settings.CustomHeader,
})
// 嗅探 acid
if flags.AutoAcid {
// 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 {

View File

@@ -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 {

View File

@@ -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)
}