202 lines
6.7 KiB
Go
202 lines
6.7 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"go-sccchina/libs"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/go-rod/rod"
|
|
"github.com/go-rod/rod/lib/proto"
|
|
)
|
|
|
|
var login = flag.Bool("login", false, "是否登录")
|
|
var test = flag.Bool("time", false, "测试")
|
|
var Browser libs.Browser
|
|
|
|
// var Chrome libs.Chrome
|
|
func main() {
|
|
flag.Parse()
|
|
log.Println(*login)
|
|
if *login {
|
|
loginFun()
|
|
}
|
|
if *test {
|
|
obj := Browser.GetBrowser(1, &libs.Fingerprint{})
|
|
browser := obj.Browser
|
|
page := obj.Page
|
|
cookies, _ := loadCookiesFromFile("account_cookie.json")
|
|
browser.SetCookies(cookies)
|
|
page.MustNavigate("https://cart.taobao.com/cart.htm?spm=tbpc.mytb_index.leftnav.1.6db2782d0TVVip").MustWaitLoad()
|
|
page.MustWaitNavigation()
|
|
page.MustWaitLoad() // DOM 加载完成
|
|
page.MustWaitIdle() // 基本静止(减少早期误判)
|
|
page.MustActivate() // 前置以便扫码
|
|
// // 获取当前课程列表
|
|
// res := getApiResponse(page, "https://hnit.sccchina.net/student/student/coursestudy/getlist")
|
|
// var dataBody map[string]any
|
|
// json.Unmarshal([]byte(res), &dataBody)
|
|
// list := dataBody["items"].([]interface{})
|
|
// // pretty, _ := json.MarshalIndent(list, "", " ")
|
|
// // 判断当前有多少个课程需要学习
|
|
// for _, v := range list {
|
|
// m := v.(map[string]interface{})
|
|
// realCoursewarePlayNum := m["realCoursewarePlayNum"].(string)
|
|
// realCoursewarePlayTime := m["realCoursewarePlayTime"].(string)
|
|
// var showScore string = "0"
|
|
// if m["showScore"] != nil {
|
|
// if str, ok := m["showScore"].(string); ok {
|
|
// showScore = str
|
|
// }
|
|
// }
|
|
// courseVersionID := m["courseVersionID"].(string)
|
|
// teachplanCourseVersionId := m["teachplanCourseVersionId"].(string)
|
|
// sign := m["sign"].(string)
|
|
// userAccountId := m["userAccountId"].(string)
|
|
// versionName := m["versionName"].(string)
|
|
// // 分割字符串 判断当前 课时 成绩
|
|
// playTimeArr := strings.Split(realCoursewarePlayTime, " / ")
|
|
// // 将第一个转为数字
|
|
// activeTime, _ := strconv.ParseFloat(strings.TrimSpace(playTimeArr[0]), 64)
|
|
// var endTime float64
|
|
// if strings.TrimSpace(playTimeArr[1]) == "--" {
|
|
// endTime = 360
|
|
// } else {
|
|
// TimeEnd, _ := strconv.ParseFloat(strings.TrimSpace(playTimeArr[1]), 64)
|
|
// endTime = TimeEnd
|
|
// }
|
|
// // 判断有哪些课程需要观看
|
|
// // var pages []*rod.Page
|
|
// if showScore == "0" && activeTime < endTime {
|
|
// log.Println(activeTime)
|
|
// log.Println(endTime)
|
|
// log.Println(realCoursewarePlayNum, realCoursewarePlayTime, showScore, courseVersionID, teachplanCourseVersionId, sign, userAccountId, versionName)
|
|
// url := fmt.Sprintf(`https://hnit.sccchina.net/student/videolearning.html#Subpage/StudentVersionVideo?courseVersionId=%s&teachplanCourseVersionId=%s&sign=%s&userAccountId=%s&syncPracticePiwik=1&piwikSiteId=750&versionName=%s`, courseVersionID, teachplanCourseVersionId, sign, userAccountId, versionName)
|
|
// log.Println(url)
|
|
// time.Sleep(3 * time.Second)
|
|
// p := browser.MustPage(url)
|
|
// satrt := p.Timeout(5 * time.Second).MustElement(`#button-courseware`)
|
|
// satrt.MustClick()
|
|
// time.Sleep(2 * time.Second)
|
|
// log.Println(1)
|
|
// iframeEl := p.Timeout(10*time.Second).MustElementR(`iframe`, ".*")
|
|
// log.Println(2)
|
|
// log.Println(iframeEl)
|
|
// if iframeEl != nil {
|
|
// iframePage := iframeEl.MustFrame()
|
|
// iframePage.MustWaitLoad()
|
|
// // 再次进入内嵌的iframe
|
|
// iframeEl2 := iframePage.Timeout(10 * time.Second).MustElement(`iframe#iframe`)
|
|
// iframePage2 := iframeEl2.MustFrame()
|
|
// iframePage2.MustWaitLoad()
|
|
// cl := iframePage2.Timeout(5 * time.Second).MustElement(`em.pop_close`)
|
|
// cl.MustClick()
|
|
// }
|
|
// time.Sleep(3 * time.Second)
|
|
// // pages = append(pages, p)
|
|
|
|
// // go func() {
|
|
// // browser.MustPage(url)
|
|
// // }()
|
|
// }
|
|
// }
|
|
// log.Println(string(pretty))
|
|
select {}
|
|
}
|
|
|
|
}
|
|
|
|
func loginFun() {
|
|
obj := Browser.GetBrowser(1, &libs.Fingerprint{})
|
|
browser := obj.Browser
|
|
page := obj.Page
|
|
page.MustNavigate(`https://login.taobao.com/havanaone/login/login.htm`).MustWaitLoad()
|
|
page.MustWaitNavigation()
|
|
page.MustWaitLoad() // DOM 加载完成
|
|
page.MustWaitIdle() // 基本静止(减少早期误判)
|
|
page.MustActivate() // 前置以便扫码
|
|
|
|
var usl string = "https://login.taobao.com/havanaone/login/login.htm"
|
|
for usl == "https://login.taobao.com/havanaone/login/login.htm" {
|
|
uri := page.MustEval("() => window.location.href").String()
|
|
log.Println("获取当前网页URL:", uri)
|
|
usl = uri
|
|
time.Sleep(5 * time.Second)
|
|
}
|
|
page.MustNavigate("https://cart.taobao.com/cart.htm?spm=tbpc.mytb_index.leftnav.1.6db2782d0TVVip").MustWaitLoad()
|
|
page.MustWaitNavigation()
|
|
page.MustWaitLoad() // DOM 加载完成
|
|
page.MustWaitIdle() // 基本静止(减少早期误判)
|
|
page.MustActivate() // 前置以便扫码
|
|
cookieArr := getPageCookie(page, "https://cart.taobao.com/cart.htm?spm=tbpc.mytb_index.leftnav.1.6db2782d0TVVip")
|
|
saveCookiesToFile(cookieArr, "account_cookie.json")
|
|
browser.Close()
|
|
}
|
|
|
|
func getPageCookie(page *rod.Page, url string) []*proto.NetworkCookieParam {
|
|
cookieArr, _ := page.Cookies([]string{url})
|
|
var cookies []*proto.NetworkCookieParam
|
|
for _, cookie := range cookieArr {
|
|
cookies = append(cookies, &proto.NetworkCookieParam{
|
|
Name: cookie.Name,
|
|
Value: cookie.Value,
|
|
Domain: cookie.Domain,
|
|
Path: cookie.Path,
|
|
Expires: cookie.Expires, // 过期时间
|
|
HTTPOnly: cookie.HTTPOnly, // 禁止 JS 访问
|
|
Secure: cookie.Secure, // 仅 HTTPS 传输
|
|
})
|
|
}
|
|
return cookies
|
|
}
|
|
|
|
func saveCookiesToFile(cookies []*proto.NetworkCookieParam, filename string) error {
|
|
data, err := json.MarshalIndent(cookies, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return os.WriteFile(filename, data, 0644)
|
|
}
|
|
|
|
func loadCookiesFromFile(filename string) ([]*proto.NetworkCookieParam, error) {
|
|
data, err := os.ReadFile(filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var cookies []*proto.NetworkCookieParam
|
|
if err := json.Unmarshal(data, &cookies); err != nil {
|
|
return nil, err
|
|
}
|
|
return cookies, nil
|
|
}
|
|
|
|
// 获取指定接口的响应参数
|
|
func getApiResponse(page *rod.Page, url string) string {
|
|
// 定义一个通道接收消息
|
|
ch := make(chan string)
|
|
go page.EachEvent(func(e *proto.PageLoadEventFired) {
|
|
log.Println("1234567890")
|
|
}, func(e *proto.NetworkResponseReceived) {
|
|
if strings.Contains(e.Response.URL, url) {
|
|
reply, err := (proto.NetworkGetResponseBody{RequestID: e.RequestID}).Call(page)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
ch <- reply.Body
|
|
// fmt.Println(reply.Body)
|
|
}
|
|
})()
|
|
|
|
select {
|
|
case res := <-ch:
|
|
return res
|
|
case <-time.After(30 * time.Second):
|
|
log.Println("等待上传响应超时")
|
|
return ""
|
|
}
|
|
}
|