118 lines
2.3 KiB
Go
118 lines
2.3 KiB
Go
package lib
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
|
|
"github.com/guonaihong/gout"
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/tidwall/gjson"
|
|
)
|
|
|
|
func init() {
|
|
_, err := os.Stat(`./config/user.json`)
|
|
if err != nil {
|
|
err := os.WriteFile(user_path, []byte("[]"), 0666)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
}
|
|
|
|
const (
|
|
user_path = "./config/user.json"
|
|
)
|
|
|
|
type User struct {
|
|
Cookies []cookie `json:"cookies"`
|
|
Nick string `json:"nick"`
|
|
Uid string `json:"uid"`
|
|
}
|
|
|
|
func GetUsers() ([]User, error) {
|
|
file, err := os.ReadFile(user_path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var users []User
|
|
err = json.Unmarshal(file, &users)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var newUsers []User
|
|
for i := 0; i < len(users); i++ {
|
|
if CheckUserCookie(users[i]) {
|
|
newUsers = append(newUsers, users[i])
|
|
continue
|
|
}
|
|
log.Infoln("用户" + users[i].Nick + "cookie已失效")
|
|
}
|
|
return users, err
|
|
}
|
|
|
|
func SaveUser(user User) error {
|
|
users, err := GetUsers()
|
|
if err != nil {
|
|
log.Errorln("获取用户信息错误")
|
|
return err
|
|
}
|
|
a := false
|
|
for _, u := range users {
|
|
if u.Uid == user.Uid {
|
|
u.Cookies = user.Cookies
|
|
a = true
|
|
}
|
|
}
|
|
if !a {
|
|
users = append(users, user)
|
|
}
|
|
|
|
data, err := json.Marshal(&users)
|
|
if err != nil {
|
|
log.Errorln("序列化用户失败")
|
|
return err
|
|
}
|
|
err = os.WriteFile(user_path, data, 0666)
|
|
if err != nil {
|
|
log.Errorln("写入用户信息到文件错误")
|
|
|
|
return err
|
|
}
|
|
return err
|
|
}
|
|
|
|
func GetUserInfo(cookies []cookie) (string, string, error) {
|
|
var resp []byte
|
|
err := gout.GET(user_Info_url).
|
|
SetCookies(cookieToJar(cookies)...).
|
|
SetHeader(gout.H{
|
|
"Cache-Control": "no-cache",
|
|
}).BindBody(&resp).Do()
|
|
if err != nil {
|
|
log.Errorln("获取用户信息失败")
|
|
|
|
return "", "", err
|
|
}
|
|
log.Debugln("[user] 用户信息:", gjson.GetBytes(resp, "@this|@pretty").String())
|
|
uid := gjson.GetBytes(resp, "data.uid").String()
|
|
nick := gjson.GetBytes(resp, "data.nick").String()
|
|
|
|
return uid, nick, err
|
|
}
|
|
|
|
func CheckUserCookie(user User) bool {
|
|
var resp []byte
|
|
err := gout.GET(`https://pc-api.xuexi.cn/open/api/score/get?_t=1636607911602`).SetCookies(cookieToJar(user.Cookies)...).BindBody(&resp).Do()
|
|
if err != nil {
|
|
log.Errorln(err.Error())
|
|
|
|
return true
|
|
}
|
|
if gjson.GetBytes(resp, "code").Int() == 401 && gjson.GetBytes(resp, "message").String() == "token check failed" {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|