发布于  更新于 

MooCount清华大学慕课平台讨论区统计助手 使用说明

版本号 0.1.0 build 20121402

项目地址:清华大学代码托管平台TitHub

更新 - 已暂时停更

v0.2.0 build 20122301

  • 加入了“视频评论区”统计,但限于服务器设置,此步骤无法自动完成视频清单的获取,需手动添加
  • 加入了评论内容整合
  • 优化内存使用

v0.1.0 build 20122001

  • 修复了输出csv文件的格式:以”stdID”、”count”为keys,以 **(学号,统计次数)**对为数据输出。
  • 增加部分错误处理机制
  • 简化凭证设置步骤
  • 优化内存使用

v0.0.2 build 20121402

由Ap0str0ph3于2020年12月14日下午21:30提交

  • 将项目能力能力拓展至平台任意课程
  • 修复了少量bug

v0.0.1 build 20121401

由Ap0str0ph3于2020年12月14日下午17:00提交

  • 完成了项目基础能力的开发

前言

我校部分思修课程的慕课学习有“16次”讨论区讨论的任务,但限于平台功能,同学们无法获知已讨论次数,故特开发此程序用于统计已讨论次数。然而,此程序使用的方法极为暴力,希望平台开发者后期能提供统计功能。

程序概述

总体设计

程序采用Python为主要语言开发,读写数据时采用以下文件格式:

  • json,用于存储一个讨论区的信息数据、存储讨论区中每个讨论的内容数据
  • har,用于储存一个用于平台登陆的账号的request信息
  • csv,用于存储最终统计结果,便于直接读入Excel中

引用了以下包(如需二次开发请确保以下包安装到位,均可用pip安装):

  • json
  • requests
  • csv
  • urllib

慕课网站讨论区部分架构(并按照网站后台代码翻译)可表示为:

  • 讨论区 - Forum
    • 讨论题 - Discussion
      • 讨论题目
      • 讨论数据的统计数据
      • 讨论数据
        • 讨论 - Comment
          • 讨论内容
          • 学生信息(含学号

程序原理

程序通过用户输入的慕课id获取对应慕课讨论区的数据包,里面包含每个讨论题的唯一识别编号(讨论id)。

对每个讨论题,程序发送GET请求,获取到一个json文件其url如下:

1
"https://tsinghua.yuketang.cn/v/discussion/v2/comment/list/" + id + "/?_date=" + time + "&term=latest&offset=" + offset + "&limit=" + limit + "&web=true"

其中:

  • id是讨论题的唯一识别编号
  • time是请求时的UNIX时间戳
  • offset是下载的首条讨论的偏移量,即从第(offset + 1)条记录开始下载
  • limit是讨论数的下载总量

关于UNIX时间戳,请浏览:Wikipedia。亲测time设为任意合法时间戳均可,应当只是用于服务器记录用。设置较大的limit就能保证每条数据都被下载。例如,我所在班级微信群共150人,代码中设置200几乎能保证下载到所有记录。
遍历讨论数据中的每一条,在字典中插入对应学号(如果之前没有插入)并赋值为1,或为字典中对应学号的值+1(如果之前已经插入)。

最后,将字典保存为csv文件输出。

使用说明

载入凭证

先手动登录慕课平台,按下浏览器的F12键,打开Developer Tools,单击 “Network”选项卡

保持Developer Tools打开,从页面进入慕课的讨论区

“Network”选项卡下寻找以 “?_date=…”为前缀的项目,右键,选择Save all as HAR with content保存为HAR文件

打开保存的HAR文件,找到request对象,将其中的cookies对象、headers对象分别复制到程序同目录下的req.har文件中的对应位置。由于程序会为服务器带来短时间的大量访问,特设置此障碍,防止作者被打死防止过多人频繁使用本工具,为服务器带来明显负面影响。

载入凭证

在同一目录下创建“Forum”文件夹,确认程序有访问之的权限。

确认慕课编号

在讨论区页面,单击浏览器地址栏,找到参数cid=...,记录后面的7位数,作为慕课id
编译并运行程序,在提示时输入慕课id,回车。

导出数据

等待程序下载、统计数据。完成后,在程序目录下会找到count.csv文件。以UTF-8 CSV文件导入Excel即可。

这里作者不小心把学号作为csv的keys了,麻烦自己调一下,下次更新的时候(如果有)作者会改过来!