From 498c7c24c1fc8c09105d45c917c998cfa6880f9f Mon Sep 17 00:00:00 2001 From: johlanse Date: Sun, 14 Aug 2022 12:14:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=80=E4=BB=A5web=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8=E4=B8=80=E4=B8=AAreq?= =?UTF-8?q?=E7=9A=84client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core.go | 25 +++--------------- lib/score.go | 62 ++++++++++++++++++++++++++++++--------------- utils/client.go | 39 ++++++++++++++++++++++++++++ utils/stydyState.go | 34 ------------------------- utils/util.go | 1 - web/controller.go | 9 ++++++- web/router.go | 4 +-- 7 files changed, 95 insertions(+), 79 deletions(-) create mode 100644 utils/client.go diff --git a/lib/core.go b/lib/core.go index b4963cf..558a1e3 100644 --- a/lib/core.go +++ b/lib/core.go @@ -17,7 +17,6 @@ import ( qrcodeTerminal "github.com/Baozisoftware/qrcode-terminal-go" "github.com/google/uuid" - "github.com/imroc/req/v3" "github.com/makiuchi-d/gozxing" "github.com/makiuchi-d/gozxing/qrcode" "github.com/nfnt/resize" @@ -28,6 +27,7 @@ import ( "github.com/johlanse/study_xxqg/conf" "github.com/johlanse/study_xxqg/model" + "github.com/johlanse/study_xxqg/utils" ) // Core @@ -89,8 +89,7 @@ func (c *Core) Init() { } func GetToken(code, sign, pushId string) (bool, error) { - client := req.C() - client.SetCommonHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36") + client := utils.GetClient() response, err := client.R().SetQueryParams(map[string]string{ "code": code, "state": sign + uuid.New().String(), @@ -134,12 +133,7 @@ func GetToken(code, sign, pushId string) (bool, error) { * @return error */ func (c *Core) GenerateCode() (string, string, error) { - client := req.C() - client.OnAfterResponse(func(client *req.Client, response *req.Response) error { - return nil - }) - client.SetCommonHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36") - + client := utils.GetClient() g := new(gennerateResp) _, err := client.R().SetResult(g).Get("https://login.xuexi.cn/user/qrcode/generate") if err != nil { @@ -168,12 +162,7 @@ func (c *Core) GenerateCode() (string, string, error) { } func (c *Core) CheckQrCode(code, pushID string) (*model.User, bool, error) { - client := req.C() - client.OnAfterResponse(func(client *req.Client, response *req.Response) error { - return nil - }) - client.SetCommonHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36") - + client := utils.GetClient() checkQrCode := func() (bool, string) { res := new(checkQrCodeResp) _, err := client.R().SetResult(res).SetFormData(map[string]string{ @@ -239,12 +228,6 @@ func (c *Core) L(retryTimes int, pushID string) (*model.User, error) { if err != nil { return nil, err } - client := req.C() - client.OnAfterResponse(func(client *req.Client, response *req.Response) error { - return nil - }) - client.SetCommonHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36") - for i := 0; i < 150; i++ { user, b, err := c.CheckQrCode(codeData, pushID) if b && err == nil { diff --git a/lib/score.go b/lib/score.go index 3c104d7..705ae6c 100644 --- a/lib/score.go +++ b/lib/score.go @@ -1,14 +1,14 @@ package lib import ( - "errors" "fmt" "net/http" "time" - "github.com/guonaihong/gout" log "github.com/sirupsen/logrus" "github.com/tidwall/gjson" + + "github.com/johlanse/study_xxqg/utils" ) type Score struct { @@ -25,42 +25,64 @@ type Data struct { func GetUserScore(cookies []*http.Cookie) (Score, error) { var score Score var resp []byte - // 获取用户总分 - err := gout.GET(userTotalscoreUrl).SetCookies(cookies...).SetHeader(gout.H{ + + header := map[string]string{ "Cache-Control": "no-cache", - }).BindBody(&resp).Do() + } + + client := utils.GetClient() + response, err := client.R().SetCookies(cookies...).SetHeaders(header).Get(userTotalscoreUrl) if err != nil { log.Errorln("获取用户总分错误" + err.Error()) - return Score{}, err } - data := string(resp) - log.Infoln(data) - if !gjson.GetBytes(resp, "ok").Bool() { - return Score{}, errors.New("token check failed") - } + resp = response.Bytes() + // 获取用户总分 + // err := gout.GET(userTotalscoreUrl).SetCookies(cookies...).SetHeader(gout.H{}).BindBody(&resp).Do() + // if err != nil { + // log.Errorln("获取用户总分错误" + err.Error()) + + // return Score{}, err + // } + // data := string(resp) + // log.Infoln(data) + // if !gjson.GetBytes(resp, "ok").Bool() { + // return Score{}, errors.New("token check failed") + // } // log.Debugln(gjson.GetBytes(resp, "@this|@pretty")) score.TotalScore = int(gjson.GetBytes(resp, "data.score").Int()) // 获取用户今日得分 - err = gout.GET(userTodaytotalscoreUrl).SetCookies(cookies...).SetHeader(gout.H{ - "Cache-Control": "no-cache", - }).BindBody(&resp).Do() - if err != nil { - log.Errorln("获取用户每日总分错误" + err.Error()) + // err = gout.GET(userTodaytotalscoreUrl).SetCookies(cookies...).SetHeader(gout.H{ + // "Cache-Control": "no-cache", + // }).BindBody(&resp).Do() + // if err != nil { + // log.Errorln("获取用户每日总分错误" + err.Error()) + // return Score{}, err + // } + response, err = client.R().SetCookies(cookies...).SetHeaders(header).Get(userTodaytotalscoreUrl) + if err != nil { + log.Errorln("获取用户总分错误" + err.Error()) return Score{}, err } + resp = response.Bytes() // log.Debugln(gjson.GetBytes(resp, "@this|@pretty")) score.TodayScore = int(gjson.GetBytes(resp, "data.score").Int()) - err = gout.GET(userRatescoreUrl).SetCookies(cookies...).SetHeader(gout.H{ - "Cache-Control": "no-cache", - }).BindBody(&resp).Do() + // err = gout.GET(userRatescoreUrl).SetCookies(cookies...).SetHeader(gout.H{ + // "Cache-Control": "no-cache", + // }).BindBody(&resp).Do() + // if err != nil { + // log.Errorln("获取用户积分出现错误" + err.Error()) + // return Score{}, err + // } + response, err = client.R().SetCookies(cookies...).SetHeaders(header).Get(userRatescoreUrl) if err != nil { - log.Errorln("获取用户积分出现错误" + err.Error()) + log.Errorln("获取用户总分错误" + err.Error()) return Score{}, err } + resp = response.Bytes() // log.Debugln(gjson.GetBytes(resp, "@this|@pretty")) datas := gjson.GetBytes(resp, "data.taskProgress").Array() m := make(map[string]Data, 7) diff --git a/utils/client.go b/utils/client.go new file mode 100644 index 0000000..ba61c5c --- /dev/null +++ b/utils/client.go @@ -0,0 +1,39 @@ +package utils + +import ( + "net/http" + + "github.com/imroc/req/v3" + log "github.com/sirupsen/logrus" +) + +var client *req.Client + +func init() { + client = req.C() + client.SetProxy(http.ProxyFromEnvironment) + if log.GetLevel() == log.DebugLevel { + client.DebugLog = true + } + client.SetLogger(&myLog{}) + client.SetCommonHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36") +} + +func GetClient() *req.Client { + return client +} + +type myLog struct { +} + +func (m myLog) Errorf(format string, v ...interface{}) { + log.Errorf(format, v) +} + +func (m myLog) Warnf(format string, v ...interface{}) { + log.Warnf(format, v) +} + +func (m myLog) Debugf(format string, v ...interface{}) { + log.Debugf(format, v) +} diff --git a/utils/stydyState.go b/utils/stydyState.go index 125304b..d4b585b 100644 --- a/utils/stydyState.go +++ b/utils/stydyState.go @@ -1,35 +1 @@ package utils - -import ( - "errors" - "sync" - - "github.com/johlanse/study_xxqg/lib" -) - -// 该文件的方法为保存当前正在学习的用户 - -var ( - state sync.Map -) - -func Add(uid string, core *lib.Core) error { - _, ok := state.Load(uid) - if ok { - return errors.New("the user is studying") - } else { - state.Store(uid, core) - return nil - } -} - -func Delete(uid string) error { - state.Delete(uid) - return nil -} - -func Item(item func(uid string, core *lib.Core) bool) { - state.Range(func(key, value interface{}) bool { - return item(key.(string), value.(*lib.Core)) - }) -} diff --git a/utils/util.go b/utils/util.go index 2459ddb..3651772 100644 --- a/utils/util.go +++ b/utils/util.go @@ -20,7 +20,6 @@ func Restart() { cmd.Start() os.Exit(3) }() - } func GetAbout() string { diff --git a/web/controller.go b/web/controller.go index cde9628..674d62b 100644 --- a/web/controller.go +++ b/web/controller.go @@ -291,8 +291,15 @@ func getLog() gin.HandlerFunc { func sign() gin.HandlerFunc { return func(ctx *gin.Context) { - response, err := http.Get("https://pc-api.xuexi.cn/open/api/sns/sign") //nolint:bodyclose + response, err := utils.GetClient().R().Get("https://pc-api.xuexi.cn/open/api/sns/sign") if err != nil { + ctx.JSON(403, Resp{ + Code: 403, + Message: "", + Data: nil, + Success: false, + Error: err.Error(), + }) return } ctx.Writer.WriteHeader(200) diff --git a/web/router.go b/web/router.go index 89ed1f3..da4c5df 100644 --- a/web/router.go +++ b/web/router.go @@ -83,8 +83,8 @@ func RouterInit() *gin.Engine { router.GET("/log", check(), getLog()) // 登录xxqg的三个接口 - router.GET("/sign/", check(), sign()) - router.GET("/login/*proxyPath", check(), generate()) + router.GET("/sign/", sign()) + router.GET("/login/*proxyPath", generate()) router.POST("/login/*proxyPath", check(), generate()) return router }