This commit is contained in:
zyj
2026-02-09 02:08:53 +08:00
commit fcdc5b8f2d
7 changed files with 774 additions and 0 deletions

201
cmd/main.go Normal file
View File

@@ -0,0 +1,201 @@
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 ""
}
}