study_xxqg/lib/study.go

305 lines
8.6 KiB
Go
Raw Normal View History

2021-11-12 07:46:33 +00:00
package lib
import (
"encoding/json"
"errors"
"fmt"
"math/rand"
"strconv"
"time"
"github.com/guonaihong/gout"
"github.com/playwright-community/playwright-go"
2021-11-12 07:46:33 +00:00
log "github.com/sirupsen/logrus"
2022-08-03 10:04:52 +00:00
"github.com/johlanse/study_xxqg/model"
2021-11-12 07:46:33 +00:00
)
var (
article_url_list = []string{
"https://www.xuexi.cn/lgdata/35il6fpn0ohq.json",
"https://www.xuexi.cn/lgdata/45a3hac2bf1j.json",
"https://www.xuexi.cn/lgdata/1ajhkle8l72.json",
"https://www.xuexi.cn/lgdata/1ahjpjgb4n3.json",
"https://www.xuexi.cn/lgdata/1je1objnh73.json",
"https://www.xuexi.cn/lgdata/1kvrj9vvv73.json",
"https://www.xuexi.cn/lgdata/17qonfb74n3.json",
"https://www.xuexi.cn/lgdata/1i30sdhg0n3.json"}
video_url_list = []string{
"https://www.xuexi.cn/lgdata/3j2u3cttsii9.json",
"https://www.xuexi.cn/lgdata/1novbsbi47k.json",
"https://www.xuexi.cn/lgdata/31c9ca1tgfqb.json",
"https://www.xuexi.cn/lgdata/1oajo2vt47l.json",
"https://www.xuexi.cn/lgdata/18rkaul9h7l.json",
"https://www.xuexi.cn/lgdata/2qfjjjrprmdh.json",
"https://www.xuexi.cn/lgdata/3o3ufqgl8rsn.json",
"https://www.xuexi.cn/lgdata/525pi8vcj24p.json",
"https://www.xuexi.cn/lgdata/1742g60067k.json"}
)
type Link struct {
Editor string `json:"editor"`
PublishTime string `json:"publishTime"`
ItemType string `json:"itemType"`
Author string `json:"author"`
CrossTime int `json:"crossTime"`
Source string `json:"source"`
NameB string `json:"nameB"`
Title string `json:"title"`
Type string `json:"type"`
Url string `json:"url"`
ShowSource string `json:"showSource"`
ItemId string `json:"itemId"`
ThumbImage string `json:"thumbImage"`
AuditTime string `json:"auditTime"`
ChannelNames []string `json:"channelNames"`
Producer string `json:"producer"`
ChannelIds []string `json:"channelIds"`
DataValid bool `json:"dataValid"`
}
func getLinks(model string) ([]Link, error) {
UID := rand.Intn(20000000) + 10000000
learnUrl := ""
if model == "article" {
learnUrl = article_url_list[rand.Intn(7)]
} else if model == "video" {
learnUrl = video_url_list[rand.Intn(7)]
} else {
return nil, errors.New("model选择出现错误")
}
var (
resp []byte
)
err := gout.GET(learnUrl + "?_st=" + strconv.Itoa(UID)).BindBody(&resp).Do()
if err != nil {
log.Errorln("请求连接列表出现错误" + err.Error())
return nil, err
}
var links []Link
err = json.Unmarshal(resp, &links)
if err != nil {
log.Errorln("解析列表出现错误" + err.Error())
return nil, err
}
return links, err
}
2021-12-22 12:43:23 +00:00
// LearnArticle
/**
* @Description: 文章学习
* @receiver c
* @param cookies
*/
func (c *Core) LearnArticle(user *model.User) {
2021-11-12 07:46:33 +00:00
defer func() {
err := recover()
if err != nil {
log.Errorln("文章学习模块异常结束")
log.Errorln(err)
2021-11-12 07:46:33 +00:00
}
}()
if c.IsQuit() {
return
}
2021-11-12 07:46:33 +00:00
score, err := GetUserScore(user.ToCookies())
2021-11-12 07:46:33 +00:00
if err != nil {
log.Errorln(err.Error())
return
}
links, _ := getLinks("article")
if score.Content["article"].CurrentScore < score.Content["article"].MaxScore {
log.Infoln("开始加载文章学习模块")
context, err := c.browser.NewContext()
_ = context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
Script: playwright.String("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});")})
if err != nil {
log.Errorln("创建实例对象错误" + err.Error())
return
}
defer func(context playwright.BrowserContext) {
err := context.Close()
if err != nil {
log.Errorln("错误的关闭了实例对象" + err.Error())
}
}(context)
page, err := context.NewPage()
2021-11-12 07:46:33 +00:00
if err != nil {
return
}
defer func() {
page.Close()
}()
2021-11-12 07:46:33 +00:00
err = context.AddCookies(user.ToBrowserCookies()...)
2021-11-12 07:46:33 +00:00
if err != nil {
log.Errorln("添加cookie失败" + err.Error())
return
}
2021-12-10 08:05:03 +00:00
2021-11-12 07:46:33 +00:00
tryCount := 0
for {
if tryCount < 20 {
PrintScore(score)
n := rand.Intn(len(links))
_, err := page.Goto(links[n].Url, playwright.PageGotoOptions{
Referer: playwright.String(links[rand.Intn(len(links))].Url),
Timeout: playwright.Float(10000),
WaitUntil: playwright.WaitUntilStateDomcontentloaded,
})
if err != nil {
log.Errorln("页面跳转失败")
}
log.Infoln("正在学习文章:" + links[n].Title)
c.Push("text", "正在学习文章:"+links[n].Title)
2021-11-12 07:46:33 +00:00
log.Infoln("文章发布时间:" + links[n].PublishTime)
log.Infoln("文章学习链接:" + links[n].Url)
2022-02-11 10:13:50 +00:00
learnTime := 60 + rand.Intn(15) + 3
2021-11-12 07:46:33 +00:00
for i := 0; i < learnTime; i++ {
if c.IsQuit() {
return
}
fmt.Printf("\r[%v] [INFO]: 正在进行阅读学习中,剩余%d篇本篇剩余时间%d秒", time.Now().Format("2006-01-02 15:04:05"), score.Content["article"].MaxScore-score.Content["article"].CurrentScore, learnTime-i)
2021-11-12 07:46:33 +00:00
if rand.Float32() > 0.5 {
go func() {
_, err = page.Evaluate(fmt.Sprintf(`let h = document.body.scrollHeight/120*%d;document.documentElement.scrollTop=h;`, i))
if err != nil {
log.Errorln("文章滑动失败")
}
}()
}
time.Sleep(1 * time.Second)
}
fmt.Println()
score, _ = GetUserScore(user.ToCookies())
2021-11-12 07:46:33 +00:00
if score.Content["article"].CurrentScore >= score.Content["article"].MaxScore {
log.Infoln("检测到本次阅读学习分数已满,退出学习")
break
}
2022-02-14 09:57:55 +00:00
2021-11-12 07:46:33 +00:00
tryCount++
} else {
log.Errorln("阅读学习出现异常,稍后可重新学习")
2021-12-22 12:43:23 +00:00
return
2021-11-12 07:46:33 +00:00
}
}
} else {
log.Infoln("检测到文章学习已经完成")
}
}
2021-12-22 12:43:23 +00:00
// LearnVideo
/**
* @Description: 视频学习
* @receiver c
* @param cookies
*/
func (c *Core) LearnVideo(user *model.User) {
2021-11-12 07:46:33 +00:00
defer func() {
err := recover()
if err != nil {
log.Errorln("视频学习模块异常结束")
log.Errorln(err)
2021-11-12 07:46:33 +00:00
}
}()
if c.IsQuit() {
return
}
score, err := GetUserScore(user.ToCookies())
2021-11-12 07:46:33 +00:00
if err != nil {
log.Errorln(err.Error())
return
}
links, _ := getLinks("video")
2021-12-08 09:51:03 +00:00
if !(score.Content["video"].CurrentScore >= score.Content["video"].MaxScore && score.Content["video_time"].CurrentScore >= score.Content["video_time"].MaxScore) {
2021-11-12 07:46:33 +00:00
log.Infoln("开始加载视频学习模块")
// core := Core{}
2022-04-20 13:31:46 +00:00
// core.Init()
2021-11-12 07:46:33 +00:00
context, err := c.browser.NewContext()
_ = context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
Script: playwright.String("Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});")})
2021-11-12 07:46:33 +00:00
if err != nil {
log.Errorln("创建实例对象错误" + err.Error())
2021-11-12 07:46:33 +00:00
return
}
defer func(context playwright.BrowserContext) {
err := context.Close()
if err != nil {
log.Errorln("错误的关闭了实例对象" + err.Error())
}
}(context)
page, err := context.NewPage()
2021-11-12 07:46:33 +00:00
if err != nil {
return
}
defer func() {
page.Close()
}()
err = context.AddCookies(user.ToBrowserCookies()...)
2021-11-12 07:46:33 +00:00
if err != nil {
log.Errorln("添加cookie失败" + err.Error())
return
}
tryCount := 0
for {
if tryCount < 20 {
PrintScore(score)
n := rand.Intn(len(links))
_, err := page.Goto(links[n].Url, playwright.PageGotoOptions{
Referer: playwright.String(links[rand.Intn(len(links))].Url),
Timeout: playwright.Float(10000),
WaitUntil: playwright.WaitUntilStateDomcontentloaded,
})
if err != nil {
log.Errorln("页面跳转失败")
}
log.Infoln("正在观看视频:" + links[n].Title)
c.Push("text", "正在观看视频:"+links[n].Title)
2021-11-12 07:46:33 +00:00
log.Infoln("视频发布时间:" + links[n].PublishTime)
log.Infoln("视频学习链接:" + links[n].Url)
2022-02-11 10:13:50 +00:00
learnTime := 60 + rand.Intn(10) + 5
2021-11-12 07:46:33 +00:00
for i := 0; i < learnTime; i++ {
if c.IsQuit() {
return
}
fmt.Printf("\r[%v] [INFO]: 正在进行视频学习中,剩余%d个当前剩余时间%d秒", time.Now().Format("2006-01-02 15:04:05"), score.Content["video"].MaxScore-score.Content["video"].CurrentScore, learnTime-i)
2021-11-12 07:46:33 +00:00
if rand.Float32() > 0.5 {
go func() {
_, err := page.Evaluate(fmt.Sprintf(`let h = document.body.scrollHeight/120*%d;document.documentElement.scrollTop=h;`, i))
if err != nil {
log.Errorln("视频滑动失败")
}
}()
}
time.Sleep(1 * time.Second)
}
fmt.Println()
score, _ = GetUserScore(user.ToCookies())
2021-12-08 09:51:03 +00:00
if score.Content["video"].CurrentScore >= score.Content["video"].MaxScore && score.Content["video_time"].CurrentScore >= score.Content["video_time"].MaxScore {
2021-11-12 07:46:33 +00:00
log.Infoln("检测到本次视频学习分数已满,退出学习")
break
}
2022-02-14 09:57:55 +00:00
2021-11-12 07:46:33 +00:00
tryCount++
} else {
log.Errorln("视频学习出现异常,稍后可重新学习")
2021-12-22 12:43:23 +00:00
return
2021-11-12 07:46:33 +00:00
}
}
} else {
log.Infoln("检测到视频学习已经完成")
}
}