243 lines
5.3 KiB
Go
243 lines
5.3 KiB
Go
package web
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httputil"
|
|
"net/url"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/huoxue1/study_xxqg/lib"
|
|
"github.com/huoxue1/study_xxqg/model"
|
|
)
|
|
|
|
var (
|
|
state = sync.Map{}
|
|
)
|
|
|
|
func getScore() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
token := ctx.Query("token")
|
|
score, err := lib.GetUserScore(model.TokenToCookies(token))
|
|
if err != nil {
|
|
ctx.JSON(403, Resp{
|
|
Code: 403,
|
|
Message: "",
|
|
Data: err.Error(),
|
|
Success: false,
|
|
Error: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
ctx.JSON(200, Resp{
|
|
Code: 200,
|
|
Message: "获取成功",
|
|
Data: lib.PrintScore(score),
|
|
Success: true,
|
|
Error: "",
|
|
})
|
|
}
|
|
}
|
|
|
|
func addUser() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
type params struct {
|
|
Code string `json:"code"`
|
|
State string `json:"state"`
|
|
}
|
|
p := new(params)
|
|
err := ctx.BindJSON(p)
|
|
if err != nil {
|
|
ctx.JSON(403, Resp{
|
|
Code: 403,
|
|
Message: "",
|
|
Data: err.Error(),
|
|
Success: false,
|
|
Error: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
_, err = lib.GetToken(p.Code, p.State)
|
|
if err != nil {
|
|
ctx.JSON(403, Resp{
|
|
Code: 403,
|
|
Message: "",
|
|
Data: err.Error(),
|
|
Success: false,
|
|
Error: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
ctx.JSON(200, Resp{
|
|
Code: 200,
|
|
Message: "登录成功",
|
|
Data: "登录成功",
|
|
Success: true,
|
|
Error: "",
|
|
})
|
|
}
|
|
}
|
|
|
|
func getUsers() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
users, err := model.Query()
|
|
if err != nil {
|
|
return
|
|
}
|
|
if users == nil {
|
|
users = []*model.User{}
|
|
}
|
|
var datas []map[string]interface{}
|
|
for _, user := range users {
|
|
var isStudy = false
|
|
_, ok := state.Load(user.UID)
|
|
if ok {
|
|
isStudy = true
|
|
}
|
|
datas = append(datas, map[string]interface{}{
|
|
"nick": user.Nick,
|
|
"uid": user.UID,
|
|
"token": user.Token,
|
|
"login_time": user.LoginTime,
|
|
"is_study": isStudy,
|
|
})
|
|
}
|
|
ctx.JSON(200, Resp{
|
|
Code: 200,
|
|
Message: "查询成功",
|
|
Data: datas,
|
|
Success: true,
|
|
Error: "",
|
|
})
|
|
}
|
|
}
|
|
|
|
func Cors() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
method := c.Request.Method
|
|
origin := c.Request.Header.Get("Origin") // 请求头部
|
|
if origin != "" {
|
|
// 接收客户端发送的origin (重要!)
|
|
c.Writer.Header().Set("Access-Control-Allow-Origin", origin)
|
|
// 服务器支持的所有跨域请求的方法
|
|
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
|
|
// 允许跨域设置可以返回其他子段,可以自定义字段
|
|
c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session")
|
|
// 允许浏览器(客户端)可以解析的头部 (重要)
|
|
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers")
|
|
// 设置缓存时间
|
|
c.Header("Access-Control-Max-Age", "172800")
|
|
// 允许客户端传递校验信息比如 cookie (重要)
|
|
c.Header("Access-Control-Allow-Credentials", "true")
|
|
}
|
|
|
|
// 允许类型校验
|
|
if method == "OPTIONS" {
|
|
c.JSON(http.StatusOK, "ok!")
|
|
}
|
|
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
log.Printf("Panic info is: %v", err)
|
|
}
|
|
}()
|
|
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
func study() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
uid := ctx.Query("uid")
|
|
user := model.Find(uid)
|
|
core := &lib.Core{
|
|
ShowBrowser: false,
|
|
Push: func(kind, message string) {
|
|
},
|
|
}
|
|
core.Init()
|
|
state.Store(uid, core)
|
|
go func() {
|
|
core.LearnArticle(user)
|
|
core.LearnVideo(user)
|
|
core.RespondDaily(user, "daily")
|
|
core.RespondDaily(user, "weekly")
|
|
core.RespondDaily(user, "special")
|
|
state.Delete(uid)
|
|
}()
|
|
}
|
|
}
|
|
|
|
func stopStudy() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
uid := ctx.Query("uid")
|
|
value, ok := state.Load(uid)
|
|
if !ok {
|
|
return
|
|
}
|
|
core := value.(*lib.Core)
|
|
core.Quit()
|
|
ctx.JSON(200, Resp{
|
|
Code: 200,
|
|
Message: "",
|
|
Data: "",
|
|
Success: true,
|
|
Error: "",
|
|
})
|
|
}
|
|
}
|
|
|
|
func getLog() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
ctx.File(fmt.Sprintf("./logs/%v.log", time.Now().Format("2006-01-02")))
|
|
}
|
|
}
|
|
|
|
func sign() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
response, err := http.Get("https://pc-api.xuexi.cn/open/api/sns/sign") //nolint:bodyclose
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
ctx.Writer.WriteHeader(200)
|
|
data, _ := io.ReadAll(response.Body)
|
|
ctx.Writer.Write(data)
|
|
}
|
|
}
|
|
|
|
func generate() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
remote, _ := url.Parse("https://login.xuexi.cn/user/qrcode/generate")
|
|
proxy := httputil.NewSingleHostReverseProxy(remote)
|
|
proxy.Director = func(req *http.Request) {
|
|
req.Header = ctx.Request.Header
|
|
req.Host = remote.Host
|
|
req.URL.Scheme = remote.Scheme
|
|
req.URL.Host = remote.Host
|
|
req.URL.Path = ctx.Param("proxyPath")
|
|
}
|
|
proxy.ServeHTTP(ctx.Writer, ctx.Request)
|
|
}
|
|
}
|
|
|
|
func checkQrCode() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
remote, _ := url.Parse("https://login.xuexi.cn/login/login_with_qr")
|
|
proxy := httputil.NewSingleHostReverseProxy(remote)
|
|
proxy.Director = func(req *http.Request) {
|
|
req.Header = ctx.Request.Header
|
|
req.Host = remote.Host
|
|
req.URL.Scheme = remote.Scheme
|
|
req.URL.Host = remote.Host
|
|
req.URL.Path = ctx.Param("proxyPath")
|
|
}
|
|
proxy.ServeHTTP(ctx.Writer, ctx.Request)
|
|
}
|
|
}
|