所以web请求统一使用一个req的client

This commit is contained in:
johlanse 2022-08-14 12:14:46 +08:00
parent 40a192f18b
commit 498c7c24c1
7 changed files with 95 additions and 79 deletions

View File

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

View File

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

39
utils/client.go Normal file
View File

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

View File

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

View File

@ -20,7 +20,6 @@ func Restart() {
cmd.Start()
os.Exit(3)
}()
}
func GetAbout() string {

View File

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

View File

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