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;用于创建一个高斯滤波器。这个滤波器可以用来平滑图像&#…