增加代码注释,修复答题翻页
This commit is contained in:
parent
2d120bcf32
commit
7dd67cee7e
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,42 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
<script src="qrcode.js"></script>
|
||||
<style>
|
||||
.wx{
|
||||
font-size: 30px;
|
||||
color: red;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<button><a id="login" href="#"><h1>点击登录跳转学习强国app</h1></a></button>
|
||||
</div>
|
||||
<div id="wx" class="wx"></div>
|
||||
<div id="qrcode" style="margin-top: 10px">
|
||||
<img id="img" src="#" alt="#"/>
|
||||
</div>
|
||||
</body>
|
||||
<script>
|
||||
function load() {
|
||||
if (isWechat()){
|
||||
document.getElementById("wx").innerText = "当前为微信环境,请点击右上角浏览器中打开"
|
||||
}
|
||||
let search = window.location.search
|
||||
search = search.substring(1,search.length)
|
||||
document.getElementById("login").setAttribute("href","dtxuexi://appclient/page/study_feeds?url="+search)
|
||||
console.log(unescape(search))
|
||||
let imgBase64 = jrQrcode.getQrBase64(unescape(search), {});
|
||||
document.getElementById("img").setAttribute("src",imgBase64)
|
||||
document.getElementById("login").click()
|
||||
}
|
||||
function isWechat() {
|
||||
return /MicroMessenger/i.test(window.navigator.userAgent);
|
||||
}
|
||||
load()
|
||||
|
||||
</script>
|
||||
</html>
|
127
lib/respond.go
127
lib/respond.go
|
@ -1,13 +1,20 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
rand2 "math/rand"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/imroc/req/v3"
|
||||
"github.com/mxschmitt/playwright-go"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/tidwall/gjson"
|
||||
|
||||
"github.com/huoxue1/study_xxqg/model"
|
||||
)
|
||||
|
@ -23,6 +30,12 @@ div:nth-child(7) > div.my-points-card-footer > div.buttonbox > div`
|
|||
div > div.my-points-section > div.my-points-content > div:nth-child(6) > div.my-points-card-footer > div.buttonbox > div`
|
||||
)
|
||||
|
||||
// RespondDaily
|
||||
/* @Description:
|
||||
* @receiver c
|
||||
* @param user
|
||||
* @param model
|
||||
*/
|
||||
func (c *Core) RespondDaily(user *model.User, model string) {
|
||||
defer func() {
|
||||
err := recover()
|
||||
|
@ -110,9 +123,22 @@ func (c *Core) RespondDaily(user *model.User, model string) {
|
|||
|
||||
return
|
||||
}
|
||||
err = page.Click(WEEKEND)
|
||||
// err = page.Click(WEEKEND)
|
||||
// if err != nil {
|
||||
// log.Errorln("跳转到积分页面错误")
|
||||
// return
|
||||
//}
|
||||
id, err := getweekID(user.ToCookies())
|
||||
if err != nil {
|
||||
log.Errorln("跳转到积分页面错误")
|
||||
return
|
||||
}
|
||||
_, err = page.Goto(fmt.Sprintf("https://pc.xuexi.cn/points/exam-weekly-detail.html?id=%d", id), playwright.PageGotoOptions{
|
||||
Referer: playwright.String(MyPointsUri),
|
||||
Timeout: playwright.Float(10000),
|
||||
WaitUntil: playwright.WaitUntilStateDomcontentloaded,
|
||||
})
|
||||
if err != nil {
|
||||
log.Errorln("跳转到答题页面错误" + err.Error())
|
||||
return
|
||||
}
|
||||
c.Push("text", "已加载每周答题模块")
|
||||
|
@ -125,10 +151,23 @@ func (c *Core) RespondDaily(user *model.User, model string) {
|
|||
|
||||
return
|
||||
}
|
||||
err = page.Click(SPECIALBUTTON)
|
||||
// err = page.Click(SPECIALBUTTON)
|
||||
// if err != nil {
|
||||
// log.Errorln("跳转到积分页面错误")
|
||||
//
|
||||
// return
|
||||
//}
|
||||
id, err := getSpecialID(user.ToCookies())
|
||||
if err != nil {
|
||||
log.Errorln("跳转到积分页面错误")
|
||||
|
||||
return
|
||||
}
|
||||
_, err = page.Goto(fmt.Sprintf("https://pc.xuexi.cn/points/exam-paper-detail.html?id=%d", id), playwright.PageGotoOptions{
|
||||
Referer: playwright.String(MyPointsUri),
|
||||
Timeout: playwright.Float(10000),
|
||||
WaitUntil: playwright.WaitUntilStateDomcontentloaded,
|
||||
})
|
||||
if err != nil {
|
||||
log.Errorln("跳转到答题页面错误" + err.Error())
|
||||
return
|
||||
}
|
||||
c.Push("text", "已加载专项答题模块")
|
||||
|
@ -136,9 +175,9 @@ func (c *Core) RespondDaily(user *model.User, model string) {
|
|||
}
|
||||
time.Sleep(5 * time.Second)
|
||||
// 跳转到答题页面,若返回true则说明已答完
|
||||
if getAnswerPage(page, model) {
|
||||
return
|
||||
}
|
||||
// if getAnswerPage(page, model) {
|
||||
// return
|
||||
//}
|
||||
|
||||
tryCount := 0
|
||||
for true {
|
||||
|
@ -595,3 +634,75 @@ func RemoveRepByLoop(slc []string) []string {
|
|||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func getSpecialID(cookies []*http.Cookie) (int, error) {
|
||||
c := req.C()
|
||||
c.SetCommonCookies(cookies...)
|
||||
repo, err := c.R().SetQueryParams(map[string]string{"pageSize": "1000", "pageNo": "1"}).Get(querySpecialList)
|
||||
if err != nil {
|
||||
log.Errorln("获取专项答题列表错误" + err.Error())
|
||||
return 0, err
|
||||
}
|
||||
dataB64, err := repo.ToString()
|
||||
if err != nil {
|
||||
log.Errorln("获取专项答题列表获取string错误" + err.Error())
|
||||
return 0, err
|
||||
}
|
||||
data, err := base64.StdEncoding.DecodeString(gjson.Get(dataB64, "data_str").String())
|
||||
if err != nil {
|
||||
log.Errorln("获取专项答题列表转换b64错误" + err.Error())
|
||||
return 0, err
|
||||
}
|
||||
list := new(SpecialList)
|
||||
err = json.Unmarshal(data, list)
|
||||
if err != nil {
|
||||
log.Errorln("获取专项答题列表转换json错误" + err.Error())
|
||||
return 0, err
|
||||
}
|
||||
log.Infoln(fmt.Sprintf("共获取到专项答题%d个", list.TotalCount))
|
||||
for _, s := range list.List {
|
||||
if s.TipScore == 0 {
|
||||
log.Infoln(fmt.Sprintf("获取到未答专项答题: %v,id: %v", s.Name, s.Id))
|
||||
return s.Id, nil
|
||||
}
|
||||
}
|
||||
log.Warningln("你已不存在未答的专项答题了")
|
||||
return 0, errors.New("未找到专项答题")
|
||||
}
|
||||
|
||||
func getweekID(cookies []*http.Cookie) (int, error) {
|
||||
c := req.C()
|
||||
c.SetCommonCookies(cookies...)
|
||||
repo, err := c.R().SetQueryParams(map[string]string{"pageSize": "500", "pageNo": "1"}).Get(queryWeekList)
|
||||
if err != nil {
|
||||
log.Errorln("获取每周答题列表错误" + err.Error())
|
||||
return 0, err
|
||||
}
|
||||
dataB64, err := repo.ToString()
|
||||
if err != nil {
|
||||
log.Errorln("获取每周答题列表获取string错误" + err.Error())
|
||||
return 0, err
|
||||
}
|
||||
data, err := base64.StdEncoding.DecodeString(gjson.Get(dataB64, "data_str").String())
|
||||
if err != nil {
|
||||
log.Errorln("获取每周答题列表转换b64错误" + err.Error())
|
||||
return 0, err
|
||||
}
|
||||
list := new(WeekList)
|
||||
err = json.Unmarshal(data, list)
|
||||
if err != nil {
|
||||
log.Errorln("获取每周答题列表转换json错误" + err.Error())
|
||||
return 0, err
|
||||
}
|
||||
log.Infoln(fmt.Sprintf("共获取到每周答题%d个", list.TotalCount))
|
||||
for _, s := range list.List {
|
||||
for _, practice := range s.Practices {
|
||||
if practice.TipScore == 0 {
|
||||
log.Infoln(fmt.Sprintf("获取到未答每周答题: %v,id: %v", practice.Name, practice.Id))
|
||||
return practice.Id, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
log.Warningln("你已不存在未答的每周答题了")
|
||||
return 0, errors.New("未找到每周答题")
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ func GetUserScore(cookies []*http.Cookie) (Score, error) {
|
|||
var score Score
|
||||
var resp []byte
|
||||
// 获取用户总分
|
||||
err := gout.GET(user_totalScore_url).SetCookies(cookies...).SetHeader(gout.H{
|
||||
err := gout.GET(userTotalscoreUrl).SetCookies(cookies...).SetHeader(gout.H{
|
||||
"Cache-Control": "no-cache",
|
||||
}).BindBody(&resp).Do()
|
||||
if err != nil {
|
||||
|
@ -43,7 +43,7 @@ func GetUserScore(cookies []*http.Cookie) (Score, error) {
|
|||
score.TotalScore = int(gjson.GetBytes(resp, "data.score").Int())
|
||||
|
||||
// 获取用户今日得分
|
||||
err = gout.GET(user_todayTotalScore_url).SetCookies(cookies...).SetHeader(gout.H{
|
||||
err = gout.GET(userTodaytotalscoreUrl).SetCookies(cookies...).SetHeader(gout.H{
|
||||
"Cache-Control": "no-cache",
|
||||
}).BindBody(&resp).Do()
|
||||
if err != nil {
|
||||
|
@ -54,7 +54,7 @@ func GetUserScore(cookies []*http.Cookie) (Score, error) {
|
|||
// log.Debugln(gjson.GetBytes(resp, "@this|@pretty"))
|
||||
score.TodayScore = int(gjson.GetBytes(resp, "data.score").Int())
|
||||
|
||||
err = gout.GET(user_rateScore_url).SetCookies(cookies...).SetHeader(gout.H{
|
||||
err = gout.GET(userRatescoreUrl).SetCookies(cookies...).SetHeader(gout.H{
|
||||
"Cache-Control": "no-cache",
|
||||
}).BindBody(&resp).Do()
|
||||
if err != nil {
|
||||
|
|
79
lib/url.go
79
lib/url.go
|
@ -1,8 +1,79 @@
|
|||
package lib
|
||||
|
||||
const (
|
||||
user_Info_url = "https://pc-api.xuexi.cn/open/api/user/info"
|
||||
user_totalScore_url = "https://pc-api.xuexi.cn/open/api/score/get"
|
||||
user_todayTotalScore_url = "https://pc-api.xuexi.cn/open/api/score/today/query"
|
||||
user_rateScore_url = "https://pc-proxy-api.xuexi.cn/api/score/days/listScoreProgress?sence=score&deviceType=2"
|
||||
userInfoUrl = "https://pc-api.xuexi.cn/open/api/user/info"
|
||||
userTotalscoreUrl = "https://pc-api.xuexi.cn/open/api/score/get"
|
||||
userTodaytotalscoreUrl = "https://pc-api.xuexi.cn/open/api/score/today/query"
|
||||
userRatescoreUrl = "https://pc-proxy-api.xuexi.cn/api/score/days/listScoreProgress?sence=score&deviceType=2"
|
||||
|
||||
// pageSize=1000&pageNo=1
|
||||
querySpecialList = "https://pc-proxy-api.xuexi.cn/api/exam/service/paper/pc/list"
|
||||
queryWeekList = "https://pc-proxy-api.xuexi.cn/api/exam/service/practice/pc/weekly/more"
|
||||
)
|
||||
|
||||
type SpecialList struct {
|
||||
PageNo int `json:"pageNo"`
|
||||
PageSize int `json:"pageSize"`
|
||||
TotalPageCount int `json:"totalPageCount"`
|
||||
TotalCount int `json:"totalCount"`
|
||||
List []struct {
|
||||
TipScore int `json:"tipScore"`
|
||||
EndDate string `json:"endDate"`
|
||||
Achievement struct {
|
||||
Score int `json:"score"`
|
||||
Total int `json:"total"`
|
||||
Correct int `json:"correct"`
|
||||
} `json:"achievement"`
|
||||
Year int `json:"year"`
|
||||
SeeSolution bool `json:"seeSolution"`
|
||||
Score int `json:"score"`
|
||||
ExamScoreId int `json:"examScoreId"`
|
||||
UsedTime int `json:"usedTime"`
|
||||
Overdue bool `json:"overdue"`
|
||||
Month int `json:"month"`
|
||||
Name string `json:"name"`
|
||||
QuestionNum int `json:"questionNum"`
|
||||
AlreadyAnswerNum int `json:"alreadyAnswerNum"`
|
||||
StartTime string `json:"startTime"`
|
||||
Id int `json:"id"`
|
||||
ExamTime int `json:"examTime"`
|
||||
Forever int `json:"forever"`
|
||||
StartDate string `json:"startDate"`
|
||||
Status int `json:"status"`
|
||||
} `json:"list"`
|
||||
PageNum int `json:"pageNum"`
|
||||
}
|
||||
|
||||
type WeekList struct {
|
||||
PageNo int `json:"pageNo"`
|
||||
PageSize int `json:"pageSize"`
|
||||
TotalPageCount int `json:"totalPageCount"`
|
||||
TotalCount int `json:"totalCount"`
|
||||
List []struct {
|
||||
Month string `json:"month"`
|
||||
Practices []struct {
|
||||
SeeSolution bool `json:"seeSolution"`
|
||||
TipScore int `json:"tipScore"`
|
||||
ExamScoreId int `json:"examScoreId"`
|
||||
Overdue bool `json:"overdue"`
|
||||
Achievement struct {
|
||||
Total int `json:"total"`
|
||||
Correct int `json:"correct"`
|
||||
} `json:"achievement"`
|
||||
Name string `json:"name"`
|
||||
BeginYear int `json:"beginYear"`
|
||||
StartTime string `json:"startTime"`
|
||||
Id int `json:"id"`
|
||||
BeginMonth int `json:"beginMonth"`
|
||||
Status int `json:"status"`
|
||||
TipScoreReasonType int `json:"tipScoreReasonType"`
|
||||
} `json:"practices"`
|
||||
} `json:"list"`
|
||||
PageNum int `json:"pageNum"`
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
{"month":"5月","practices":[{"seeSolution":true,"tipScore":4,"examScoreId":-1,"overdue":false,"achievement":{"total":5,"correct":4},"name":"2022年5月第四周答题","beginYear":2022,"startTime":"2022-05-23 10:35:00","id":276,"beginMonth":5,"status":2,"tipScoreReasonType":0},{"seeSolution":true,"tipScore":4,"examScoreId":-1,"overdue":false,"achievement":{"total":5,"correct":4},"name":"2022年5月第三周答题","beginYear":2022,"startTime":"2022-05-16 09:00:00","id":275,"beginMonth":5,"status":2,"tipScoreReasonType":0},{"seeSolution":true,"tipScore":4,"examScoreId":-1,"overdue":false,"achievement":{"total":5,"correct":4},"name":"2022年5月第二周答题","beginYear":2022,"startTime":"2022-05-09 08:30:00","id":274,"beginMonth":5,"status":2,"tipScoreReasonType":0},{"seeSolution":true,"tipScore":5,"examScoreId":-1,"overdue":false,"achievement":{"total":5,"correct":5},"name":"2022年5月第一周答题","beginYear":2022,"startTime":"2022-05-02 08:30:00","id":273,"beginMonth":5,"status":2,"tipScoreReasonType":0}]}
|
||||
|
||||
*/
|
||||
|
|
|
@ -20,7 +20,7 @@ import (
|
|||
*/
|
||||
func GetUserInfo(cookies []*http.Cookie) (string, string, error) {
|
||||
var resp []byte
|
||||
err := gout.GET(user_Info_url).
|
||||
err := gout.GET(userInfoUrl).
|
||||
SetCookies(cookies...).
|
||||
SetHeader(gout.H{
|
||||
"Cache-Control": "no-cache",
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// Package utils
|
||||
// @Description:
|
||||
package utils
|
||||
|
||||
import (
|
||||
|
@ -6,6 +8,11 @@ import (
|
|||
"os"
|
||||
)
|
||||
|
||||
// FileIsExist
|
||||
/* @Description:
|
||||
* @param path
|
||||
* @return bool
|
||||
*/
|
||||
func FileIsExist(path string) bool {
|
||||
_, err := os.Stat(path)
|
||||
if err == nil {
|
||||
|
@ -17,6 +24,11 @@ func FileIsExist(path string) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
// StrMd5
|
||||
/* @Description:
|
||||
* @param str
|
||||
* @return retMd5
|
||||
*/
|
||||
func StrMd5(str string) (retMd5 string) {
|
||||
h := md5.New()
|
||||
h.Write([]byte(str))
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// Package web
|
||||
// @Description:
|
||||
package web
|
||||
|
||||
import (
|
||||
|
@ -23,7 +25,11 @@ var (
|
|||
state = sync.Map{}
|
||||
)
|
||||
|
||||
func CheckToken() gin.HandlerFunc {
|
||||
// checkToken
|
||||
/* @Description:
|
||||
* @return gin.HandlerFunc
|
||||
*/
|
||||
func checkToken() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
token := ctx.Param("token")
|
||||
config := conf.GetConfig()
|
||||
|
@ -48,7 +54,7 @@ func CheckToken() gin.HandlerFunc {
|
|||
}
|
||||
}
|
||||
|
||||
func Login() gin.HandlerFunc {
|
||||
func userLogin() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
type user struct {
|
||||
Account string `json:"account"`
|
||||
|
@ -176,7 +182,7 @@ func getUsers() gin.HandlerFunc {
|
|||
}
|
||||
}
|
||||
|
||||
func Cors() gin.HandlerFunc {
|
||||
func cors() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
method := c.Request.Method
|
||||
origin := c.Request.Header.Get("Origin") // 请求头部
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// Package web
|
||||
// @Description: 封装了所以web相关的内容
|
||||
package web
|
||||
|
||||
import (
|
||||
|
@ -10,6 +12,7 @@ import (
|
|||
"github.com/huoxue1/study_xxqg/utils"
|
||||
)
|
||||
|
||||
// 将静态文件嵌入到可执行程序中来
|
||||
//go:embed xxqg/build
|
||||
var static embed.FS
|
||||
|
||||
|
@ -18,41 +21,46 @@ var static embed.FS
|
|||
// @return *gin.Engine
|
||||
func RouterInit() *gin.Engine {
|
||||
router := gin.Default()
|
||||
router.Use(Cors())
|
||||
|
||||
router.Group("/wx", func(context *gin.Context) {
|
||||
|
||||
})
|
||||
router.Use(cors())
|
||||
|
||||
// 挂载静态文件
|
||||
router.StaticFS("/static", http.FS(static))
|
||||
// 访问首页时跳转到对应页面
|
||||
router.GET("/", func(ctx *gin.Context) {
|
||||
ctx.Redirect(301, "/static/xxqg/build/home.html")
|
||||
})
|
||||
|
||||
// 对权限的管理组
|
||||
auth := router.Group("/auth")
|
||||
auth.POST("/login", Login())
|
||||
auth.POST("/check/:token", CheckToken())
|
||||
// 用户登录的接口
|
||||
auth.POST("/login", userLogin())
|
||||
// 检查登录状态的token是否正确
|
||||
auth.POST("/check/:token", checkToken())
|
||||
|
||||
// 对于用户可自定义挂载文件的目录
|
||||
if utils.FileIsExist("dist") {
|
||||
router.StaticFS("/dist", gin.Dir("./dist/", true))
|
||||
}
|
||||
|
||||
// 对用户管理的组
|
||||
user := router.Group("/user", check())
|
||||
// 添加用户
|
||||
user.POST("", addUser())
|
||||
|
||||
// 获取所以已登陆的用户
|
||||
user.GET("/", getUsers())
|
||||
|
||||
// 删除用户
|
||||
user.DELETE("/", deleteUser())
|
||||
|
||||
// 获取用户成绩
|
||||
router.GET("/score", getScore())
|
||||
|
||||
// 让一个用户开始学习
|
||||
router.POST("/study", study())
|
||||
|
||||
// 让一个用户停止学习
|
||||
router.POST("/stop_study", check(), stopStudy())
|
||||
|
||||
// 获取程序当天的运行日志
|
||||
router.GET("/log", check(), getLog())
|
||||
|
||||
// 登录xxqg的三个接口
|
||||
router.GET("/sign/*proxyPath", check(), sign())
|
||||
router.GET("/login/*proxyPath", check(), generate())
|
||||
router.POST("/login/*proxyPath", check(), generate())
|
||||
|
|
Loading…
Reference in New Issue