微班微课平台刷课时工具编写思路。
课时数据列表获取
程序通过命令行接受五个必要参数:ck(cookie),token(x-Token),tid(tenantCode),uid(userId),pid(projectID)。
https://weiban.mycourse.cn/pharos/index/listCompletion.do?timestamp=
按照格式提交。返回的json中遍历数组data,取每个成员的categoryCode.
具体路径为data[i-1].categoryCode
,接着取每个分类中的课时列表。
https://weiban.mycourse.cn/pharos/usercourse/listCourse.do?timestamp=
form中只需要添加一个categoryCode,即上一步取到的数据。
主要逻辑
为了防止短时间多次访问导致封禁主机,以及重复刷已经完成的课时,可以缓存所有课程ID,每次用户选择一个CourseID进行处理。
课时完成后请求了四个接口如下。
[GET]
https://weiban.mycourse.cn/pharos/usercourse/v1/checkFinish.do?userCourseId=
https://weiban.mycourse.cn/pharos/resource/getNear.do?timestamp=
https://safety.mycourse.cn/brainprovider/router
https://weiban.mycourse.cn/pharos/usercourse/v1/{UnknownUUID}.do?callback={randomNUM}&t={timestamp}&userCourseId=&tenantCode=
测试访问了前两个接口,均返回正常,但是网页并未显示课时已完成,所以关键的不是这两个接口。
第三个接口特殊在子域名是safety
,返回数据如下。
{
"code": "0",
"data": {
"allAvgScore": 4.6,
"contentStarAvgNum": 4.6,
"feelStarAvgNum": 4.5,
"wholeStarAvgNum": 4.7
},
"detailCode": "0",
"message": "系统处理正常"
}
像是一个打分的接口,并且form中有一个targetID和签名。为了方便起见,先暂时看最后一个接口,若是不对,再通过JS解析这个接口的请求过程。
第四个接口提交的数据倒是简单,主要是url中有一个从未见过的UUID,不是uid,也不是courseID。一般这时候都会再看一个微课,同时抓包,看看两次请求的url是否相同。
这里第二次请求的url中UUID与第一次不同。为了搞清楚这个UUID是如何生成的,通过触发器找到创建此请求的JS文件。
onComment() {
const {
userCourseId,
tenantCode,
methodToken,
lyra,
userActivityId
} = this.$route.query;
// console.log(userCourseId, tenantCode, methodToken, weibanIs, lyra, csCom, userActivityId);
let finishWxUrl = '';
const webUrl = window.location.href;
if (webUrl.indexOf('test.mycourse.cn') > 0) {
if (lyra === 'lyra') {
finishWxUrl = 'https://test.mycourse.cn/lyraapi/study/course/finish.api';
} else {
finishWxUrl = `https://test.mycourse.cn/pharos/usercourse/v1/${methodToken}.do`;
}
} else {
finishWxUrl = `https://weiban.mycourse.cn/pharos/usercourse/v1/${methodToken}.do`;
}
if (lyra === 'lyra' && webUrl.indexOf('test.mycourse.cn') > 0) {
this.onPost(finishWxUrl, {
userActivityId
});
} else {
this.onPost(finishWxUrl, {
userCourseId,
tenantCode
});
}
},
onPost(finishWxUrl, finishData) {
axios({
method: 'GET',
url: finishWxUrl,
data: finishData,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
params: {
callback: Math.floor(Math.random() * 100000),
t: Date.parse(new Date()) / 1000,
...finishData
},
jsonp: true,
timeout: 30000
}).then((resp) => {
if (resp.data.code === '-1') {
Dialog.alert({
title: '',
message: '你已完成过该课程学习!'
}).then(() => {
this.isVerifyPopup = false;
});
} else {
this.isVerifyPopup = false;
}
}).catch((error) => {
console.log(error);
});
},
ok可以确定这个接口就是目标。methodToken从VUE的路由中提取,即QueryString。
这个参数来自微课链接,链接获取接口如下。
https://weiban.mycourse.cn/pharos/usercourse/getCourseUrl.do?timestamp=
到此万事具备,只需要简单写个逻辑即可。
如果成功,返回的json应该如图上所示,code不应该出现任何一个非0数字。
总结下来编写过程非常顺利,各个接口的请求过程清晰明了,特别是该平台完成微课后的verify验证码环节居然是本地处理的,使得我们可以直接绕过验证码。
源码下载
使用办法:修改autovk.bat内的参数,改成你自己的,双击运行即可。该程序不保证永久有效。
https://www.ideasky.top/#s/9j9mDvQQ
共有 2 条评论