畅课的几种签到模式

长安大学使用畅课作为网络教学平台,在课堂考勤方面,畅课使用以下三种方式。

雷达点名

原理

由于看不到后端代码,以下为猜测的原理。

教师一般在其手机端开启签到,获取教师手机的经纬度和高度位置,提交到后端,作为电子球形围栏的中心点,围栏的半径未知,1km左右。学生在其畅课客户端点击”签到“按钮,软件获取学生手机的经纬度和高度位置,判断是否在电子围栏内,以完成签到。

技术细节

  • 后端接口https://course-online.chd.edu.cn/api/rollcall/{rollcall_id}/answer
  • 请求方法PUT

URL参数

  • api_version:1.1.2

提交数据如下。

{
    "deviceId": "c098176e8baf1c06",
    "latitude": 23.18442063908537,
    "longitude": 113.4246709841635,
    "speed": 0.020999999716877937,
    "accuracy": 0.020980000495910645,
    "altitude": 800,
    "altitudeAccuracy": null,
    "heading": 0.0210999995470047
}

签到成功返回数据如下。

{
    "distance": 467.6857646748217,
    "id": 23370444,
    "status": "on_call",
    "status_name": "on_call_fine"
}

破解思路

你知道上课的地点,使用谷歌地球或本地GIS地图模型,找到教室所在位置,获取经纬度,填入请求json中发送即可。

同样的课程,你只需要查一次经纬度,后续直接使用先前查到的数据即可。

二维码点名

原理

生成一个token,将其封装到二维码中供学生扫描,畅课客户端将扫描到的token提交后端验证,完成签到。token每十秒刷新。

技术细节

二维码中封装的内容格式如下。

/j?p=0~?37ge!3~173128484686f2ad4157a6227b3dd1239d3e576294!4~?4lx9

以下为推测的各项参数定义。

  • n~:参数序号标识,兼具开始标识作用
  • !:结束标识作用
  • 37ge:课程的ID(不过畅课有专门的数字型课程ID)
  • hashtoken,时间戳和一个哈希拼接
  • ?4lx9qrcid,二维码签到ID,拼接到接口URL中

请注意,qrcidrollcall_id是两个不同的类型。

  • 后端接口https://course-online.chd.edu.cn/api/rollcall/{qrcid}/answer_qr_rollcall
  • 请求方法PUT

提交数据如下。

{
    "data": "173128484686f2ad4157a6227b3dd1239d3e576294"
    "deviceId": "c098176e8baf1c06"
}

破解思路

软件上暂无,但是畅课提供了直播功能,可以直接获取直播流电脑路上的二维码图像完成签到。

数字点名

原理

教师输入一个4位数字,作为签到口令,学生在其客户端输入相同口令后完成签到。

技术细节

  • 后端接口https://course-online.chd.edu.cn/api/rollcall/{rollcall_id}/answer_number_rollcall
  • 请求方法PUT

提交数据如下。

{
    "deviceId": "c098176e8baf1c06",
    "numberCode": "1123"
}

破解思路

  1. 口令只有一万种可能,使用脚本多线程访问接口暴力猜解,但是不知道服务端是否有做接口限频与多次尝试失败后的风控措施,风控措施个人感觉大概率没有。但是考虑到畅课平台性能的拉胯,我们大概率不能在30秒内完成所有口令的穷举。
  2. 与二维码点名同样思路,在直播平台在线听课,即可获取口令签到。