From b0f042775e1ababba924cd9d6b3f9082ff11f721 Mon Sep 17 00:00:00 2001 From: Mmx233 Date: Mon, 1 Jan 2024 15:30:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=A8=A1=E6=8B=9F?= =?UTF-8?q?=E8=BF=9B=E5=85=A5=E9=A1=B5=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/controllers/login.go | 19 ++++++++++++-- pkg/srun/api.go | 48 ++++++++++++++++++++++++++++++++--- pkg/srun/srun.go | 4 +++ 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/internal/controllers/login.go b/internal/controllers/login.go index 8d9219a..0f8c0f3 100644 --- a/internal/controllers/login.go +++ b/internal/controllers/login.go @@ -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 { diff --git a/pkg/srun/api.go b/pkg/srun/api.go index f79de8a..ef00a8a 100644 --- a/pkg/srun/api.go +++ b/pkg/srun/api.go @@ -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 { diff --git a/pkg/srun/srun.go b/pkg/srun/srun.go index 8bd2c8d..16ee1eb 100644 --- a/pkg/srun/srun.go +++ b/pkg/srun/srun.go @@ -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) +}