寺明/

微班微课平台刷课时工具编写思路

微班微课平台刷课时工具编写思路。

课时数据列表获取

程序通过命令行接受五个必要参数: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=

到此万事具备,只需要简单写个逻辑即可。

success

如果成功,返回的json应该如图上所示,code不应该出现任何一个非0数字。

总结下来编写过程非常顺利,各个接口的请求过程清晰明了,特别是该平台完成微课后的verify验证码环节居然是本地处理的,使得我们可以直接绕过验证码。

源码下载

使用办法:修改autovk.bat内的参数,改成你自己的,双击运行即可。该程序不保证永久有效。

https://www.ideasky.top/#s/9j9mDvQQ

留下一条评论

共有 2 条评论