Greasy Fork 支持简体中文。

太翼自动播放Plus

通过调用接口模拟学习过程

// ==UserScript==
// @name         太翼自动播放Plus
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  通过调用接口模拟学习过程
// @author       Driss_Angel
// @match        https://*.coolcollege.cn/*
// @grant        none
// @license MIT
// ==/UserScript==

let doclist = []
let param = {}

const start = () =>{
    parseHref()
    parseStorage()
    fetchList()
}

const parseHref = () => {
    const index = window.location.href.indexOf('#')
    const url = new URL(''.concat('https://pro.coolcollege.cn', window.location.href.substr(index+1)))
    param.studyId = url.searchParams.get('id')
    if(!param.studyId){
        return
    }
    param.studyType = url.searchParams.get('fromPage')
    if(!param.studyType){
        param.studyType = 'courseProject'
    }
}

const parseStorage = () => {
    param.uid = localStorage.getItem('uid')
    param.enterpriseId = localStorage.getItem('enterpriseId')
    param.token = localStorage.getItem('token')
}

const fetchList = () => {
    fetch(getUrl('list'), {
        method: 'get',
        headers: {
            'x-access-token': param.token
        }
    }).then((response) => response.json())
        .then((json) => {
        if(json.stages == null){
            return
        }
        for(var i = 0; i < json.stages.length; i++) {
            for(var j = 0; j < json.stages[i].resources.length; j++){
                var resource = json.stages[i].resources[j]
                doclist.push(resource)
            }
        }
        autoPlay()
    })
}

const getUrl = (urlType) => {
    if(urlType == 'records'){
        return ''.concat('https://grcoolapi.coolcollege.cn', '/knowledge-api/v2/').concat(param.enterpriseId, '/users/').concat(param.uid, '/study_records/save')
    }
    if(param.studyType == 'myObligatoryTask' || param.studyType == 'myElectiveTask' || param.studyType == 'myTestTask'){
        if(urlType == 'list'){
            return ''.concat('https://grcoolapi.coolcollege.cn', '/training-manage-api/v2/').concat(param.enterpriseId, '/users/').concat(param.uid, '/study_projects/').concat(param.studyId, '/query_fast')
        }
        if(urlType == 'progress'){
            return ''.concat('https://grcoolapi.coolcollege.cn', '/training-manage-api/v2/').concat(param.enterpriseId, '/users/').concat(param.uid, '/studies/').concat(param.studyId, '/courses/').concat(param.courseId, '/resources/').concat(param.courseId, '/save_progress')
        }
    }
    if(param.studyType == 'enterprise'){
        if(urlType == 'list'){
            return ''.concat('https://grcoolapi.coolcollege.cn', '/knowledge-api/v2/').concat(param.enterpriseId, '/users/').concat(param.uid, '/courses/').concat(param.courseId, '/query_fast')
        }
        if(urlType == 'progress'){
            return ''.concat('https://grcoolapi.coolcollege.cn', '/knowledge-api/v2/').concat(param.enterpriseId, '/users/').concat(param.uid, '/courses/').concat(param.courseId, '/resources/').concat(param.courseId, '/save_progress')
        }
    }
    if(param.studyType == 'courseProject'){
        if(urlType == 'list'){
            return ''.concat('https://grcoolapi.coolcollege.cn', '/training-manage-api/v2/').concat(param.enterpriseId, '/users/').concat(param.uid, '/study_projects/').concat(param.studyId, '/query_fast')
        }
        if(urlType == 'progress'){
            return ''.concat('https://grcoolapi.coolcollege.cn', '/training-manage-api/v2/').concat(param.enterpriseId, '/users/').concat(param.uid, '/study_projects/').concat(param.studyId, '/courses/').concat(param.courseId, '/resources/').concat(param.courseId, '/save_progress')
        }
    }
    if(param.studyType == 'platform' || param.studyType == 'purchased'){
        if(urlType == 'list'){
            return ''.concat('https://grcoolapi.coolcollege.cn', '/knowledge-api/v2/').concat(param.enterpriseId, '/users/').concat(param.uid, '/courses/').concat(param.courseId, '/query_fast')
        }
        if(urlType == 'progress'){
            return ''.concat('https://grcoolapi.coolcollege.cn', '/platform-api/v2/courses/').concat(param.courseId, '/resources/').concat(param.courseId, '/save_progress')
        }
    }
}

const sleep = (timeout) => {
    return new Promise(resolve => setTimeout(resolve, timeout))
}

async function autoPlay() {
    for(var i=0; i< doclist.length; i++){
        if(doclist[i].studyProgress < 100){
            doPlay(doclist[i])
            var leftTime = parseInt(doclist[i].duration) - parseInt(doclist[i].recent_start)
            await sleep(leftTime * 100)
        }
    }
}

async function doPlay(e) {
    var recentStart = parseInt(e.recent_start)
    var time = Date.parse(new Date)
    const duration = parseInt(e.duration)
    param.courseId = e.course_id
    for(recentStart; recentStart <= duration + 20; recentStart = recentStart+20) {
        var complete = (recentStart >= duration)

        await sleep(1000)

        fetch(getUrl('progress') , {
            method: 'post',
            headers: {
                'Content-Type': 'application/json',
                'x-access-token': param.token
            },
            body: JSON.stringify({
                'progress': complete ? 100 : parseInt(recentStart*100 / duration) ,
                'recent_start': recentStart ,
                'tempTime': time,
                'access_token': param.token
            })
        })

        await sleep(1000)

        fetch(getUrl('records'), {
            method: 'post',
            headers: {
                'Content-Type': 'application/json',
                'x-access-token': param.token
            },
            body: JSON.stringify({
                'action_type': 'study',
                'plan_id': param.studyId,
                'course_id':  param.courseId,
                'resource_id':  param.courseId,
                'plan_type': 'project',
                'access_token':param.token
            })
        })

        time = time + 20000
    }
    alert(e.resource_name + '已完成!')
}

start()