From c94f6c14840a4ce9c7fd7aab4273c54cabd7f6f4 Mon Sep 17 00:00:00 2001 From: johlanse Date: Thu, 18 Aug 2022 15:47:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=BF=87=E6=9C=9Fcookie=E6=8E=A8=E9=80=81=EF=BC=8C?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E6=8C=81=E9=85=8D=E7=BD=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/user.go | 146 +++++++++++++++++++++++++++++--------------------- push/push.go | 2 +- 2 files changed, 85 insertions(+), 63 deletions(-) diff --git a/model/user.go b/model/user.go index 73b5f8a..641516f 100644 --- a/model/user.go +++ b/model/user.go @@ -3,19 +3,20 @@ package model import ( - "database/sql" - "fmt" "math/rand" "net/http" + "sync" "time" - "github.com/guonaihong/gout" "github.com/imroc/req/v3" "github.com/playwright-community/playwright-go" log "github.com/sirupsen/logrus" - "github.com/tidwall/gjson" - "github.com/johlanse/study_xxqg/conf" + "github.com/johlanse/study_xxqg/utils" +) + +var ( + lock sync.RWMutex ) func init() { @@ -23,11 +24,11 @@ func init() { } var ( - wechatPush func(id, message string) + pushFunc func(id, kind, message string) ) -func SetPush(push func(id, message string)) { - wechatPush = push +func SetPush(push func(id, kind, message string)) { + pushFunc = push } // User @@ -40,80 +41,119 @@ type User struct { Token string `json:"token"` LoginTime int64 `json:"login_time"` PushId string `json:"push_id"` + Status int `json:"status"` } // Query /** - * @Description: + * @Description: 查询所有未掉线的用户 * @return []*User * @return error */ func Query() ([]*User, error) { var users []*User ping() + lock.Lock() + defer lock.Unlock() results, err := db.Query("select * from user") if err != nil { return nil, err } - defer func(results *sql.Rows) { - err := results.Close() - if err != nil { - log.Errorln("关闭results失败" + err.Error()) - } - }(results) + var failusers []*User for results.Next() { u := new(User) - err := results.Scan(&u.Nick, &u.UID, &u.Token, &u.LoginTime, &u.PushId) + err := results.Scan(&u.Nick, &u.UID, &u.Token, &u.LoginTime, &u.PushId, &u.Status) if err != nil { + _ = results.Close() return nil, err } - if CheckUserCookie(u) { - users = append(users, u) - } else { - log.Infoln("用户" + u.Nick + "cookie已失效") - //_ = push.PushMessage("", "用户"+u.UID+"已失效,请登录", "login", u.PushId) - if conf.GetConfig().Wechat.PushLoginWarn { - wechatPush(u.PushId, fmt.Sprintf("用户%v已失效!!", u.Nick)) + 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已失效") + } } - _ = DeleteUser(u.UID) } } + _ = 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() return users, err } // QueryByPushID /** - * @Description: + * @Description: 根据推送平台的key查询用户 * @return []*User * @return error */ func QueryByPushID(pushID string) ([]*User, error) { + lock.Lock() + defer lock.Unlock() var users []*User ping() results, err := db.Query("select * from user where push_id = ?", pushID) if err != nil { return users, err } - defer func(results *sql.Rows) { - err := results.Close() - if err != nil { - log.Errorln("关闭results失败" + err.Error()) - } - }(results) + + var failusers []*User for results.Next() { u := new(User) - err := results.Scan(&u.Nick, &u.UID, &u.Token, &u.LoginTime, &u.PushId) + err := results.Scan(&u.Nick, &u.UID, &u.Token, &u.LoginTime, &u.PushId, &u.Status) if err != nil { + _ = results.Close() return users, err } - if CheckUserCookie(u) { - users = append(users, u) - } else { - log.Infoln("用户" + u.Nick + "cookie已失效") - //_ = push.PushMessage("", "用户"+u.UID+"已失效,请登录", "login", u.PushId) - _ = DeleteUser(u.UID) + 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 } @@ -125,7 +165,7 @@ func QueryByPushID(pushID string) ([]*User, error) { */ 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) + 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 } @@ -139,6 +179,8 @@ func Find(uid string) *User { * @return error */ func AddUser(user *User) error { + lock.Lock() + defer lock.Unlock() ping() count := UserCount(user.UID) if count < 1 { @@ -164,8 +206,10 @@ func AddUser(user *User) error { * @return error */ func UpdateUser(user *User) error { + lock.Lock() + defer lock.Unlock() ping() - _, err := db.Exec("update user set token=?,login_time=?,push_id=? where uid = ?", user.Token, user.LoginTime, user.PushId, user.UID) + _, 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()) @@ -252,28 +296,6 @@ func (u *User) ToBrowserCookies() []playwright.BrowserContextAddCookiesOptionsCo return []playwright.BrowserContextAddCookiesOptionsCookies{cookie} } -// CheckUserCookie -/** - * @Description: 获取用户成绩 - * @param user - * @return bool - */ -func CheckUserCookie(user *User) bool { - var resp []byte - err := gout.GET("https://pc-api.xuexi.cn/open/api/score/get").SetCookies(user.ToCookies()...).SetHeader(gout.H{ - "Cache-Control": "no-cache", - }).BindBody(&resp).Do() - if err != nil { - log.Errorln("获取用户总分错误" + err.Error()) - - return false - } - if !gjson.GetBytes(resp, "ok").Bool() { - return false - } - return true -} - func check() { defer func() { err := recover() diff --git a/push/push.go b/push/push.go index 35cb475..8ea2605 100644 --- a/push/push.go +++ b/push/push.go @@ -42,7 +42,7 @@ func GetPush(config conf.Config) func(id string, kind string, message string) { }) } if config.TG.Enable { - log.Infoln("一配置tg推送") + log.Infoln("已配置tg推送") pushs = append(pushs, tgPush) } if config.JiGuangPush.Enable {