python-seleium实现珞珈在线网课辅助观看功能

article/2025/10/25 15:11:38

《武汉大学安全教育前置课程》网课观看辅助.py脚本

即将来到珞珈山的萌新们,在到校前,你是不是需要完成《武汉大学安全教育前置课程》?视频好多,一个一个来点击观看是不是有些疲累?快来看看这个脚本叭!

本脚本是在vs2019编写、调试完成的,共有一个文件夹,其中包含AutoOnlineCourse.py(以下简称.py文件)和相应的在vs2019下开展编写调试的配置文件,可以供有能力者进行后续的改写以适用于其他网课的自动跳转播放
该脚本使用python中的selenium库对浏览器进行操作,进而实现视频观看,其编写应用到了对网页html的一点点知识,用于获取控制元素,并且应用opencv-python中的帧处理操作对视频长度获取等内容进行编写,相对比较简单,欢迎各位下载。

下载地址放在文末啦。
操作过程中,仅需要在控制台或者vs中运行.py脚本,并且输入账号和密码即可自动实现视频播放和跳转,无需其他个人操作。

一、刷课平台界面及任务介绍

1.平台介绍

新生入学通知中介绍了很多种观看课程方式,但电脑端最终要进入的网课平台都是珞珈在线,登录该平台的账号密码皆为统一身份认证的所需学号身份证后6位

2. 网课任务

累计10个章节的几十个安全网课小节。其中每节大多由**”视频+测验**“组成,少数仅有测验没有视频。所以视频刷课,逐一点击更换,效率低且麻烦。

| [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zELVNMxI-1659684326068)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805104534115.png)] | [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dcvNhzXC-1659684326068)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805105037085.png)] |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
|                                                              |                                                              |

二、脚本功能介绍

1.自动跳转到**”珞珈在线“**网页http://www.mooc.whu.edu.cn/portal

2.自动进入登录界面

3.在控制台输入账号、密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJNrCGsW-1659684325919)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805103206351.png)]

4.自动跳转至所需学习课程界面,并进入学习课程页

5.自动进行播放,控制台上显示视频播放相应进度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fl6UebkI-1659684325920)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805105234086.png)]

6.播放完成后不断自动搜索未完成观看的视频,进行刷课

三、具体操作流程

1.打开控制台ctrl+R,输入cmd并回车(按Enter)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wDawCE8J-1659684325921)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805105817800.png)]

2.在控制台上输入python + .py文件全路径名称,脚本即运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-icq4tiJX-1659684325922)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805110504713.png)]

3.根据提示输入账号、密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ixxHPDYd-1659684325922)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805110414562.png)]

4.视频自动播放,如果想停止脚本运行,可以**“Ctrl+C”**,停止进程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uzKwV2V-1659684325923)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805121542592.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5pC8t8G6-1659684325924)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805121619228.png)]

四、其他要点

1.python环境的安装请自行下载

参考超详细的Python安装和环境搭建教程_Pymili的博客-CSDN博客_python安装

2.python文件需要额外安装selenium库、cv2库

在控制台cmd中输入python后,如果正常进入python环境并且显示python版本号即表示python安装成功。成功后键盘按**“Ctrl+z”**退出python环境后,输入以下两行命令,下载对应的代码库。配置好库之后,即可进行.py文件运行

pip install selenium

pip install opencv-python

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fsLpZu4T-1659684325925)(C:\Users\Mount Song\AppData\Roaming\Typora\typora-user-images\image-20220805111851089.png)]

3.配置selenium控制Edge浏览器所需要的操作

参考(67条消息) selenium + Edge 浏览器_tk1023的博客-CSDN博客_edge selenium

4.刷课过程中的注意事项

运行过程中请不要使电脑屏幕息屏,同时由于视频播放过程中鼠标的移动会导致视频暂停,所以请在刷课期间尽量不要使用电脑,如果不小心由于鼠标移动导致视频停止,请用鼠标点击视频继续播放,影响不大。

五、源码

