当前位置:首页>python>从零到一:我用Python打造了一款全自动学习助手-21tb网络学院刷课助手

从零到一:我用Python打造了一款全自动学习助手-21tb网络学院刷课助手

  • 2026-09-11 01:35:04
从零到一:我用Python打造了一款全自动学习助手-21tb网络学院刷课助手

本文约3385字,建议阅读9分钟
告别手动点击,解放你的时间。

从零到一:我用Python打造了一款全自动学习助手-21tb网络学院刷课助手

告别手动点击,解放你的时间

大家好,我是Jubai也叫黑夜里的白羊,欢迎来到「云雪星球」。今天想和大家分享一个我最近完成的Python项目——一个能够自动完成在线课程学习的图形化工具。从最初的原型到最终稳定版本,经历了许多技术挑战,现在终于可以拿出来和大家见见了。

背景

很多在线学习平台都有必修课程,但手动一集一集点开、等待、再关闭,实在浪费时间。尤其是当课程多达几十门时,简直让人抓狂。如果能有一个程序自动帮我们完成学习、甚至自动评价,那该多好?

但是最重要的原因是有人找到我了

技术探索之路

第一步:登录模拟

登录是第一个拦路虎。通过抓包发现,登录接口是/login/login.ajaxLogin.do,返回state: S表示成功。但直接调用API需要处理动态的hyperEspCode参数,这个参数是由前端JavaScript生成的,逆向成本高。于是我选择使用Selenium模拟真实用户登录,这样还能自动处理“继续登录”按钮等异常情况。

# 核心登录代码(简化)username_input = wait.until(EC.presence_of_element_located((By.ID, "loginName")))password_input = driver.find_element(By.ID, "password")...login_button.click()

登录成功后,通过/os/html/desktopItem/desktopItem.todayTaskContextJson.do获取用户信息,动态更新CURRENT_APP_ID等参数,这样即使平台调整应用ID,程序也能自适应。

第二步:获取课程列表

课程列表接口返回的是HTML而非JSON,需要用BeautifulSoup解析。我从中提取了每个课程的ID、标题,并根据class中包含innercan还是innerpass判断是否需要学习。

soup = BeautifulSoup(html, 'html.parser')ul = soup.find('ul', class_='track-dialog-inner-list')for li in ul.find_all('li', class_=lambda c: c and ('innercan' in c or 'innerpass' in c)):    a = li.find('a', class_='goCourseByStudy')    course_id = a['id']    need_study = 'innercan' in li['class']

同时,我在返回中增加了all_finished标志,通过检测页面中是否出现“您已完成所有阶段的学习”文本来判断整体学习是否完成。

第三步:进入课程播放页

每个课程都有一个“进入学习”的URL,但实际播放地址需要二次请求。通过/els/html/courseInfo/courseinfo.checkMsUrl.do接口,传入courseId和基础URL,就能获得最终的播放地址。

play_url = api_utils.get_course_play_url(course_id, base_enter_url)driver.get(play_url)

在播放页中,我发现真正的视频信息藏在一个iframe里,其src包含了关键的sourceId和providerCorpCode,这两个参数是后续所有请求的基础。

iframe = driver.find_element(By.ID, "aliPlayerFrame")src = iframe.get_attribute("src")# 解析出 sourceId 和 providerCorpCode

第四步:获取章节资源

每个课程可能有多个章节,每个章节可能包含多个视频。通过/tbc-rms/course/showCourseChapter接口,传入sourceId和providerCorpCode,就能获得完整的章节和资源列表。

items = api_utils.get_course_chapters(source_id, provider_corp_code)# 每个item包含 chapterId, resourceId, timeToFinish(秒), minStudyTime等

第五步:创建学习记录

对于未学习的章节,getStudyRecordList接口返回的记录列表为空。此时需要先发送一次updateCourseRecord请求,且recordId设为null,currentPosition设为0,让服务器生成学习记录。等待2秒后再次获取记录列表,就能拿到真实的recordId。

# 创建记录success = api_utils.report_progress(record_id=None, ...)time.sleep(2)# 重新获取记录列表records = api_utils.get_study_record_list(...)

第六步:循环上报进度

有了recordId后,就可以循环调用updateCourseRecord接口,每次增加currentPosition(步长和间隔可在GUI中动态调整),直到达到总时长timeToFinish。这样模拟了真实观看视频的过程,不会被服务器检测为异常。

while current < total:    current = min(current + step, total)    api_utils.report_progress(record_id=record_id, current_position=current, ...)    time.sleep(interval)

第七步:自动评价

学习完所有章节后,还需要对课程进行评价。通过两个接口完成:

  • saveOnLineCourseStar.do:打5星

  • saveCourseEvaluate.do:提交问卷(答案硬编码,可修改)

第八步:进度显示与完成判断

登录后自动刷新进度,显示总课程数、已完成数及百分比。点击“刷新进度”可手动更新。最重要的是,当服务器返回“您已完成所有阶段的学习”时,进度直接跳到100%,并停止学习。

最终成果展示

经过以上努力,我得到了一个功能完整的图形化工具。界面采用Tkinter实现,主要包含:

  • 浏览器配置:无头模式、无痕模式、防止电脑休眠

  • 登录配置:用户名、密码输入框,登录按钮

  • 学习配置:上报间隔、每次步长、课程间隔(可实时调整)

  • 进度显示:总课程数、已完成数、进度条、百分比

  • 操作按钮:刷新进度、开始学习、停止学习

  • 日志区域:实时显示运行日志,方便调试

使用教程

  1. 登录:输入用户名密码,点击“登录”。首次登录可能需要处理“继续登录”按钮,程序会自动点击。

  2. 开始学习:登录后点击“刷新进度”查看当前课程完成情况,然后点击“开始学习”即可自动学习所有未完成的课程。学习过程中可随时停止。

  3. 参数调整:可根据网络情况调整上报间隔和步长,一般推荐间隔5秒,步长30秒。

代码结构

  • config.py:配置类,包含所有API地址、固定参数。

  • login.py:登录函数,处理登录流程和用户上下文获取。

  • api_utils.py:API工具类,封装所有网络请求。

  • course_learner.py:核心学习器,负责单个课程的学习流程。

  • Shuake.py:主程序,遍历所有课程并管理进度。

  • shuake_gui.py:图形界面。

  • run_gui.py:启动脚本。

写在最后

目前这个工具已经能在目标平台上稳定运行,支持多章节、断点续学、自动评价等功能。未来可能增加更多平台的支持,或者优化自动答题(课后测试)的部分。如果你有更好的想法,欢迎在公众号后台留言交流。

最后,感谢你读到这里。如果你觉得这个项目有用,别忘了点赞、在看、分享给更多需要的朋友。关注「云雪星球」,获取更多技术干货!

(注:本工具仅供学习交流使用,请勿用于违规用途。)

关于我们

云雪星球作为日常分享公众号,用于个人分享生活与日常(分享工作,分享生活,分享爱情····)封面图大多数由AI生成。文中可能有部分内容及图片来源于网络,版权归原作者所有;内容如有任何不妥之处,请联系改正或删除。

最新文章

随机文章