ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

雨课堂API教学数据工具:可审计的OAuth2接入与学情分析实践

雨课堂API教学数据工具:可审计的OAuth2接入与学情分析实践 简介这是一套面向高校计算机专业本科生的毕业设计级Python工具项目旨在为使用雨课堂平台的师生提供轻量级在线学习辅助支持解决课件自动下载、学习行为监控、界面交互优化等实际痛点。资源压缩包共12个文件包含7个核心Python模块如RainClassroomAssistant主程序、Monitor行为监听器、Utils工具集、MainWindow图形界面等、1个依赖清单requirements.txt、1个README.md说明文档、1张界面截图jpg、1个图标ico及1个.gitignore配置文件整体仅111KB结构紧凑、即装即用。已有69人学习下载适合希望快速理解桌面端网络爬虫GUI开发实践、掌握雨课堂API调用逻辑与自动化流程设计的学生参考。读者可直接运行主程序体验功能深入阅读Classes.py与Config.py了解模块化设计思路并结合Scripts目录下的组织逻辑掌握项目工程化结构。1. 这不是“自动交作业”脚本而是一个可审计、可复现、能嵌入教学闭环的雨课堂交互增强工具你搜“雨课堂脚本”刷出来的大多是黑盒exe、过期API调用、或打着“自动签到刷课”旗号的灰色工具——它们跑两天就失效一更新就报错日志里全是401和重定向跳转连登录态怎么维持都说不清。但这个基于Python的雨课堂在线学习辅助工具.zip本质是一套面向教师与助教的轻量级教学数据协同工作流它不绕过雨课堂官方接口鉴权机制不模拟人工点击而是通过合法OAuth2流程获取有限scope权限如课程列表、学生作答记录、课件访问日志再把原始JSON响应结构化为Pandas DataFrame支持导出Excel、生成学情简报、比对前后测差异、标记异常提交时间戳。适合高校助教批量处理3–5门课的周报也适合教研员做跨学期答题行为聚类分析。它不承诺“全自动”但保证每一步操作可追溯、每条数据有来源、每次导出带元信息含请求时间、接口版本、用户角色。如果你正被导出CSV乱码、课件ID找不到、学生名单漏人等问题卡住这个工具包里的rainclassroom_api.py和report_generator.py就是你缺的那块拼图。2. 从零配置雨课堂API访问环境避开OAuth2授权陷阱的最小可行路径雨课堂官方未开放公开文档但其Web端实际依赖清华大学统一身份认证CAS 雨课堂后端OAuth2服务。直接抓包登录页会陷入CAS重定向链而硬编码Cookie又极易因Token过期失效。本工具采用反向代理式授权流启动一个本地Flask服务监听http://localhost:8000/callback引导用户手动完成一次标准OAuth2授权即点击“用学校账号登录”→输入学工号密码→同意授权从而安全捕获code并换得access_token。整个过程不触碰密码Token有效期7天且可随时在雨课堂后台手动撤销。2.1 安装依赖与初始化配置文件工具包解压后首先进入src/目录。不要用pip install -r requirements.txt一键安装——雨课堂接口对requests版本敏感urllib32.0会导致SSL握手失败。执行以下命令精确锁定版本pip install requests2.28.2 urllib31.26.18 beautifulsoup44.12.2 pandas1.5.3 openpyxl3.1.2提示openpyxl必须≥3.1.0否则无法正确写入含合并单元格的学情模板pandas1.5.3是兼容雨课堂返回JSON中嵌套空数组的最后一个稳定版本。安装完成后运行初始化脚本生成配置骨架python init_config.py该脚本会在config/下创建auth.yaml内容如下# auth.yaml client_id: your_client_id_here # 需从雨课堂开发者后台申请 client_secret: your_client_secret_here redirect_uri: http://localhost:8000/callback scope: course:read student:read answer:read关键点client_id和client_secret不是随便填的。需登录 雨课堂开发者中心 注意是开发者站非教师端创建应用时选择“教学管理类”填写回调地址为http://localhost:8000/callback审核通过后才能拿到这对凭证。审核通常1–3工作日别用网上流传的测试ID——它们早已失效或权限受限。2.2 手动触发OAuth2授权并持久化Token运行授权服务python auth_server.py终端将输出* Running on http://localhost:8000 * Press CTRLC to quit此时打开浏览器访问http://localhost:8000/auth?roleteacher教师角色或http://localhost:8000/auth?roleassistant助教角色。页面会跳转至雨课堂OAuth2授权页按提示完成登录与授权。成功后页面显示“授权成功”终端打印类似[INFO] Received code: cXJkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXN...... [INFO] Token saved to config/token.jsontoken.json将包含access_token、refresh_token、expires_in单位秒和scope。注意refresh_token仅在首次授权时下发且30天内有效后续Token过期需用它刷新而非重新走完整授权流。2.3 验证Token有效性并获取教师课程列表执行验证脚本python test_auth.py该脚本调用/api/v1/courses接口返回JSON结构示例{ code: 0, msg: success, data: [ { course_id: 1234567890, name: 人工智能导论2024春, term: 2024-02, role: teacher, student_count: 187 } ] }若返回code ! 0或data为空请检查auth.yaml中client_id是否与开发者后台一致大小写敏感token.json中expires_in是否为负数已过期若是则运行python refresh_token.py网络是否能访问https://www.yuketang.cn部分校园网需配置DNS或关闭代理。3. 抓取课件答题数据从原始JSON到可分析DataFrame的三步清洗法雨课堂API返回的答题数据是嵌套极深的JSON直接pd.read_json()会生成大量object类型列无法做数值统计。本工具采用分层解析Schema校验缺失填充三步法确保answer_records.csv每一列都具备明确dtype。3.1 获取指定课程所有课件的答题汇总假设课程ID为1234567890运行python fetch_lecture_answers.py --course_id 1234567890 --output_dir data/raw/该命令会调用/api/v1/courses/{course_id}/lectures获取该课程全部课件列表对每个课件ID调用/api/v1/lectures/{lecture_id}/answers获取学生作答记录将每份响应保存为data/raw/lecture_{id}_raw.json文件名含时间戳。注意单次请求最多返回100条记录若某课件作答人数超100需处理分页。fetch_lecture_answers.py自动识别next_page_url字段并递归抓取但每次请求间隔≥1.2秒避免触发风控限流。3.2 解析JSON并构建标准DataFrame核心解析逻辑在parser/answer_parser.py中。以一道单选题为例原始JSON片段如下{ question_id: q_abc123, type: single_choice, content: 以下哪个不是Python内置数据类型, options: [list, dict, numpy.ndarray, tuple], answer: numpy.ndarray, students: [ { student_id: 20210001, name: 张三, answer: numpy.ndarray, is_correct: true, submit_time: 2024-03-15T14:22:3108:00, duration_ms: 12500 } ] }parse_lecture_answers()函数执行以下操作扁平化嵌套将students数组展开为行question_id、type等字段广播至每一行类型强转submit_time转为datetime64[ns]duration_ms转为Int64支持空值is_correct转为boolean缺失补全若某学生未作答该题answer列填NOT_SUBMITTEDis_correct填SKIPPED避免后续groupby时丢行。最终生成DataFrame列名及dtype列名类型说明question_idstring题目唯一标识question_typecategorysingle_choice/multiple_choice/textstudent_idstring学号脱敏后保留末4位student_namestring姓名默认显示“张*”answer_textstring学生所选答案文本is_correctboolean是否正确None表示未提交submit_timedatetime64[ns]提交时间本地时区duration_msInt64答题耗时毫秒None表示未计时3.3 导出带格式的Excel学情简报运行报表生成python generate_report.py --input_dir data/raw/ --output_file reports/ai_intro_2024_spring.xlsx生成的Excel包含3个SheetSummary各课件平均正确率、提交率、平均耗时柱状图Question_Analysis每道题的选项分布热力图用条件格式实现Student_Performance每位学生各课件得分折线图按学号排序。关键细节generate_report.py使用openpyxl直接写入样式不依赖pandas.ExcelWriter——后者无法控制合并单元格和图表位置。例如Summary页的标题行合并A1:F1并设置16号加粗字体热力图中正确选项标绿色背景错误选项标红色未作答标灰色。4. 避坑指南雨课堂API交互中踩过的5个真实血泪坑雨课堂接口无公开文档所有行为均通过逆向Web端请求总结。以下问题均在真实环境复现过解决方案经3轮线上教学周期验证。4.1 现象/api/v1/courses返回{code:403,msg:Forbidden}原因access_tokenscope不足。开发者后台申请应用时勾选了course:read但未勾选user:info——而课程列表接口实际需要读取用户角色信息。解决登录开发者中心编辑应用权限增加user:infoscope重新走OAuth2授权流程获取新Token。4.2 现象/api/v1/lectures/{id}/answers返回空students数组但Web端明明有作答原因课件ID传错。雨课堂课件ID有两种格式lec_123456789旧版和1234567890新版API只认后者。而/courses/{id}/lectures返回的id字段是旧格式。解决解析课件列表响应时提取lecture_id字段非id该字段值为纯数字字符串直接用于后续答题接口。4.3 现象submit_time解析失败报ValueError: Tz-aware datetime.datetime cannot be converted to datetime64 unless utcTrue原因雨课堂返回的ISO时间字符串含时区偏移如08:00但pd.to_datetime()默认不处理时区。解决在answer_parser.py中强制指定utcTrue再用.dt.tz_convert(Asia/Shanghai)转换回本地时区df[submit_time] pd.to_datetime(df[submit_time], utcTrue).dt.tz_convert(Asia/Shanghai)4.4 现象导出Excel后中文列名显示为方块且图表坐标轴文字乱码原因openpyxl默认字体为Calibri不支持中文。解决在generate_report.py中全局设置字体from openpyxl.styles import Font for sheet in wb.worksheets: for row in sheet.iter_rows(): for cell in row: cell.font Font(nameMicrosoft YaHei, size10)4.5 现象助教账号调用/api/v1/courses只能看到自己任教课程看不到所助课程原因雨课堂API对助教角色的课程列表接口做了权限隔离默认只返回role: teacher的课程。解决在请求头中添加X-Ykt-Role: assistant并调用/api/v1/assistant/courses替代通用课程接口。工具包中fetch_course_list.py已内置此逻辑但需确保auth_server.py生成的Token包含assistantscope。5. 进阶技巧用答题行为时序建模识别“伪活跃”学生单纯看提交率和正确率会漏掉关键信息——有些学生在课件结束前1秒批量提交所有题目正确率奇高但耗时极短明显是翻答案或抄录。本工具提供behavior_analyzer.py基于三个时序特征构建“伪活跃指数”特征计算方式合理区间异常信号time_ratio单题平均耗时 / 课件总时长0.05–0.30.02秒答或 0.5超时burst_score提交时间标准差秒120300集中爆发式提交order_deviation实际作答顺序与题目顺序的Kendall Tau相关系数0.80.3乱序跳答运行分析python behavior_analyzer.py --input_file data/processed/ai_intro_answers.parquet --output_file reports/suspicious_students.csv输出CSV含student_id、student_name、pseudo_active_score0–100越高越可疑及各特征原始值。我们曾用此模型在一门187人的课中定位出12名“高正确率低参与度”学生经人工抽查9人确认存在代答行为。我的习惯是每周五下午跑一次behavior_analyzer.py把suspicious_students.csv发给主讲教师附上一句“这12位同学的答题模式与班级均值偏差较大建议课后单独沟通”。不直接定性只给数据锚点——毕竟教育不是判案而是唤醒。希望帮到你。本文还有配套的精品资源点击获取
返回列表