# -*- coding:gbk -*-#引用库
from selenium import webdriver
from selenium.webdriver.common.by import By 
import html
from selenium.common.exceptions import WebDriverException as WDEximport time
from selenium.webdriver.common.action_chains import ActionChains
import cv2
import sys##获取视频时长的方法
def get_video_duration(filename):cap = cv2.VideoCapture(filename)if cap.isOpened():rate = cap.get(5)  #获取帧速率frame_num = cap.get(7) #获取视频中的帧数duration = frame_num/rate #总帧数/帧速率=视频时间return durationelse:print("视频读取有误!")return -1#获取视频当前播放位置
#这个地方get(cv2.CAP_PROP_POS_MSEC)无法正常返回当前帧所对应的时间,仅返回0,所以可能是cv2库的一个bug
def get_video_playsec(filename):cap = cv2.VideoCapture(filename)if cap.isOpened():return cap.get(cv2.CAP_PROP_POS_MSEC)else:print("视频读取有误!")return -1#命令行的进度条
def progress_Bar(playSecond,duration):scale = 50start = time.perf_counter()internal = int((duration-playSecond) / scale) + 1print("视频开始播放:")while True:dur  = time.perf_counter() - start if dur > duration:breaki = int(dur/internal)a = "*" * i b = "." * (scale-i)c = (i/scale) *100s = "\r{:^3.0f}%[{}->{}]{:2f}s".format(c,a,b,dur)sys.stdout.write(s)sys.stdout.flush()time.sleep(5)time.sleep(3)return -1#播放观看视频的函数,传入参数为需要点击的对应按钮
def watchVideo(em):try:em[0].click()while True:#寻找是否存在video控件用于判断是否存在视频,且需判断是否完成driver.switch_to.frame("iframe") #转入窗体中间部分对应的iframestate = driver.find_element(By.XPATH,'/html/body/div/div/p[1]/div')  #获取是否完成的状态flag = 0 #用于判断视频是否需要进行播放的标志#判断该小节是否已经完成,未完成则flag置为1if state.get_attribute('class') != 'ans-attach-ct ans-job-finished' :flag = 1else:breakdriver.switch_to.frame(driver.find_element(By.TAG_NAME,"iframe")) #转入到深层iframe,这里面对应到的iframe有两层video = driver.find_elements(By.TAG_NAME,"video")  #获取video控件#如果页面上存在视频,则flag继续为1,否则为0if len(video)>0:flag = 1*flagelse:flag = 0*flagbreak#只有在flag==1的情况下,视频才需要被播放if flag == 1:    video = video[0]src = video.get_attribute('src')ActionChains(driver).move_to_element(video).click().perform() #点击开启视频t = get_video_duration(src) #获取视频时间t0 = get_video_playsec(src) #获取当前播放的时间progress_Bar(t0,t)  #停止等待视频播放完成#听完视频/视频已完成,则进入下一部分driver.switch_to.window(driver.window_handles[-1])driver.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/div[1]/div[4]").click() driver.switch_to.window(driver.window_handles[-1])driver.find_element(By.XPATH,"/html/body/div[3]/div/div[1]/a").click()  #没有视频则返回选课界面except :driver.switch_to.window(driver.window_handles[-1])driver.find_element(By.XPATH,"/html/body/div[3]/div/div[1]/a").click()  #没有视频则返回选课界面print('播放完一小节视频.....')return -1###进入到刷安全知识的页面并实现登录功能
##全局变量区域
#刷课网站
url = html.unescape("http://www.mooc.whu.edu.cn/portal") #账号密码
account =""
psd =""#打开网页,并全屏,使用的是微软Edge浏览器
driver = webdriver.Edge()
driver.get(url)
driver.maximize_window()#尝试登录
try:a=driver.find_element(By.XPATH,'/html/body/div[3]/div/div[2]/input')a.click()#WebDriverWait(driver,10).until(EC.presence_of_all_elements_located())#driver.find_element(By.XPATH,'/html/body/div[3]/div/div[2]/div/a').click()#print('点击登录按钮成功')#输入账号密码,进行登录print("请输入账号和密码\n")account = input("账号:")pwd = input("密码:")driver.find_element(By.XPATH,'/html/body/div/div[2]/div[3]/div[2]/div[5]/div[2]/form/div[1]/input').send_keys(account)text = driver.find_element(By.XPATH,'/html/body/div/div[2]/div[3]/div[2]/div[5]/div[2]/form/div[2]/input[1]')text.send_keys(psd)btn = driver.find_element(By.XPATH,'//*[@id="casLoginForm"]/p[2]/button')ActionChains(driver).move_to_element(btn).click().perform()except WDEx as driver_error:print("登录失败,请检个人账号和密码是否正确,或网络是否正常")pass#登录进入课程界面
try:#切换进frame页time.sleep(5)driver.switch_to.frame('frame_content')driver.find_element(By.XPATH,'/html/body/div/div/div/div[1]/div[2]').click()time.sleep(1)lessons = driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div/div[2]/div[2]/ul').find_elements(By.XPATH,"//li[@class = 'course clearfix']")lessons[0].click()
except WDEx as error:print(error)#切换到最新生成的window窗体,开始进行刷课
try:driver.switch_to.window(driver.window_handles[-1])#找到第一个黄色的,也即未完成的课程sections_todo = driver.find_elements(By.XPATH,"//em[@class='orange']")sections_loc=[]for section in sections_todo:sections_loc.append(section.location)for loc in sections_loc:sections_todo = driver.find_elements(By.XPATH,"//em[@class='orange']")watchVideo([section for section in sections_todo if section.location==loc])print('视频已经刷完,请自行完成题目')
except WDEx as error:print(error)

