tools

自动刷课脚本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_COUNTVIDEO_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

'''

留言

您的邮箱地址不会被公开。 必填项已用 * 标注