study_xxqg/model/user.go

324 lines
6.6 KiB
Go
Raw Normal View History

// Package model
// @Description:
package model
import (
2022-04-22 08:59:15 +00:00
"math/rand"
"net/http"
"sync"
"time"
2022-04-22 08:59:15 +00:00
"github.com/imroc/req/v3"
"github.com/playwright-community/playwright-go"
log "github.com/sirupsen/logrus"
2022-07-27 10:17:22 +00:00
"github.com/johlanse/study_xxqg/utils"
)
var (
lock sync.RWMutex
)
2022-04-22 08:59:15 +00:00
func init() {
go check()
}
2022-07-31 12:33:39 +00:00
var (
pushFunc func(id, kind, message string)
2022-07-31 12:33:39 +00:00
)
func SetPush(push func(id, kind, message string)) {
pushFunc = push
2022-07-31 12:33:39 +00:00
}
// User
/**
* @Description:
*/
type User struct {
Nick string `json:"nick"`
UID string `json:"uid"`
Token string `json:"token"`
LoginTime int64 `json:"login_time"`
2022-07-24 07:56:12 +00:00
PushId string `json:"push_id"`
Status int `json:"status"`
}
// Query
/**
* @Description: 查询所有未掉线的用户
* @return []*User
* @return error
*/
func Query() ([]*User, error) {
var users []*User
ping()
lock.Lock()
defer lock.Unlock()
2022-07-31 12:33:39 +00:00
results, err := db.Query("select * from user")
if err != nil {
return nil, err
}
var failusers []*User
for results.Next() {
u := new(User)
err := results.Scan(&u.Nick, &u.UID, &u.Token, &u.LoginTime, &u.PushId, &u.Status)
if err != nil {
_ = results.Close()
return nil, err
}
if u.Status != 0 {
if utils.CheckUserCookie(u.ToCookies()) {
users = append(users, u)
} else {
log.Warningln(u.Nick + "的cookie已失效")
failusers = append(failusers, u)
if pushFunc != nil {
pushFunc(u.PushId, "flush", u.Nick+"的cookie已失效")
}
2022-07-31 12:33:39 +00:00
}
}
}
_ = results.Close()
for _, failuser := range failusers {
changeStatus(failuser.UID, 0)
}
return users, err
}
func changeStatus(uid string, status int) {
ping()
_, err := db.Exec("update user set status = ? where uid = ?", status, uid)
if err != nil {
log.Errorln("改变status失败" + err.Error())
return
}
}
func QueryFailUser() ([]*User, error) {
var users []*User
ping()
lock.Lock()
defer lock.Unlock()
results, err := db.Query("select * from user where status = 0")
if err != nil {
return nil, err
}
for results.Next() {
u := new(User)
err := results.Scan(&u.Nick, &u.UID, &u.Token, &u.LoginTime, &u.PushId, &u.Status)
if err != nil {
_ = results.Close()
return nil, err
}
users = append(users, u)
}
_ = results.Close()
2022-07-31 12:33:39 +00:00
return users, err
}
// QueryByPushID
/**
* @Description: 根据推送平台的key查询用户
2022-07-31 12:33:39 +00:00
* @return []*User
* @return error
*/
func QueryByPushID(pushID string) ([]*User, error) {
lock.Lock()
defer lock.Unlock()
2022-07-31 12:33:39 +00:00
var users []*User
ping()
results, err := db.Query("select * from user where push_id = ?", pushID)
if err != nil {
return users, err
}
var failusers []*User
2022-07-31 12:33:39 +00:00
for results.Next() {
u := new(User)
err := results.Scan(&u.Nick, &u.UID, &u.Token, &u.LoginTime, &u.PushId, &u.Status)
2022-07-31 12:33:39 +00:00
if err != nil {
_ = results.Close()
2022-07-31 12:33:39 +00:00
return users, err
}
if u.Status != 0 {
if utils.CheckUserCookie(u.ToCookies()) {
users = append(users, u)
} else {
log.Warningln(u.Nick + "的cookie已失效")
failusers = append(failusers, u)
}
}
}
_ = results.Close()
for _, failuser := range failusers {
changeStatus(failuser.UID, 0)
}
return users, err
}
// Find
/**
* @Description:
* @param uid
* @return *User
*/
func Find(uid string) *User {
u := new(User)
err := db.QueryRow("select * from user where uid=?;", uid).Scan(&u.Nick, &u.UID, &u.Token, &u.LoginTime, &u.PushId, &u.Status)
if err != nil {
return nil
}
return u
}
// AddUser
/**
* @Description:
* @param user
* @return error
*/
func AddUser(user *User) error {
lock.Lock()
defer lock.Unlock()
ping()
count := UserCount(user.UID)
if count < 1 {
2022-07-24 07:56:12 +00:00
_, err := db.Exec("insert into user (nick, uid, token, login_time,push_id) values (?,?,?,?,?)", user.Nick, user.UID, user.Token, user.LoginTime, user.PushId)
if err != nil {
log.Errorln("数据库插入失败")
log.Errorln(err.Error())
return err
}
return err
}
err := UpdateUser(user)
if err != nil {
return err
}
return nil
}
// UpdateUser
/**
* @Description:
* @param user
* @return error
*/
func UpdateUser(user *User) error {
lock.Lock()
defer lock.Unlock()
ping()
_, err := db.Exec("update user set token=?,login_time=?,push_id=?,status=1 where uid = ?", user.Token, user.LoginTime, user.PushId, user.UID)
if err != nil {
log.Errorln("更新数据失败")
log.Errorln(err.Error())
return err
}
return err
}
// UserCount
/**
* @Description:
* @param uid
* @return int
*/
func UserCount(uid string) int {
ping()
var count int
err := db.QueryRow("select count(*) from user where uid = ?", uid).Scan(&count)
if err != nil {
return 0
}
return count
}
2022-07-29 07:55:42 +00:00
// DeleteUser
/* @Description:
* @param uid
* @return error
*/
func DeleteUser(uid string) error {
ping()
_, err := db.Exec("delete from user where uid = ?;", uid)
if err != nil {
return err
}
return err
}
// ToCookies
/**
* @Description: 获取user的cookie
* @receiver u
* @return []*http.Cookie
*/
func (u *User) ToCookies() []*http.Cookie {
cookie := &http.Cookie{
Name: "token",
Value: u.Token,
Path: "/",
Domain: "xuexi.cn",
Expires: time.Now().Add(time.Hour * 12),
Secure: false,
HttpOnly: false,
SameSite: http.SameSiteStrictMode,
2022-04-20 13:31:46 +00:00
}
return []*http.Cookie{cookie}
}
func TokenToCookies(token string) []*http.Cookie {
cookie := &http.Cookie{
Name: "token",
Value: token,
Path: "/",
Domain: "xuexi.cn",
Expires: time.Now().Add(time.Hour * 12),
Secure: false,
HttpOnly: false,
SameSite: http.SameSiteStrictMode,
}
return []*http.Cookie{cookie}
}
func (u *User) ToBrowserCookies() []playwright.BrowserContextAddCookiesOptionsCookies {
cookie := playwright.BrowserContextAddCookiesOptionsCookies{
Name: playwright.String("token"),
Value: playwright.String(u.Token),
Path: playwright.String("/"),
Domain: playwright.String(".xuexi.cn"),
Expires: playwright.Float(float64(time.Now().Add(time.Hour * 12).Unix())),
Secure: playwright.Bool(false),
HttpOnly: playwright.Bool(false),
SameSite: playwright.SameSiteAttributeStrict,
}
return []playwright.BrowserContextAddCookiesOptionsCookies{cookie}
}
2022-04-22 08:59:15 +00:00
func check() {
defer func() {
err := recover()
if err != nil {
log.Errorf("%v 出现错误,%v", "auth check", err)
}
}()
for {
users, _ := Query()
for _, user := range users {
response, _ := req.R().SetCookies(user.ToCookies()...).Get("https://pc-api.xuexi.cn/open/api/auth/check")
token := ""
for _, cookie := range response.Cookies() {
if cookie.Name == "token" {
token = cookie.Value
}
}
if token != "" {
user.Token = token
_ = UpdateUser(user)
}
}
2022-07-27 08:02:17 +00:00
time.Sleep(time.Hour * time.Duration(rand.Intn(2)))
2022-04-22 08:59:15 +00:00
}
}