diff --git a/conf/config.go b/conf/config.go index cc2d9e8..7b1cec5 100644 --- a/conf/config.go +++ b/conf/config.go @@ -67,6 +67,7 @@ type Config struct { LoginTempID string `json:"login_temp_id" yaml:"login_temp_id"` NormalTempID string `json:"normal_temp_id" yaml:"normal_temp_id"` PushLoginWarn bool `json:"push_login_warn" yaml:"push_login_warn"` + SuperOpenID string `json:"super_open_id" yaml:"super_open_id"` } `json:"wechat" yaml:"wechat"` // 专项答题可接受的最小值 SpecialMinScore int `json:"special_min_score" yaml:"special_min_score"` @@ -79,6 +80,9 @@ type Config struct { AppKey string `json:"app_key" yaml:"app_key"` } `json:"ji_guang_push" yaml:"ji_guang_push"` + SuperUser string `json:"super_user" yaml:"super_user"` + SuperPassword string `json:"super_password" yaml:"super_password"` + version string } diff --git a/conf/config_default.yml b/conf/config_default.yml index a3d2472..c6136f0 100644 --- a/conf/config_default.yml +++ b/conf/config_default.yml @@ -74,6 +74,8 @@ wechat: normal_temp_id: "" # xxqg会每隔两小时左右检查所有用户的ck有效性,若开启该选项,会在检查失败时推送提醒消息 push_login_warn: false + # 微信管理员的openid,可点击关于按钮获得,配置后请重启程序 + super_open_id: "" # 登录重试配置 retry: diff --git a/go.mod b/go.mod index 9feda1f..4d007ff 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( ) require ( + github.com/Luoxin/go-pushdeer-sdk v0.0.0-20220308071956-e50d1ec38c98 // indirect github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.13.0 // indirect diff --git a/go.sum b/go.sum index 325e678..957c625 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII= github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk= +github.com/Luoxin/go-pushdeer-sdk v0.0.0-20220308071956-e50d1ec38c98 h1:88VEoycHG8Fecaf8h/Tq5FSP5Jjl1+yodHiPAJawDe0= +github.com/Luoxin/go-pushdeer-sdk v0.0.0-20220308071956-e50d1ec38c98/go.mod h1:ZO6lLdHMY7Hj7VDqvy+k+s5AQdkxK0KV08GU9CUuqR0= github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= @@ -22,6 +24,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.5.0 h1:X9rflw/KmpACwT8zdrm1upefpvdy6ur8d1kWyq6sg3E= github.com/go-playground/validator/v10 v10.5.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= +github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.4.0-beta.0 h1:mbEDV1g6RBzKd4sFjOWuyZdxItw4CWu5Kq4KaBAJbHM= @@ -109,6 +112,7 @@ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qq github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E= github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= @@ -150,6 +154,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220111093109-d55c255bac03 h1:0FB83qp0AzVJm+0wcIlauAjJ+tNdh7jLuacRYCIVv7s= golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -158,6 +163,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/lib/core.go b/lib/core.go index 483ed96..6cdb696 100644 --- a/lib/core.go +++ b/lib/core.go @@ -1,6 +1,7 @@ package lib import ( + "encoding/base64" "errors" "fmt" "image" @@ -149,6 +150,10 @@ func (c *Core) GenerateCode(pushID string) (string, string, error) { } else { log.Infoln("二维码已生成到目录下的qrcode.png") } + if conf.GetConfig().QrCOde { + data, _ := os.ReadFile("qrcode.png") + c.Push(pushID, "image", base64.StdEncoding.EncodeToString(data)) + } qrCodeString := qrcodeTerminal.New2(qrcodeTerminal.ConsoleColors.BrightBlack, qrcodeTerminal.ConsoleColors.BrightWhite, qrcodeTerminal.QRCodeRecoveryLevels.Low).Get(codeURL) qrCodeString.Print() diff --git a/lib/respond.go b/lib/respond.go index 18ff209..7b49686 100644 --- a/lib/respond.go +++ b/lib/respond.go @@ -352,9 +352,7 @@ func (c *Core) RespondDaily(user *model.User, model string) { // 填空题 switch { case strings.Contains(categoryText, "填空题"): - if len(tips) < 1 { - tips = append(tips, "不知道") - } + // 填充填空题 err := FillBlank(page, tips) if err != nil { @@ -576,10 +574,9 @@ func getTips(data string) []string { func FillBlank(page playwright.Page, tips []string) error { video := false var answer []string - for _, tip := range tips { - if tip == "请观看视频" { - video = true - } + if len(tips) < 1 { + log.Warningln("检测到未获取到提示信息") + video = true } if video { answer = append(answer, "不知道") @@ -591,7 +588,7 @@ func FillBlank(page playwright.Page, tips []string) error { log.Errorln("获取输入框错误" + err.Error()) return err } - log.Debugln("获取到", len(inouts), "个填空") + log.Infoln("获取到", len(inouts), "个填空") if len(inouts) == 1 && len(tips) > 1 { temp := "" for _, tip := range tips { @@ -600,16 +597,22 @@ func FillBlank(page playwright.Page, tips []string) error { answer = strings.Split(temp, ",") log.Infoln("答案已合并处理") } + var ans string for i := 0; i < len(inouts); i++ { - err := inouts[i].Fill(answer[i]) + if video { + ans = "不知道" + } else { + ans = answer[i] + } + err := inouts[i].Fill(ans) if err != nil { log.Errorln("填充答案失败" + err.Error()) continue } - r := rand2.Intn(5) + r := rand2.Intn(4) + 1 time.Sleep(time.Duration(r) * time.Second) } - r := rand2.Intn(2) + r := rand2.Intn(1) + 1 time.Sleep(time.Duration(r) * time.Second) checkNextBotton(page) return nil diff --git a/lib/study.go b/lib/study.go index 8edf8f8..0f17e95 100644 --- a/lib/study.go +++ b/lib/study.go @@ -272,7 +272,7 @@ func (c *Core) LearnVideo(user *model.User) { c.Push(user.PushId, "text", "正在观看视频:"+links[n].Title) log.Infoln("视频发布时间:" + links[n].PublishTime) log.Infoln("视频学习链接:" + links[n].Url) - learnTime := 60 + rand.Intn(10) + 5 + learnTime := 60 + rand.Intn(10) for i := 0; i < learnTime; i++ { if c.IsQuit() { return diff --git a/main.go b/main.go index fd131b7..5b87896 100644 --- a/main.go +++ b/main.go @@ -168,6 +168,7 @@ func main() { } getPush := push.GetPush(config) getPush("", "flush", "学习强国助手已上线") + model.SetPush(getPush) if !config.TG.Enable && config.Cron == "" && !config.Wechat.Enable { log.Infoln("已采用普通学习模式") do("normal") @@ -194,6 +195,10 @@ func do(m string) { getPush := push.GetPush(config) getPush("", "flush", "学习强国助手已上线") + failUser, _ := model.QueryFailUser() + for _, user := range failUser { + getPush(user.PushId, "flush", user.Nick+"的cookie已过期") + } core := &lib.Core{ShowBrowser: config.ShowBrowser, Push: getPush} defer core.Quit() core.Init() diff --git a/model/model.go b/model/model.go index 03c6967..230cda5 100644 --- a/model/model.go +++ b/model/model.go @@ -30,6 +30,9 @@ func init() { login_time integer not null, push_id TEXT ); +`) + _, _ = db.Exec(`alter table user + add status integer default 1; `) } diff --git a/model/user.go b/model/user.go index bd7ae5d..f0a746c 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 da45107..35cb475 100644 --- a/push/push.go +++ b/push/push.go @@ -45,6 +45,11 @@ func GetPush(config conf.Config) func(id string, kind string, message string) { log.Infoln("一配置tg推送") pushs = append(pushs, tgPush) } + if config.JiGuangPush.Enable { + pushs = append(pushs, func(id, kind, message string) { + _ = PushMessage("", message, message, id) + }) + } pushs = append(pushs, func(id, kind, message string) { log.Debugln(fmt.Sprintf("消息id: %v,消息类型:%v,消息内容:%v", id, kind, message)) }) diff --git a/push/tg.go b/push/tg.go index e36bc18..44076f4 100644 --- a/push/tg.go +++ b/push/tg.go @@ -51,6 +51,9 @@ func TgInit() { } if kind == "flush" { telegram.SendMsg(chatId, strings.ReplaceAll(message, "
", "\n")) + } else if kind == "image" { + bytes, _ := base64.StdEncoding.DecodeString(message) + telegram.SendPhoto(chatId, bytes) } else { if log.GetLevel() == log.DebugLevel { telegram.SendMsg(chatId, message) diff --git a/push/wx.go b/push/wx.go index c5e2cbe..d32ce06 100644 --- a/push/wx.go +++ b/push/wx.go @@ -35,6 +35,7 @@ const ( checkUpdate = "check_update" updateBtn = "updateBtn" restart = "restart" + getOpenID = "get_open_id" ) type WechatHandler func(id string) @@ -58,6 +59,10 @@ func initWechat() { return } + if config.Wechat.SuperOpenID == "" { + log.Warningln("你还未配置super_open_id选项") + } + // 注册插件 RegisterHandler(loginBtn, handleLogin) RegisterHandler(StartStudy, handleStartStudy) @@ -66,6 +71,7 @@ func initWechat() { RegisterHandler(checkUpdate, handleCheckUpdate) RegisterHandler(updateBtn, handleUpdate) RegisterHandler(restart, handleRestart) + RegisterHandler(getOpenID, handleGetOpenID) wx = mp.New(config.Wechat.Token, config.Wechat.AppID, config.Wechat.Secret, "123", "123") err := wx.CreateMenu(&mp.Menu{Buttons: []mp.MenuButton{ @@ -120,6 +126,11 @@ func initWechat() { Type: "click", Key: updateBtn, }, + { + Name: "获取open_id", + Type: "click", + Key: getOpenID, + }, }, }, }}) @@ -127,9 +138,6 @@ func initWechat() { log.Errorln("设置自定义菜单出现异常" + err.Error()) return } - if conf.GetConfig().Wechat.PushLoginWarn { - model.SetPush(sendMsg) - } wx.HandleFunc("eventCLICK", func(wx *mp.WeiXin, w http.ResponseWriter, r *request.WeiXinRequest, timestamp, nonce string) { if lastNonce == nonce { return @@ -153,22 +161,55 @@ func initWechat() { }) } +func handleGetOpenID(id string) { + sendMsg(id, "你的open_id为"+id) +} + +// +// handleCheckUpdate +// @Description: 检查更新 +// @param id +// func handleCheckUpdate(id string) { about := utils.GetAbout() sendMsg(id, about) } +// +// handleUpdate +// @Description: 开始更新 +// @param id +// func handleUpdate(id string) { + if conf.GetConfig().Wechat.SuperOpenID != id { + sendMsg(id, "请联系管理员处理!") + return + } update.SelfUpdate("", conf.GetVersion()) sendMsg(id, "检查更新已完成,即将重启程序") utils.Restart() } +// +// handleRestart +// @Description: 重启程序 +// @param id +// func handleRestart(id string) { + if conf.GetConfig().Wechat.SuperOpenID != id { + sendMsg(id, "请联系管理员处理!") + return + } sendMsg(id, "即将重启程序") utils.Restart() } +// +// sendMsg +// @Description: 发送消息 +// @param id +// @param message +// func sendMsg(id, message string) { m := map[string]interface{}{ "data": map[string]string{ @@ -192,7 +233,7 @@ func sendMsg(id, message string) { } // HandleWechat -/* @Description: +/* @Description:处理wechat的请求接口 * @param rep * @param req */ @@ -203,6 +244,11 @@ func HandleWechat(rep http.ResponseWriter, req *http.Request) { wx.ServeHTTP(rep, req) } +// +// handleLogin +// @Description: 用户登录 +// @param id +// func handleLogin(id string) { core := &lib.Core{Push: func(id1 string, kind, message string) { if kind == "flush" && strings.HasPrefix(message, "登录链接") { @@ -227,6 +273,11 @@ func handleLogin(id string) { sendMsg(id, "登录成功") } +// +// handleStartStudy +// @Description: 开始学习 +// @param id +// func handleStartStudy(id string) { users, err := model.QueryByPushID(id) if err != nil { @@ -272,11 +323,19 @@ func handleGetUser(id string) { return } message := "" + config := conf.GetConfig() for _, user := range users { - message += fmt.Sprintf("%v ==> %v", user.Nick, time.Unix(user.LoginTime, 0).Format("2006-01-02 15:04:05")) - if user.PushId == id { - message += "(已绑定)\n" + if config.Wechat.SuperOpenID == id { + message += fmt.Sprintf("%v ==> %v", user.Nick, time.Unix(user.LoginTime, 0).Format("2006-01-02")) + if user.PushId == id { + message += "(已绑定)\r\n" + } + } else { + if user.PushId == id { + message += fmt.Sprintf("%v ==> %v", user.Nick, time.Unix(user.LoginTime, 0).Format("2006-01-02")) + } } + } sendMsg(id, message) } @@ -291,8 +350,16 @@ func handleScore(id string) { sendMsg(id, "你还没有已登陆的用户,请点击下方登录按钮登录!") return } + config := conf.GetConfig() for _, user := range users { score, _ := lib.GetUserScore(user.ToCookies()) - sendMsg(id, "用户:"+user.Nick+"\n"+lib.FormatScore(score)) + if config.Wechat.SuperOpenID == id { + sendMsg(id, "用户:"+user.Nick+"\n"+lib.FormatScore(score)) + } else { + if user.PushId == id { + sendMsg(id, "用户:"+user.Nick+"\n"+lib.FormatScore(score)) + } + } + } } diff --git a/utils/client.go b/utils/client.go index 2636d5e..2293126 100644 --- a/utils/client.go +++ b/utils/client.go @@ -14,7 +14,7 @@ func init() { client.SetProxy(http.ProxyFromEnvironment) if log.GetLevel() == log.DebugLevel { client.DebugLog = true - client = client.DevMode().EnableDumpAll().EnableDebugLog() + client = client.DevMode() } client.SetLogger(&myLog{}) client.SetCommonHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36") diff --git a/utils/util.go b/utils/util.go index 3651772..9d5257b 100644 --- a/utils/util.go +++ b/utils/util.go @@ -1,9 +1,14 @@ package utils import ( + "net/http" "os" "os/exec" + "github.com/imroc/req/v3" + "github.com/sirupsen/logrus" + "github.com/tidwall/gjson" + "github.com/johlanse/study_xxqg/conf" "github.com/johlanse/study_xxqg/utils/update" ) @@ -28,3 +33,22 @@ func GetAbout() string { msg += "\n" + update.CheckUpdate(conf.GetVersion()) return msg } + +// CheckUserCookie +/** + * @Description: 获取用户成绩 + * @param user + * @return bool + */ +func CheckUserCookie(cookies []*http.Cookie) bool { + client := req.C().DevMode() + response, err := client.R().SetCookies(cookies...).Get("https://pc-api.xuexi.cn/open/api/score/get") + if err != nil { + logrus.Errorln("获取用户总分错误" + err.Error()) + return false + } + if !gjson.GetBytes(response.Bytes(), "ok").Bool() { + return false + } + return true +}