chromedp -—— 基于 go 的自動化操作瀏覽器庫

chromedp

chromedp 是一個用于 Chrome 瀏覽器的自動化測試工具,基于 Go 語言開發,專門用于控制和操作 Chrome 瀏覽器實例。

chromedp 安裝

go get -u github.com/chromedp/chromedp

基于chromedp 實現的的簡易學習通刷課系統

目前實現的功能:

  1. 自動登錄,找到課程中第一個沒刷的課
  2. 視頻播放意外暫停時,自動恢復播放
package mainimport ("context""fmt""log""time""github.com/chromedp/chromedp"
)func main() {// 1. 創建有界面的瀏覽器選項opts := append(chromedp.DefaultExecAllocatorOptions[:],chromedp.Flag("headless", false),chromedp.Flag("start-maximized", true),chromedp.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"),)// 2. 創建上下文allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)defer cancel()ctx, cancel := chromedp.NewContext(allocCtx, chromedp.WithLogf(log.Printf))defer cancel()// 3. 運行主流程err := chromedp.Run(ctx,// 登錄流程chromedp.Navigate("課程url"), // 替換為要刷的課的urlchromedp.WaitVisible(`#phone`, chromedp.ByID), chromedp.SendKeys(`#phone`, "賬號", chromedp.ByID), // 替換為自己的賬號chromedp.SendKeys(`#pwd`, "密碼", chromedp.ByID),	// 替換為自己的密碼chromedp.Click(`#loginBtn`, chromedp.ByID),chromedp.Sleep(3*time.Second),// 開始學習流程startLearningProcess(),)if err != nil {log.Fatal("運行失敗: ", err)}
}func startLearningProcess() chromedp.Action {return chromedp.ActionFunc(func(ctx context.Context) error {// 1. 點擊第一個待完成任務if err := chromedp.Run(ctx,chromedp.WaitVisible(`.catalog_points_yi`, chromedp.ByQuery),chromedp.Click(`.posCatalog_select:has(.catalog_points_yi) .posCatalog_name`, chromedp.NodeVisible),chromedp.Sleep(2*time.Second),); err != nil {return fmt.Errorf("點擊任務失敗: %w", err)}// 2. 處理視頻播放if err := handleVideoPlayback(ctx); err != nil {return fmt.Errorf("視頻處理失敗: %w", err)}// todo 視頻結束后自動刷題return nil})
}func handleVideoPlayback(ctx context.Context) error {// 嘗試點擊播放按鈕if err := chromedp.Run(ctx,chromedp.Click(`//button[@class="vjs-big-play-button"]`, chromedp.NodeVisible),chromedp.Sleep(3*time.Second),); err != nil {log.Println("未能點擊播放按鈕,可能已自動播放:", err)}// 監控視頻狀態for {var videoState struct {CurrentTime float64 `js:"currentTime"`Duration    float64 `js:"duration"`Ended       bool    `js:"ended"`Paused      bool    `js:"paused"`}var result []interface{}err := chromedp.Evaluate(`var video = document.getElementById('iframe').contentWindow.document.querySelector(".ans-attach-online").contentWindow.document.getElementById('video_html5_api');[video.currentTime,video.duration,video.ended,video.paused]
`, &result).Do(ctx)videoState.CurrentTime = result[0].(float64)videoState.Duration = result[1].(float64)videoState.Ended = result[2].(bool)videoState.Paused = result[3].(bool)if err != nil {return fmt.Errorf("獲取視頻狀態失敗: %w", err)}if videoState.Duration == 0 {log.Println("等待視頻加載...")time.Sleep(3 * time.Second)continue}log.Printf("視頻進度: %.1f/%.1f秒, 已暫停: %v, 已結束: %v",videoState.CurrentTime, videoState.Duration, videoState.Paused, videoState.Ended)if videoState.Ended {log.Println("視頻播放結束")return nil}if videoState.Paused {log.Println("檢測到視頻暫停,嘗試恢復播放...")if err := chromedp.Run(ctx,chromedp.Evaluate(`document.getElementById('iframe').contentWindow.document.querySelector(".ans-attach-online").contentWindow.document.getElementById('video_html5_api').play()`, nil),); err != nil {log.Println("恢復播放失敗:", err)}}time.Sleep(10 * time.Second) // 每10秒檢查一次}
}

課程url為該頁面的url:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84503.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84503.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高級特性實戰:死信隊列、延遲隊列與優先級隊列(三)

四、優先級隊列:優先處理重要任務 4.1 優先級隊列概念解析 優先級隊列(Priority Queue)是一種特殊的隊列數據結構,它與普通隊列的主要區別在于,普通隊列遵循先進先出(FIFO)的原則,…

python打卡day34

GPU訓練及類的call方法 知識點回歸: CPU性能的查看:看架構代際、核心數、線程數GPU性能的查看:看顯存、看級別、看架構代際GPU訓練的方法:數據和模型移動到GPU device上類的call方法:為什么定義前向傳播時可以直接寫作…

Newtonsoft Json序列化數據不序列化默認數據

問題描述 數據在序列號為json時,一些默認值也序列化了,像旋轉rot都是0、縮放scal都是1,這樣的默認值完全可以去掉,減少和服務器通信數據量 核心代碼 數據結構字段增加[DefaultValue(1.0)]屬性,縮放的默認值為1 public class Vec3DataOne{[DefaultValue(1.0)] public flo…

可增添功能的鼠標右鍵優化工具

軟件介紹 本文介紹一款能優化Windows電腦的軟件,它可以讓鼠標右鍵菜單添加多種功能。 軟件基本信息 這款名為Easy Context Menu的鼠標右鍵菜單工具非常小巧,軟件大小僅1.14MB,打開即可直接使用,無需進行安裝。 添加功能列舉 它…

Gemini 2.5 Pro 一次測試

您好,您遇到的重定向循環問題,即在 /user/messaging、/user/login?return_to/user/messaging 和 /user/login 之間反復跳轉,通常是由于客戶端的身份驗證狀態檢查和頁面重定向邏輯存在沖突或競爭條件。 在分析了您提供的代碼(特別…

vue3前端后端地址可配置方案

在開發vue3項目過程中,需要切換不同的服務器部署,代碼中配置的服務需要可靈活配置,不隨著run npm build把網址打包到代碼資源中,不然每次切換都需要重新run npm build。需要一個配置文件可以修改服務地址,而打包的代碼…

大模型微調與高效訓練

隨著預訓練大模型(如BERT、GPT、ViT、LLaMA、CLIP等)的崛起,人工智能進入了一個新的范式:預訓練-微調(Pre-train, Fine-tune)。這些大模型在海量數據上學習到了通用的、強大的表示能力和世界知識。然而,要將這些通用模型應用于特定的下游任務或領域,通常還需要進行微調…

編程技能:字符串函數10,strchr

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄,故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 (一)WIn32 專欄導航 上一篇:編程技能:字符串函數09,strncmp 回到目錄…

動態規劃-53.最大子數組和-力扣(LeetCode)

一、題目解析 在給定順序的數組中找出一段具有最大和的連續子數組,且大小最小為1. 二、算法原理 1.狀態表示 我們可以意一一枚舉出所有的子數組,但我們想要的是最大子數組,所以f[i]表示:以i位置為結尾,所有子數組的最…

C++ queue對象創建、queue賦值操作、queue入隊、出隊、獲得隊首、獲得隊尾操作、queue大小操作、代碼練習

對象創建&#xff0c;代碼見下 #include<iostream> #include<queue>using namespace std;int main() {// 1 默認構造函數queue<int> q1;// 2 拷貝構造函數queue<int> q2(q1);return 0;} queue賦值操作&#xff0c;代碼見下 #include<iostream>…

全鏈路解析:影刀RPA+Coze API自動化工作流實戰指南

在數字化轉型加速的今天&#xff0c;如何通過RPA與API的深度融合實現業務自動化提效&#xff0c;已成為企業降本增效的核心命題。本文以「影刀RPA」與「Coze API」的深度協作為例&#xff0c;系統性拆解從授權配置、數據交互到批量執行的完整技術鏈路&#xff0c;助你快速掌握跨…

php本地 curl 請求證書問題解決

錯誤: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for 解決方案 在php目錄下創建證書文件夾, 執行下面生成命令, 然后在php.ini 文件中配置證書路徑; 重啟環境 curl --eta…

【圖數據庫】--Neo4j 安裝

目錄 1.Neo4j --概述 2.JDK安裝 3.Neo4j--下載 3.1.下載資源包 3.2.創建環境變量 3.3.運行 Neo4j 是目前最流行的圖形數據庫(Graph Database)&#xff0c;它以節點(Node)、關系(Relationship)和屬性(Property)的形式存儲數據&#xff0c;專門為處理高度連接的數據而設計。…

MIT 6.S081 2020Lab5 lazy page allocation 個人全流程

文章目錄 零、寫在前面一、Eliminate allocation from sbrk()1.1 說明1.2 實現 二、Lazy allocation2.1 說明2.2 實現 三、Lazytests and Usertests3.1 說明3.2 實現3.2.1 lazytests3.2.2 usertests 零、寫在前面 可以閱讀下4.6頁面錯誤異常 像應用程序申請內存&#xff0c;內…

(Git) 稀疏檢出(Sparse Checkout) 拉取指定文件

文章目錄 &#x1f3ed;作用&#x1f3ed;指令總覽&#x1f477;core.sparseCheckout&#x1f477;sparse-checkout 文件 &#x1f3ed;實例演示?END&#x1f31f;交流方式 &#x1f3ed;作用 類似于 .gitignore 進行文件的規則匹配。 一般在需要拉取大型項目指定的某些文件…

docker初學

加載鏡像&#xff1a;docker load -i ubuntu.tar 導出鏡像&#xff1a;docker save -o ubuntu1.tar ubuntu 運行&#xff1a; docker run -it --name mu ubuntu /bin/bash ocker run -dit --name mmus docker.1ms.run/library/ubuntu /bin/bash 進入容器&#xff1a;docke…

Docker系列(二):開機自啟動與基礎配置、鏡像加速器優化與疑難排查指南

引言 docker 的快速部署與高效運行依賴于兩大核心環節&#xff1a;基礎環境搭建與鏡像生態優化。本期博文從零開始&#xff0c;系統講解 docker 服務的管理配置與鏡像加速實踐。第一部分聚焦 docker 服務的安裝、權限控制與自啟動設置&#xff0c;確保環境穩定可用&#xff1b…

計算機視覺(圖像算法工程師)學習路線

計算機視覺學習路線 Python基礎 常量與變量 列表、元組、字典、集合 運算符 循環 條件控制語句 函數 面向對象與類 包與模塊Numpy Pandas Matplotlib numpy機器學習 回歸問題 線性回歸 Lasso回歸 Ridge回歸 多項式回歸 決策樹回歸 AdaBoost GBDT 隨機森林回歸 分類問題 邏輯…

工業軟件國產化:構建自主創新生態,賦能制造強國建設

隨著全球產業環境的變化和技術的發展&#xff0c;建立自主可控的工業體系成為我國工業轉型升級、走新型工業化道路、推動國家制造業競爭水平提升的重要抓手。 市場倒逼與政策護航&#xff0c;國產化進程雙輪驅動 據中商產業研究院預測&#xff0c;2025年中國工業軟件市場規模…

OpenCV CUDA 模塊圖像過濾------創建一個高斯濾波器函數createGaussianFilter()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::createGaussianFilter 是 OpenCV CUDA 模塊中的一個工廠函數&#xff0c;用于創建一個高斯濾波器。這個濾波器可以用來平滑圖像&#…