2021-11-12 07:46:33 +00:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2022-05-27 13:37:16 +00:00
|
|
|
|
"flag"
|
2021-11-15 13:52:59 +00:00
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
2022-07-30 10:55:00 +00:00
|
|
|
|
"net/http"
|
2021-11-12 07:46:33 +00:00
|
|
|
|
"os"
|
|
|
|
|
"path"
|
2021-11-17 09:39:48 +00:00
|
|
|
|
"strconv"
|
2021-11-12 07:46:33 +00:00
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
rotates "github.com/lestrrat-go/file-rotatelogs"
|
2021-11-17 09:39:48 +00:00
|
|
|
|
"github.com/robfig/cron/v3"
|
2021-11-12 07:46:33 +00:00
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
|
easy "github.com/t-tomalak/logrus-easy-formatter"
|
|
|
|
|
|
2022-08-03 10:04:52 +00:00
|
|
|
|
"github.com/johlanse/study_xxqg/conf"
|
|
|
|
|
// "github.com/johlanse/study_xxqg/gui"
|
|
|
|
|
"github.com/johlanse/study_xxqg/lib"
|
|
|
|
|
"github.com/johlanse/study_xxqg/model"
|
|
|
|
|
"github.com/johlanse/study_xxqg/push"
|
|
|
|
|
"github.com/johlanse/study_xxqg/utils/update"
|
|
|
|
|
"github.com/johlanse/study_xxqg/web"
|
2021-11-12 07:46:33 +00:00
|
|
|
|
)
|
|
|
|
|
|
2022-05-27 13:37:16 +00:00
|
|
|
|
var (
|
|
|
|
|
u bool
|
2022-07-04 03:27:57 +00:00
|
|
|
|
i bool
|
2022-05-27 13:37:16 +00:00
|
|
|
|
)
|
|
|
|
|
|
2022-02-11 10:13:50 +00:00
|
|
|
|
var VERSION = "unknown"
|
|
|
|
|
|
2021-11-12 07:46:33 +00:00
|
|
|
|
func init() {
|
2022-05-27 13:37:16 +00:00
|
|
|
|
flag.BoolVar(&u, "u", false, "update the study_xxqg")
|
2022-07-04 03:27:57 +00:00
|
|
|
|
flag.BoolVar(&i, "init", false, "init the app")
|
2022-05-27 13:37:16 +00:00
|
|
|
|
flag.Parse()
|
|
|
|
|
|
2022-07-27 10:21:49 +00:00
|
|
|
|
config = conf.GetConfig()
|
2021-11-12 07:46:33 +00:00
|
|
|
|
logFormatter := &easy.Formatter{
|
|
|
|
|
TimestampFormat: "2006-01-02 15:04:05",
|
|
|
|
|
LogFormat: "[%time%] [%lvl%]: %msg% \n",
|
|
|
|
|
}
|
2022-07-29 08:02:41 +00:00
|
|
|
|
w, err := rotates.New(path.Join("config", "logs", "%Y-%m-%d.log"), rotates.WithRotationTime(time.Hour*24))
|
2021-11-12 07:46:33 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorf("rotates init err: %v", err)
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
2021-11-15 13:52:59 +00:00
|
|
|
|
log.SetOutput(io.MultiWriter(w, os.Stdout))
|
2021-11-12 07:46:33 +00:00
|
|
|
|
log.SetFormatter(logFormatter)
|
|
|
|
|
level, err := log.ParseLevel(config.LogLevel)
|
2022-05-02 12:30:49 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
log.SetLevel(log.DebugLevel)
|
|
|
|
|
}
|
2021-11-12 07:46:33 +00:00
|
|
|
|
log.SetLevel(level)
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-10 06:33:05 +00:00
|
|
|
|
func init() {
|
|
|
|
|
pid := os.Getpid()
|
|
|
|
|
pi := strconv.Itoa(pid)
|
|
|
|
|
err := os.WriteFile("pid.pid", []byte(pi), 0666)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln("pid写入失败")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-12 07:46:33 +00:00
|
|
|
|
var (
|
2022-07-27 10:21:49 +00:00
|
|
|
|
config conf.Config
|
2021-11-12 07:46:33 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
_, err := os.Stat(`./config/`)
|
|
|
|
|
if err != nil {
|
2022-05-02 12:30:49 +00:00
|
|
|
|
os.Mkdir("./config/", 0666) //nolint:errcheck
|
2021-11-12 07:46:33 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func main() {
|
2022-08-05 10:08:05 +00:00
|
|
|
|
conf.SetVersion(VERSION)
|
2022-08-05 09:39:01 +00:00
|
|
|
|
log.Infoln("当前程序运行版本: " + VERSION)
|
2022-07-04 03:27:57 +00:00
|
|
|
|
if i {
|
|
|
|
|
core := &lib.Core{}
|
|
|
|
|
core.Init()
|
|
|
|
|
core.Quit()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-27 13:37:16 +00:00
|
|
|
|
go update.CheckUpdate(VERSION)
|
|
|
|
|
|
|
|
|
|
if u {
|
|
|
|
|
update.SelfUpdate("", VERSION)
|
|
|
|
|
log.Infoln("请重启应用")
|
|
|
|
|
os.Exit(1)
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-31 12:33:39 +00:00
|
|
|
|
engine := web.RouterInit()
|
|
|
|
|
go func() {
|
|
|
|
|
h := http.NewServeMux()
|
|
|
|
|
if config.Web.Enable {
|
2022-07-30 10:55:00 +00:00
|
|
|
|
h.Handle("/", engine)
|
2022-07-31 12:33:39 +00:00
|
|
|
|
}
|
|
|
|
|
if config.Wechat.Enable {
|
|
|
|
|
h.HandleFunc("/wx", web.HandleWechat)
|
|
|
|
|
}
|
|
|
|
|
if config.Web.Enable || config.Wechat.Enable {
|
2022-07-30 10:55:00 +00:00
|
|
|
|
err := http.ListenAndServe(fmt.Sprintf("%s:%d", config.Web.Host, config.Web.Port), h)
|
2022-04-20 13:31:46 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
2022-07-31 12:33:39 +00:00
|
|
|
|
}
|
|
|
|
|
}()
|
2022-04-20 13:31:46 +00:00
|
|
|
|
|
2022-04-14 13:18:36 +00:00
|
|
|
|
if config.StartWait > 0 {
|
|
|
|
|
log.Infoln(fmt.Sprintf("将等待%d秒后启动程序", config.StartWait))
|
|
|
|
|
time.Sleep(time.Second * time.Duration(config.StartWait))
|
|
|
|
|
}
|
2022-05-02 12:30:49 +00:00
|
|
|
|
|
|
|
|
|
if config.Cron != "" {
|
|
|
|
|
go func() {
|
2021-11-24 14:05:37 +00:00
|
|
|
|
defer func() {
|
2022-05-02 12:30:49 +00:00
|
|
|
|
err := recover()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln("定时任务执行出现问题")
|
|
|
|
|
log.Errorln(err)
|
2021-11-24 14:05:37 +00:00
|
|
|
|
}
|
|
|
|
|
}()
|
2022-05-02 12:30:49 +00:00
|
|
|
|
log.Infoln("已采用定时执行模式")
|
|
|
|
|
c := cron.New()
|
|
|
|
|
_, err := c.AddFunc(config.Cron, func() {
|
|
|
|
|
defer func() {
|
|
|
|
|
i := recover()
|
|
|
|
|
if i != nil {
|
|
|
|
|
log.Errorln(i)
|
|
|
|
|
log.Errorln("执行定时任务出现异常")
|
|
|
|
|
}
|
|
|
|
|
}()
|
2022-05-13 04:38:04 +00:00
|
|
|
|
do("cron")
|
2022-05-02 12:30:49 +00:00
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
c.Start()
|
|
|
|
|
}()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if config.TG.Enable {
|
|
|
|
|
go func() {
|
|
|
|
|
defer func() {
|
|
|
|
|
err := recover()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln("TG模式执行出现问题")
|
|
|
|
|
log.Errorln(err)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
log.Infoln("已采用tg交互模式")
|
|
|
|
|
telegram := lib.Telegram{
|
|
|
|
|
Token: config.TG.Token,
|
|
|
|
|
ChatId: config.TG.ChatID,
|
|
|
|
|
Proxy: config.TG.Proxy,
|
|
|
|
|
}
|
|
|
|
|
telegram.Init()
|
|
|
|
|
}()
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-31 12:33:39 +00:00
|
|
|
|
if !config.TG.Enable && config.Cron == "" && !config.Wechat.Enable {
|
2021-11-27 08:24:24 +00:00
|
|
|
|
log.Infoln("已采用普通学习模式")
|
2022-05-13 04:38:04 +00:00
|
|
|
|
do("normal")
|
2022-05-04 01:52:04 +00:00
|
|
|
|
} else {
|
2022-07-29 07:55:42 +00:00
|
|
|
|
// gui.InitWindow()
|
2022-05-04 01:52:04 +00:00
|
|
|
|
select {}
|
2021-11-17 09:39:48 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-13 04:38:04 +00:00
|
|
|
|
func do(m string) {
|
2022-04-25 10:39:54 +00:00
|
|
|
|
defer func() {
|
|
|
|
|
err := recover()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln("do 方法执行错误")
|
|
|
|
|
log.Errorln(err)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
2021-11-27 08:24:24 +00:00
|
|
|
|
log.Infoln(` 刷课模式,默认为1,
|
2021-11-12 07:46:33 +00:00
|
|
|
|
1:只刷文章何视频
|
|
|
|
|
2:只刷文章和视频和每日答题
|
|
|
|
|
3:刷文章和视频和每日答题每周答题和专项答题`)
|
|
|
|
|
log.Infoln("检测到模式", config.Model)
|
2021-11-27 08:24:24 +00:00
|
|
|
|
|
2021-11-17 09:39:48 +00:00
|
|
|
|
getPush := push.GetPush(config)
|
2022-05-24 13:36:35 +00:00
|
|
|
|
core := &lib.Core{ShowBrowser: config.ShowBrowser, Push: getPush}
|
2021-11-12 07:46:33 +00:00
|
|
|
|
defer core.Quit()
|
|
|
|
|
core.Init()
|
2022-03-17 15:11:43 +00:00
|
|
|
|
var user *model.User
|
|
|
|
|
users, _ := model.Query()
|
2022-05-24 13:36:35 +00:00
|
|
|
|
study := func(core2 *lib.Core, u *model.User) {
|
2022-07-30 10:55:00 +00:00
|
|
|
|
defer func() {
|
|
|
|
|
err := recover()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln("学习过程异常")
|
|
|
|
|
log.Errorln(err)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
core2.LearnArticle(u)
|
|
|
|
|
core2.LearnVideo(u)
|
2022-05-24 13:36:35 +00:00
|
|
|
|
if config.Model == 2 {
|
|
|
|
|
core2.RespondDaily(u, "daily")
|
|
|
|
|
} else if config.Model == 3 {
|
|
|
|
|
core2.RespondDaily(u, "daily")
|
|
|
|
|
core2.RespondDaily(u, "weekly")
|
|
|
|
|
core2.RespondDaily(u, "special")
|
|
|
|
|
}
|
|
|
|
|
score, err := lib.GetUserScore(u.ToCookies())
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln("获取成绩失败")
|
|
|
|
|
log.Debugln(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
message := u.Nick + " 学习完成:今日得分:" + strconv.Itoa(score.TodayScore)
|
2022-07-24 07:56:12 +00:00
|
|
|
|
score, _ = lib.GetUserScore(user.ToCookies())
|
|
|
|
|
content := lib.FormatScore(score)
|
2022-07-30 10:55:00 +00:00
|
|
|
|
err = push.PushMessage(user.Nick+"学习情况", user.Nick+"学习情况"+content, "score", user.PushId)
|
2022-07-24 07:56:12 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln(err.Error())
|
|
|
|
|
err = nil
|
|
|
|
|
}
|
2022-05-24 13:36:35 +00:00
|
|
|
|
core2.Push("markdown", message)
|
|
|
|
|
core2.Push("flush", "")
|
|
|
|
|
}
|
2022-05-13 04:38:04 +00:00
|
|
|
|
|
|
|
|
|
// 用户小于1时自动登录
|
|
|
|
|
if len(users) < 1 {
|
2021-11-17 09:39:48 +00:00
|
|
|
|
log.Infoln("未检测到有效用户信息,将采用登录模式")
|
2022-07-31 12:33:39 +00:00
|
|
|
|
u, err := core.L(config.Retry.Times, "")
|
2022-04-25 10:39:54 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
user = u
|
2022-05-13 04:38:04 +00:00
|
|
|
|
} else {
|
|
|
|
|
// 如果为定时模式则直接循环所以用户依次运行
|
|
|
|
|
if m == "cron" {
|
|
|
|
|
for _, u := range users {
|
2022-05-24 13:36:35 +00:00
|
|
|
|
study(core, u)
|
|
|
|
|
}
|
|
|
|
|
if len(users) < 1 {
|
2022-07-31 12:33:39 +00:00
|
|
|
|
user, err := core.L(config.Retry.Times, "")
|
2022-05-13 04:38:04 +00:00
|
|
|
|
if err != nil {
|
2022-05-24 13:36:35 +00:00
|
|
|
|
core.Push("msg", "登录超时")
|
2022-05-13 04:38:04 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
2022-05-24 13:36:35 +00:00
|
|
|
|
study(core, user)
|
2022-05-13 04:38:04 +00:00
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-17 09:39:48 +00:00
|
|
|
|
for i, user := range users {
|
|
|
|
|
log.Infoln("序号:", i+1, " ===> ", user.Nick)
|
|
|
|
|
}
|
2022-05-13 04:38:04 +00:00
|
|
|
|
log.Infoln("请输入对应序号选择对应账户,输入0添加用户:")
|
2022-05-24 13:36:35 +00:00
|
|
|
|
|
|
|
|
|
inputChan := make(chan int, 1)
|
|
|
|
|
go func(c chan int) {
|
|
|
|
|
var i int
|
|
|
|
|
_, _ = fmt.Scanln(&i)
|
|
|
|
|
c <- i
|
|
|
|
|
}(inputChan)
|
|
|
|
|
|
2021-11-17 09:39:48 +00:00
|
|
|
|
var i int
|
2022-05-24 13:36:35 +00:00
|
|
|
|
select {
|
|
|
|
|
case i = <-inputChan:
|
|
|
|
|
log.Infoln("已获取到输入")
|
|
|
|
|
case <-time.After(time.Minute):
|
|
|
|
|
log.Errorln("获取输入超时,默认选择第一个用户")
|
|
|
|
|
if len(users) < 1 {
|
|
|
|
|
return
|
|
|
|
|
} else {
|
|
|
|
|
i = 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-13 04:38:04 +00:00
|
|
|
|
if i == 0 {
|
2022-07-31 12:33:39 +00:00
|
|
|
|
u, err := core.L(config.Retry.Times, "")
|
2022-05-13 04:38:04 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorln(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
user = u
|
|
|
|
|
} else {
|
|
|
|
|
user = users[i-1]
|
|
|
|
|
log.Infoln("已选择用户: ", users[i-1].Nick)
|
|
|
|
|
}
|
2021-11-12 07:46:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-24 13:36:35 +00:00
|
|
|
|
study(core, user)
|
|
|
|
|
core.Push("flush", "")
|
2021-11-12 07:46:33 +00:00
|
|
|
|
}
|