超星学习通自动签到原理详解:技术与实践
近期在家无聊,又因为网课烦人,所以写了一系列网课相关的小工具,有兴趣的胖友可以多看看哦,这次先给大家带来超星学习通自动签到,再也不怕错过签到啦!
程序演示
这篇文章可以让你做出自己的自动签到小程序,我会尽力讲解详细的
如下图是完整的程序流程
打开抓包软件在登陆界面执行完整的登录流程即可获得所需的接口
创建二维码
https://passport2.chaoxing.com/createqr
获取扫描状态
https://passport2.chaoxing.com/getauthstatus
在签到过程中最基本的就是用户的Cookie,相当于用户的身份证,在最初写的python版本中,我直接将Cookie作为参数保存在代码中,缺点是Cookie需要自己抓包获取,比较麻烦。
为了方便使用,划分了一个登陆模块,可以使用账号和密码登录接口,也可以使用二维码登录,这里详细的说明一下二维码登录流程
- 生成uuid(通用唯一识别码),简单来说就是一串随机的字符串,网上有很多在线接口可以生成,也可以自己写程序实现
- createqr生成登录二维码
- 按固定间隔访问状态API即可获取二维码状态信息,状态分为【未登录】【已扫描】【取消扫描】【验证通过】【已过期】,每种状态都有自己ID,所以很好判断,当状态为【验证通过】的时候,在API的返回Cookie即为用户登录成功的Cookie,保存下来
- 在下次启动软件的时候读取Cookie,判断是否过期,若没有过期就进入主界面,否则重新登录
然后就是自动签到的流程了
这里用到的API是在APP下执行完整的签到流程获取的(因篇幅原因,参数都忽略)
获取课程列表
http://mooc-api.chaoxing.com/mycourse/backclazzdata
获取活动列表
https://mobilelearn.chaoxing.com/ppt/activeAPI/taskactivelist
签到
https://mobilelearn.chaoxing.com/pptSign/stuSignajax
【流程】
整体的流程简单的概括就是一个时钟,按一定频率获取课程下的活动列表,如果发现未签到的任务就执行签到
【信息模块】
在用户登录后,首先获取所有课程,由用户选定要监控的课程后,将课程的id传入到下一个模块,启动时钟开始获取活动列表,如果判断到typeid=2,状态id=1即为未签到活动,然后执行签到
【签到模块】
签到模块需要的参数有【activeId】【uid】,用户id在登录时可以获取,活动id在上面活动列表中间接获取,在活动列表中有一个key是活动的url,在url中即可看到【activeId】,分离出来即可作为参数
原理很简单,有兴趣大家也可以自己实现一下,如果大家想学习,我还是推荐看看python的代码,我会把用到的API和python代码打包发布,(python代码没有加登陆模块,有能力的的可以自己实现一下),以下是核心的代码
def taskactivelist(courseId,classId): global activeList url="https://mobilelearn.chaoxing.com/ppt/activeAPI/taskactivelist?courseId="+str(courseId)+"&classId="+str(classId)+"&uid="+uid res=requests.get(url,headers=headers) data=json.loads(res.text) activeList=data['activeList'] #print(activeList) for item in activeList: if("nameTwo" not in item): continue if(item['activeType']==2 and item['status']==1): signurl=item['url'] aid = getvar(signurl) if(aid not in activates): print("【签到】查询到待签到活动 活动名称:%s 活动状态:%s 活动时间:%s aid:%s"%(item['nameOne'],item['nameTwo'],item['nameFour'],aid)) sign(aid,uid) def sign(aid,uid): global status,activates url="https://mobilelearn.chaoxing.com/pptSign/stuSignajax?activeId="+aid+"&uid="+uid+"&clientip=&latitude=-1&longitude=-1&appType=15&fid=0" res=requests.get(url,headers=headers) if(res.text=="success"): print("用户:"+uid+" 签到成功!") activates.append(aid) status=2 else: print("签到失败") activates.append(aid)
理解清楚上述原理以后,不管使用什么语言相信都可以制作出自己的自动签到工具!
自力更生!不怕网课 哈哈哈
如果只是想用一下成品,那也是欢迎的啦
在公众号回复【学习通】即可获取
本站内容搜集自互联网,版权归原作者所有。如有侵权,请来信告知,我们将删除相关内容。