From 524bac30f57d1b2877744118220aca82296e1ad9 Mon Sep 17 00:00:00 2001 From: Mmx233 Date: Mon, 1 Jan 2024 17:47:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=97=85=E6=8E=A2=20enc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/config/flags/flags.go | 2 + internal/controllers/login.go | 19 +++++- pkg/srun/api.go | 113 +++++++++++++++++++++++++-------- pkg/srun/errors.go | 1 + pkg/srun/srun.go | 18 ++---- 5 files changed, 113 insertions(+), 40 deletions(-) diff --git a/internal/config/flags/flags.go b/internal/config/flags/flags.go index 3e3773c..411db66 100644 --- a/internal/config/flags/flags.go +++ b/internal/config/flags/flags.go @@ -12,6 +12,7 @@ var ( Debug bool AutoAcid bool Acid string + AutoEnc bool ) func init() { @@ -21,6 +22,7 @@ func init() { flag.BoolVar(&Debug, "debug", false, "enable debug mode") flag.BoolVar(&AutoAcid, "auto-acid", false, "auto detect acid") flag.StringVar(&Acid, "acid", "", "specify acid value") + flag.BoolVar(&AutoEnc, "auto-enc", false, "auto detect enc") flag.Parse() } diff --git a/internal/controllers/login.go b/internal/controllers/login.go index b295022..8063023 100644 --- a/internal/controllers/login.go +++ b/internal/controllers/login.go @@ -29,7 +29,7 @@ func Login(eth *tools.Eth, debugOutput bool) error { var acidOnReality bool if config.Settings.Reality.Enable { log.Debugln("开始 Reality 流程") - acid, _, err := srunClient.Reality(config.Settings.Reality.Addr, flags.AutoAcid) + acid, _, err := srunClient.Api.Reality(config.Settings.Reality.Addr, flags.AutoAcid) if err != nil { log.Errorln("Reality 请求异常:", err) return err @@ -46,7 +46,7 @@ func Login(eth *tools.Eth, debugOutput bool) error { } if !acidOnReality && flags.AutoAcid { log.Debugln("开始嗅探 acid") - acid, err := srunClient.DetectAcid() + acid, err := srunClient.Api.DetectAcid() if err != nil { if errors.Is(err, srun.ErrAcidCannotFound) { log.Warnln("找不到 acid,使用配置 acid") @@ -59,6 +59,21 @@ func Login(eth *tools.Eth, debugOutput bool) error { } } + if flags.AutoEnc { + log.Debugln("开始嗅探 enc") + enc, err := srunClient.Api.DetectEnc() + if err != nil { + if errors.Is(err, srun.ErrEnvCannotFound) { + log.Warnln("找不到 enc,使用配置 enc") + } else { + log.Warnf("嗅探 enc 失败,使用配置 enc: %v", err) + } + } else { + log.Debugf("使用嗅探 enc: %s", enc) + srunClient.LoginInfo.Meta.Enc = enc + } + } + // 选择输出函数 var output func(args ...interface{}) if debugOutput { diff --git a/pkg/srun/api.go b/pkg/srun/api.go index bf7a97e..45c75d9 100644 --- a/pkg/srun/api.go +++ b/pkg/srun/api.go @@ -51,7 +51,7 @@ func (a *Api) Init(conf *ApiConfig) { } func (a *Api) request(path string, query map[string]interface{}) (map[string]interface{}, error) { - log.Debugln("HTTP GET ", a.BaseUrl+path) + log.Debugln("HTTP GET", a.BaseUrl+path) callback := fmt.Sprintf("jQuery%s_%d", tool.NewRand(rand.NewSource(time.Now().UnixNano())).WithLetters("123456789").String(21), time.Now().UnixMilli()) if query == nil { query = make(map[string]interface{}, 2) @@ -118,7 +118,7 @@ func (a *Api) _FollowRedirect(addr *url.URL, conf _FollowRedirectConfig) (*url.U addrCopy := *addr addr = &addrCopy for { - log.Debugln("HTTP GET ", addr) + log.Debugln("HTTP GET", addr) req, err := http.NewRequest("GET", addr.String(), nil) if err != nil { return nil, err @@ -167,32 +167,69 @@ func (a *Api) _SearchAcid(query url.Values) (string, bool) { return addr, addr != "" } -// DetectAcid err 为 nil 时 acid 一定存在 -func (a *Api) DetectAcid() (string, error) { - // 从 html 寻找 acid +func (a *Api) DetectEnc() (string, error) { log.Debugln("HTTP GET", a.BaseUrl) res, err := a.Client.Get(a.BaseUrl) - if err == nil { - defer res.Body.Close() - if res.StatusCode == 200 { - var indexHtml []byte - indexHtml, err = io.ReadAll(res.Body) - if err == nil { - var reg *regexp.Regexp - reg, err = regexp.Compile(`"ac_id".*?value="(.+)"`) - if err != nil { - return "", err - } - result := reg.FindSubmatch(indexHtml) - if len(result) == 2 { - return string(result[1]), nil - } - } - } else { - _, _ = io.Copy(io.Discard, res.Body) - } + if err != nil { + return "", err } + defer res.Body.Close() + if res.StatusCode == 200 { + indexHtml, err := io.ReadAll(res.Body) + if err != nil { + return "", err + } + jsReg, err := regexp.Compile(`(?i)