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 "" } }