本脚本进能够自动完成视频的播放任务,测试习题还需自行结合网上搜索进行完成,祝愿各位新生开启美好的珞珈山生活,开学愉快!

下载地址(免费0C币):
(9条消息) python-seleium实现珞珈在线网课辅助观看功能的脚本-Python文档类资源-CSDN文库


http://chatgpt.dhexx.cn/article/HyKEADB4.shtml

相关文章

python 课程学习

文章目录 目录 文章目录 前言: 一、安装anconda软件​二、使用步骤 2.1.询物理地址 2.2:复制讲义到该文件地址 2.3:OS模块学习 2.3.1 创建地址采用 os.mkdir() 2.3.2 python os.path 的使用 Python os.path() 模块 | 菜鸟教程 (runo…

免费python网络课程-python网络课程

广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! machine learning course with pythonby machine learningmindset简介本项目的目的是提供一个全面而简单…

python免费课程全套-为了学习Python,我汇总了这10个免费的视频课程!

毫无疑问,Python是目前世界上***的编程语言,它***的优势在于它将越多越多的人带入了编程领域。 近年来,学习Python的人比学习其他任何语言的人都多,许多人学Python是为了它背后的数据科学和机器学习库,当然,也有一些人学习用于Web开发的Python,有些人则学习用于编写脚本…

全套Python课程~

今天是元宵节,元宵节过后很多朋友就要开学啦~提前祝大家开学快乐! 今天给大家分享一套详细全面的Python系统课程,总共有637集,从入门到精通。大家可以先收藏下开学后后慢慢学! 【Python基础】Python_PYTHON入门_零基础…

Python进阶——网课不愁系列AI换脸技术

俗话说的好:网络一线牵,珍惜这段缘! 网络的水很深,年轻人你把握不住,众所周知照片是可以P的,但是“视频”是“P”不了的(狗头保命) 谁能想到AI换脸竟然如此便捷,在Python…

Python开发的Web在线学习教育培训网课系统

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题研究背景 1 1.2 课题研究目标与意义 2 1.3 课题研究内容及思路 2 第2章 系统需求分析 4 2.1系统的性能要求 4 2.2系统功能需求分析 4 2.2.1功能划分 4 2.2.2功能描述 7 2.3技术可行性分析 9 2.4相关技术简介 10 2.4.1 B/S体系相…

自学python哪个网课好,网课学python学的好吗

Python可以自学吗?有哪些不错的网课? 可以自学的,需要依据每个人的情况来决定,想要自学python对各方面有一定要求的,比如说基础好、自学能力强、理解能力强,这种情况是可以选择自学python的;相…

python免费网课-Python网课推荐——免费学习Python编程

对于想要学习python的初学者,面对网上大量的学习素材无从下手。今天小编就整理了一份详细的python教学视频合集,希望能为初学者提供一些学习的方向。 1.python入门 课程推荐:零基础入门学习Python 《小甲鱼零基础入门学习Python视频基础》(python教学版本:3.3.2)讲的是…

推荐一个学习python的网课,适合零基础

前言 如果你是零基础学习 Python,可以考虑以下几个网课: Codecademy Python 课程:该课程适合初学者,具有互动式的学习体验,可以让你快速掌握 Python 的基本知识。Udemy Python 从入门到精通课程:这个课程…

spring8-getBean()方法使用

;:getBean使用,要传数据,一个是字符串, 就是文件里的UserService 而这里的UserService就是我们配置文件的id:,第一个API 第二个API可以传入一个字节码类型。 如果某一个容器存在多个&#xff…

spring框架ApplicationContext的getBean()方法的详解

点击上方蓝字"优派编程"选择“加为星标”,第一时间关注原创干货 spring框架:接口ApplicationContext中的getBean()方法的详解 http://wp.fang1688.cn/study/318.html 我们知道可以通过ApplicationContext的getBean方法来获取Spring容器中已初始…

【细读Spring Boot源码】Spring如何获取一个Bean?BeanFactory的getBean方法

前言 在读refresh(context);时,finishBeanFactoryInitialization(beanFactory);中beanFactory.preInstantiateSingletons();用于实例化剩余所有的non-lazy-init的单例。这里包含了前置处理器和后置处理器 这里面就用到了本文主题getBean(beanName); 下面具体看看这…

Spring中关于getBean()报强制转化错误

在自学Spring时,在使用getBean()时,会报com.sakura.dao.impl.BookDaoImpl cannot be cast to com.sakura.dao.BookDao at com.sakura.App2.main(App2.java:19) 这个错误表示,不能将一个实现类BookDaoImpl类强转为BookDao接口。这个错&#…

spring源码解读之getBean方法(一)

前言 大家使用spring,最常接触到的就是bean,大家也知道spring中用一句getBean就能取出一个实例化好的bean,这个bean是属于IOC容器管理的,那么大家有没有看过getBean方法的源码呢,知不知道spring容器到底是怎么得到一个…

Spring源码之getBean(获取 bean)方法(一)解读

目录 测试类一个简单的测试类对于 ApplicationContext 和 ClassPathXmlApplicationContext 类图如下getBean() 源码解读查看 AbstractApplicationContext 中的 getBean 方法查看 AbstractBeanFactory 的 doGetBean 方法看 doGetBean 方法的流程图分析doGetBean 方法的主要流程 …

JavaBean(set和get方法)

JavaBean的规范 类中所有的成员属性都是私有,也就是 private 来修饰 提供一个公共无参数的构造方法 为所有私有的属性提供公共的 set 和 get 方法。 set方法 set 方法是有参数无返回值的,目的是通过 set 方法给 javabean 中的私有属性赋值,…

getBean方法源码

一、 三个API // 根据name获取bean Override public Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false); }// 根据name获取bean&#xff0c;如果获取到的bean和指定类型不匹配&#xff0c;则抛出异常 Override public <T>…

详解Spring中getBean()方法

我们日常会经常使用getBean()方法从spring容器中获取我们需要的bean。那么&#xff0c;getBean()方法是怎么一步步完成从spring容器中获取bean的呢&#xff1f; 下面我们就通过源码分析一下。 一、主要代码分析 基于&#xff1a;spring5.1 入口&#xff1a;AbstractBeanFactory…

getBean方法(一)

我们先看看这个方法的轮廓流程 这个getbean的轮廓方法很长. 先分两种情况: 一种是在缓存实例中能拿到bean, (主要是factroyBean的处理, 执行所有已注册的 BeanPostProcessor 的 postProcessAfterInitialization 方法) 前边是校验 (如果name以“&”为前缀&#xff0c;但是b…

Spring源码分析之getBean主流程分析

当我们通过向Spring容器获取某个bean的时候&#xff0c;总是调用Spring中重载的各种getBean方法。那么&#xff0c;getBean中的流程是什么样的&#xff1f; 通过本文&#xff0c;你将对getBean方法的主流程有一个详细的认识。 入口当然是getBean方法&#xff1a; public Obje…