自动刷课脚本DEMO 基于慕课
程序摘要:
这个程序使用 Selenium 自动化工具实现了以下功能:
- Selenium 登录与页面操作:通过模拟用户行为进行登录、点击按钮等。
- 视频时长获取:通过 JavaScript 获取
<video>
元素的时长,进而模拟视频的观看。 - 自动播放与自动跳转:根据
AUTO_PLAY
设置自动播放视频并点击“下一节”按钮,直到课程结束。 - 自动登录:登录成功后,程序进入视频页面,点击播放按钮,模拟观看视频,并继续观看下一节。
- 数据统计:在结束时,输出总的视频观看统计信息。
程序核心功能的实现:
1. 登录功能:
- 使用 Selenium 模拟用户登录到在线学习平台。
- 用户名和密码通过脚本进行填充,并通过模拟按下回车键来提交登录表单。
- 登录成功后,程序跳转到指定的课程视频页面。
2. 视频播放控制:
- 如果
AUTO_PLAY
设置为True
,程序会尝试自动点击播放按钮,控制视频播放。 - 点击播放按钮:使用
click_play_button()
函数,等待并点击页面上的播放按钮(假设按钮的类名是vjs-play-control
)。
3. 视频观看模拟:
simulate_video_watch(driver)
:模拟观看视频。获取视频的时长,等待指定的时长,模拟用户观看。- 视频观看完成后,程序会点击“下一节”按钮,继续播放下一段课程视频,直到全部视频观看完毕。
4. 视频统计:
- 统计总观看的视频个数和观看时长。
- 每当播放完一个视频,
VIDEO_COUNT
和VIDEO_TIME
就会增加。
5. 主程序流程:
- 自动登录到一个在线学习平台。
- 自动点击播放按钮(如果启用自动播放)。
- 获取视频时长并模拟观看视频。
- 每观看一个视频,自动跳转到下一个视频。
- 统计观看的视频数量和总观看时长。
- 最终,程序输出观看视频的统计数据,并退出浏览器。
更新日志:
无
程序代码:
function.py
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
import time
# 配置登录信息
username = "xxx" # 替换为实际的用户名
password = "xxx" # 替换为实际的密码
#login_url = "https://www.imooc.com/login" # 登录页面 URL
course_url = "https://www.gysjxjy.com/studentmanage/play.asp?Courseware_CsID=2024011019561691534&PlanID=2024011216010918444" # 课程视频页面 URL
# 是否启用 requests.Session 优化(True 使用 Session,False 使用正常 Selenium 登录)
#USE_SESSION = True
#刷课平台是否具备自动播放
AUTO_PLAY = True
#统计数据
VIDEO_COUNT = 0
VIDEO_TIME = 0
# 使用 Selenium 执行正常的浏览器登录
def login_with_selenium():
driver = setup_browser()
# 打开登录页面
driver.get(course_url)
time.sleep(5) # 等待页面加载
# 找到用户名、密码输入框并输入相应的账号和密码
username_input = driver.find_element(By.NAME, "email") # 假设用户名字段的 name 为 'email'
password_input = driver.find_element(By.NAME, "password") # 假设密码字段的 name 为 'password'
# 输入用户名和密码
username_input.send_keys(username)
password_input.send_keys(password)
# 提交表单(按 Enter 键)
password_input.send_keys(Keys.RETURN)
# 等待页面加载,直到课程视频页面加载完成
time.sleep(5)
return driver
# 设置 Selenium 浏览器
def setup_browser():
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
# options.add_argument('--headless') # 无头模式(可选,不显示浏览器界面)
options.add_argument("--start-maximized")
options.add_argument('--disable-gpu') # 禁用GPU加速(可选)
options.add_argument("--no-sandbox")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36") #使用时替换为自己的浏览器代理
driver = webdriver.Chrome(options=options)
return driver
# 点击播放按钮
def click_play_button(driver):
if AUTO_PLAY == False:
try:
play_button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "vjs-play-control"))
)
driver.execute_script("arguments[0].click();", play_button)
print("成功点击播放按钮")
except Exception as e:
print(f"无法找到播放按钮:{e}")
# 点击下一个按钮
def click_next_button(driver):
try:
# 等待“下一节”按钮(class: J-next-btn)可点击
next_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CLASS_NAME, "J-next-btn"))
)
print("成功点击下一节按钮")
driver.execute_script("arguments[0].click();", next_button)
time.sleep(5)
simulate_video_watch(driver)
except Exception as e:
print(f"无法找到下一节按钮:{e}")
# 模拟观看视频
def simulate_video_watch(driver):
video_duration = get_video_time(driver)
time.sleep(video_duration) # 模拟观看视频,假设视频播放 10 秒钟
print(f"播放完毕")
global VIDEO_COUNT,VIDEO_TIME
VIDEO_COUNT += 1
VIDEO_TIME += video_duration
time.sleep(5)
click_next_button(driver)
#获取视频元素的时长
def get_video_time(driver):
try:
# 执行 JavaScript 获取视频元素的时长
video_duration = driver.execute_script(
"var video = document.querySelector('video');" # 获取页面中的第一个 <video> 标签
"if (video) {"
" return video.duration;" # 获取视频的时长(单位:秒)
"} else {"
" return null;" # 如果没有找到视频元素,返回 null
"}"
)
if video_duration is not None:
print(f"视频时长为: {video_duration} 秒")
return video_duration
else:
print("未能找到视频元素,无法获取时长")
except Exception as e:
print(f"获取视频时长失败:{e}")
# 主程序
def main():
'''
if USE_SESSION:
# 使用 requests 登录并获取 Cookies
cookies = login_with_requests()
if not cookies:
print("登录失败,程序退出")
return
# 使用 Selenium 登录并传入 Cookies
driver = login_with_selenium_using_cookies(cookies)
else:
# 使用 Selenium 执行正常的登录流程
driver = login_with_selenium()
'''
# 登录
driver = login_with_selenium()
# 点击播放按钮 自动播放
click_play_button(driver)
# 模拟观看视频
simulate_video_watch(driver)
# 完成操作后退出
print(f"===============================")
print(f"播放结束,共计播放视频个数:{VIDEO_COUNT} 总视频时间:{VIDEO_TIME} 秒")
driver.quit()
# 执行主程序
if __name__ == "__main__":
main()
'''
# 创建 Session 对象来管理登录
def login_with_requests():
session = requests.Session()
# 模拟登录请求
login_data = {
"email": username,
"password": password
}
# 发送 POST 请求进行登录
response = session.post(course_url , data=login_data)
# 检查登录是否成功(例如通过检查页面内容或返回的 HTTP 状态码)
if response.status_code == 200:
print("登录成功(通过 Session)")
else:
print("登录失败")
print(response.text)
return None
# 获取登录后的 Cookies
cookies = session.cookies.get_dict()
return cookies
# 使用 Selenium 通过 Session 中的 Cookie 模拟已登录状态
def login_with_selenium_using_cookies(cookies):
driver = setup_browser()
# 访问课程页面
driver.get(course_url)
# 添加 cookies 到浏览器
for cookie_name, cookie_value in cookies.items():
driver.add_cookie({"name": cookie_name, "value": cookie_value})
# 刷新页面,让浏览器使用这些 Cookies 来进行后续的请求
driver.refresh()
return driver
'''