当前位置: 首页 > news >正文

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.xdnf.cn/news/567109.html

相关文章:

  • Redis 的 key 的过期策略是怎么实现的
  • Redis String 设计思想深度解析
  • 系统架构设计师案例分析题——数据库缓存篇
  • 解除diffusers库的prompt长度限制(SDXL版)
  • ArcGIS Pro 3.4 二次开发 - 核心主机
  • Linux yq 命令使用详解
  • 【Qt】QImage实战
  • 一文读懂迁移学习:从理论到实践
  • Git Clone 原理详解:为什么它比本地文件复制更快? -优雅草卓伊凡
  • word格式相关问题
  • C语言——函数递归与迭代
  • 微调后的模型保存与加载
  • Android13 wifi设置国家码详解
  • 结课作业01. 用户空间 MPU6050 体感鼠标驱动程序
  • SuperVINS:应对挑战性成像条件的实时视觉-惯性SLAM框架【全流程配置与测试!!!】【2025最新版!!!!】
  • flink 提交流程
  • 基于Flink的数据中台管理平台
  • CNN手写数字识别/全套源码+注释可直接运行
  • 基于moonshot模型的Dify大语言模型应用开发核心场景
  • 如何成为更好的自己?
  • AI智能分析网关V4玩手机检测算法精准管控人员手机行为,搭建智慧化安防监管体系
  • iOS 15.4.1 TrollStore(巨魔商店)安装教程详解:第二篇
  • Ubuntu学习记录
  • vscode打开vue + element项目
  • ADB常用语句
  • springboot 1.x2.x依赖spring版本
  • 初识Linux · 五种IO模型和非阻塞IO
  • Flink基本理解
  • 初识Linux · NAT 内网穿透 内网打洞 代理
  • 【题解-洛谷】B4240 [海淀区小学组 2025] 最短字符串