Greasy Fork

超星学习小助手 - 作业、考试、视频、章节测验全自动处理|高覆盖率题库|自助收录题库|一键复制题目

【🥇操作简单】超星学习小助手,无需任何配置,安装即可使用。【🔊功能齐全】支持视频、音频倍速秒过;文档、图书自动完成;字体解密;章节测验、课后作业、考试自动答题、自动提交、自动收录答案;支持自动切换任务点、自动登录等。【📔独家题库】独家丰富试题库,每日更新,精准识别,答案全对。【✨功能扩展】开放自定义参数,功能控制更简单

目前为 2023-12-03 提交的版本。查看 最新版本

// ==UserScript==
// @name                超星学习小助手 - 作业、考试、视频、章节测验全自动处理|高覆盖率题库|自助收录题库|一键复制题目
// @namespace           trprr
// @version             2.1.5
// @description         【🥇操作简单】超星学习小助手,无需任何配置,安装即可使用。【🔊功能齐全】支持视频、音频倍速秒过;文档、图书自动完成;字体解密;章节测验、课后作业、考试自动答题、自动提交、自动收录答案;支持自动切换任务点、自动登录等。【📔独家题库】独家丰富试题库,每日更新,精准识别,答案全对。【✨功能扩展】开放自定义参数,功能控制更简单
// @author              trprr
// @match               *://*.chaoxing.com/*
// @match               *://*.edu.cn/*
// @match               *://*.nbdlib.cn/*
// @match               *://*.hnsyu.net/*
// @match               *://*.qutjxjy.cn/*
// @match               *://*.ynny.cn/*
// @icon                data:image/x-icon;base64,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Mf8uLjH/Li4wxy4uMQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgAtLTF4LS0x/y4uMf8uLjH/Li4x/y4uMf8uLjH/LS0w7S0tMCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0wCi4uMccuLjH/Li4x/y4uMf8uLjH/Li4w/S4uMGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLTA0Li4x9S4uMf8uLjH/Li4x/y4uMaMuLjACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExAC0tMXYtLTDrLS0x7y0tMJ8tLTAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///4f/5//////gA//AD////gAB+4AAf//gAAEAAAAP/wAAAAAAAAH8AAAAAAAAAHwAAAAAAAAAOAAAAAAAAAA8AAAAAAAAADwAAAAAAAAAfgAAAAAAAAB/AAAAAAAAAP8AAAAAAAAB/4AAAAAAAAH/wAAAAAAAA//AAAAAAAAH/+AAAAAAAAf/8AAAAAAAD//wAAAAAAAf//gAAAAAAD///AAAAAAAP//8AAAAAAB///4AAAAAAP///wAAAAAA////gAAAAAH///+AAAAAA////8AAAAAD////wAAAAAf///+AAAAAA////wAAAAAB////AAAAAAD///+AAAAAAf///8AAAAAB////wAAAAAP////gAAAAB/////AAAAAH////8AAAAA/////4AAAAH/////wAAAAf/////AAAAD/////8AAAAf/////gAAAB/////+AAAAP/////4AAAB//////gAAAH//////AAAA//////8AAAH//////4AAAf//////wAAB///////AAAD//////+AAAP//////8AAB///////wAAH///////gAA////////AAH///////8AAf///////4AD////////wAf////////AB////////+AP////////8B/////////wP/////////g//////////H////8=
// @connect             api.lemtk.xyz
// @connect             api.985211.life
// @run-at              document-end
// @grant               unsafeWindow
// @grant               GM_xmlhttpRequest
// @grant               GM_setClipboard
// @grant               GM_setValue
// @grant               GM_getValue
// @grant               GM_info
// @grant               GM_getResourceText
// @require             https://greasyfork.org/scripts/474385/code/GF_ElementGetter.js?version=1244289
// @require             https://greasyfork.org/scripts/445293/code/TyprMd5.js
// @require             https://cdn.staticfile.org/limonte-sweetalert2/11.0.1/sweetalert2.all.min.js
// @require             https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js
// @resource            Table https://www.forestpolice.org/ttf/2.0/table.json
// @original-script     https://scriptcat.org/script-show-page/639
// @original-author     Ne-21
// @antifeature         ads
// @antifeature		    payment
// ==/UserScript==

/*********************************自定义配置区******************************************************** */
var setting = {
    showBox: 1,     // 显示脚本浮窗,0为关闭,1为开启,不建议关闭
    tiku: 1,        // 柠檬题库服务器切换,0为主线路,1为备用线路

    task: 0,        // 只处理任务点任务,0为关闭,1为开启

    video: 1,       // 处理视频,0为关闭,1为开启
    audio: 1,       // 处理音频,0为关闭,1为开启
    rate: 1,        // 视频/音频倍速,0为秒过,1为正常速率,最高16倍
    review: 0,      // 复习模式,0为关闭,1为开启可以补挂视频时长

    work: 1,        // 测验自动处理,0为关闭,1为开启,开启将会处理测验,关闭会跳过测验
    time: 5000,     // 答题时间间隔,默认5s=5000
    sub: 1,         // 测验自动提交,0为关闭,1为开启,当没答案时测验将不会提交,如需提交请设置force:1
    force: 0,       // 测验强制提交,0为关闭,1为开启,开启此功能将会强制提交测验(无论作答与否)
    share: 1,       // 自动收录答案,0为关闭,1为开启,推荐开启,会在相应页面自动收录答案
    decrypt: 1,     // 字体解密,0为关闭,1为开启,推荐开启,方法来自wyn665817大佬

    examTurn: 1,     // 考试自动跳转下一题,0为关闭,1为开启
    examTurnTime: 0, // 考试自动跳转下一题随机间隔时间(3-7s)之间,0为关闭,1为开启
    examAutoClick: 1,// 考试自动点击答案,0为关闭,1为开启

    autoLogin: 0,   // 自动登录,0为关闭,1为开启,开启此功能请配置登陆配置项
    phone: '',      // 登录配置项:登录手机号/超星号
    password: ''    // 登录配置项:登录密码
}

/*********************************以下内容非专业勿动***************************************************** */


var _w = unsafeWindow,
    _l = location,
    _d = _w.document,
    $ = _w.jQuery || top.jQuery,
    md5 = md5 || window.md5,
    UE = _w.UE,
    Swal = Swal || window.Swal,
    _host = ["https://api.lemtk.xyz","https://api.985211.life"][setting.tiku];

var _mlist, _defaults, _domList, $subBtn, $saveBtn, $frame_c;
var reportUrlChange = 0;

Object.defineProperty(setting, 'token', {
    get(){
        let sign = _w.localStorage.getItem('tksign')
        if (sign) {
            return sign.trim()
        }
        return ""
    },
    set(val) {
        _w.localStorage.setItem('tksign',val.trim())
    }
})

// Initialisation of question bank
GM_getValue("lemtkpro") == undefined ? GM_setValue("lemtkpro",1) : console.log("The question bank has been initialized.")


$(document).keydown(function (e) {
    if (e.keyCode == 75 && $('#ne-21notice')[0] != undefined) {
        let show = $('#ne-21box').css('display');
        $('#ne-21box').css('display', show == 'block' ? 'none' : 'block');
    }
})

$('.navshow').find('a:contains(体验新版)')[0] ? $('.navshow').find('a:contains(体验新版)')[0].click() : '';

setting.decrypt ? decryptFont() : '';

if (_l.hostname == 'i.mooc.chaoxing.com' || _l.hostname == "i.chaoxing.com") {
    showTips();
} else if (_l.pathname == '/login' && setting.autoLogin) {
    showBox()
    setTimeout(() => { autoLogin() }, 3000)
} else if (_l.pathname.includes('/mycourse/studentstudy')) {
    showBox();
    $('#ne-21log', window.parent.document).html('<hr />🎉🎉🎉脚本已加载,初始化完毕!🎉🎉🎉')
} else if (_l.pathname.includes('/knowledge/cards')) {
    if (top.location.href != GM_getValue('curUrl')) {
        GM_setValue('curUrl',top.location.href)
        setTimeout(()=>{
            top.location.replace(top.location.href)
        },1000)
        return
    }
    var params = getTaskParams()
    if (params == null || params == '$mArg' || $.parseJSON(params)['attachments'].length <= 0) {
        logger('无任务点可处理,即将跳转页面', 'red')
        toNext()
    } else {
        setTimeout(() => {
            top.checkJob ? top.checkJob = () => false : true
            _domList = []
            _mlist = $.parseJSON(params)['attachments']
            _defaults = $.parseJSON(params)['defaults']
            $.each($('.wrap .ans-cc .ans-attach-ct'), (i, t) => {
                _domList.push($(t).find('iframe'))
            })
            logger('共计'+_mlist.length+'个任务,即将开始逐个处理~', '#ed4845')
            missonStart()
        }, 3000)
    }
} else if (_l.pathname.includes('/exam/test/reVersionTestStartNew')) {
    showBox()
    setTimeout(() => { missonExam() }, 3000)
} else if (_l.pathname.includes('/exam/test/reVersionPaperMarkContentNew')) {
    setting.share && (() => {
        showBox()
        setTimeout(() => { uploadExam() }, 3000)
    })()
} else if (_l.pathname.includes('/mooc2/work/dowork')) {
    showBox()
    setTimeout(() => { missonHomeWork() }, 3000)
} else if (_l.pathname.includes('/mooc2/work/view')) {
    setting.share && (() => {
        showBox()
        setTimeout(() => { uploadHomeWork() }, 3000)
    })()
} else if (_l.pathname.includes('/work/phone/doHomeWork')) {
    _oldal = _w.alert
    _w.alert = function (msg) {
        if (msg == '保存成功') {
            return;
        }
        return _oldal(msg)
    }
    _w.workPop = function(content, okTent, okcallback, cancelCallback) {
        okcallback && okcallback();
    }
    _w.workPop2 = function(content, okTent, cancelTent, okcallback, cancelCallback) {
        okcallback && okcallback();
    }
    if (top.workPop2) {
        top.workPop2 = _w.workPop2
    }
} else if (_l.pathname.includes('/mooc2/exam/exam-list')) {
    Swal.fire('超星学习小助手提示', '注意:专业课可能会存在答案不全或无答案,请谨慎使用脚本考试,一切后果由您自己承担。', 'info')
} else if (_l.pathname.includes('/mycourse/studentcourse')) {
    Swal.fire('超星学习小助手提示', '注意:请勿在非正常学习时间段(凌晨、通宵)运行脚本,以免造成学习进度被重置。', 'info')
} else {
    // console.log(_l.pathname)
}

function http2https(url) {
    _url = url.replace(/^http:/, 'https:')
    return _url
}

function parseUrlParams() {
    let query = window.location.search.substring(1);
    let vars = query.split("&");
    let _p = {}
    for (let i = 0; i < vars.length; i++) {
        let pair = vars[i].split("=");
        _p[pair[0]] = pair[1]
    }
    return _p
}

function showTips() {
    var _msg = "题库官网:https://www.lemtk.xyz <br> <span style='color: red;'>题库为第三方题库,与本脚本无任何关系,有能力者可自行更换。</span> <br> 脚本失效问题请直接GreasyFork私信或油猴中文网私信。<br> 脚本基于Ne-21修改且供自己使用,感谢Ne-21大佬的源码!";
    Swal.fire('TIPS', _msg, 'info');
}



function showBox() {
    if (setting.showBox && top.document.querySelector('#ne-21notice') == undefined) {
        var box_html = `<div style="font-family: fangsong;font-weight: bold;"><div id="ne-21box" style="border: 2px dashed rgb(0, 85, 68); width: 330px; position: fixed; top: 5%; right: 20%; z-index: 99999; background-color: rgba(184, 247, 255, 0.5); overflow-x: auto;">
        <div style="display: flex;justify-content: space-between;margin: 0 5%;" title="按k键即可恢复面板"><h3 style="text-align: center;">超星学习小助手v`+GM_info['script']['version']+`</h3><h3 id="ne-21close" style="color: red;">[关闭面板]</h3></div>
        <div id="ne-21notice" style="border-top: 1px solid #000;border-bottom: 1px solid #000;margin: 4px 0px;overflow: hidden;"></div>
        <div style-"display: flex;"><div style="display: flex;padding: 2px 5px;">柠檬题库Token:<input type="password" id="lemtktoken" placeholder="请输入Token" /><button style="width: 15%;" id="lemtkcopy">复制</button></div><div style="display: flex;justify-content: center;"><button id="lemtkpro">开启/关闭高级搜索</button>|<button id="lemtkbtn">保存Token</button>|<button id="lemtksq">获取/重置Token</button></div></div>
        <div id="ne-21log" style="max-height:200px;"></div>
    </div></div>`;
        $(box_html).appendTo('body');
        $('#ne-21close').click(function () {
            let show = $('#ne-21box').css('display');
            $('#ne-21box').css('display', show == 'block' ? 'none' : 'block');
        })
        $(`<div>
            <p style="text-align: center;">
            <a href="https://www.bilibili.com/video/BV1t14y1a7gn" target="_blank" style="color: #9118d9;">如何自动收录答案到题库?点击查看</a>
            </p>
            <hr />
            <p style="text-align: center;">
            💡脚本本身不收取任何费用,但由于使用第三方题库,其可能涉及到付费(个人感觉此题库覆盖率、正确率均可,推荐使用),故有能力的同学可自行更改对接其他题库(例如:Icodef题库)。
            </p>
        </div>`).appendTo('#ne-21notice')
        $("#lemtkbtn").click(function(){
            setting.token = $("#lemtktoken").val()
            logger("保存成功!","green")
        })
        $("#lemtksq").click(function(){
            window.open("https://www.lemtk.xyz/#/login","_blank")
        })
        $("#lemtkpro").click(function(){
            if (GM_getValue("lemtkpro")) {
                GM_setValue("lemtkpro",0)
                logger("已关闭高级搜索功能!","red")
            } else {
                GM_setValue("lemtkpro",1)
                logger("已开启高级搜索功能!查题需消耗更多调用点数。","red")
            }
        })
        $("#lemtkcopy").click(function(){
            GM_setClipboard($("#lemtktoken").val())
            logger("已复制Token到剪贴板!","green")
        })
    } else {
        $('#ne-21log', window.parent.document).html('')
    }

    $("#lemtktoken").val(setting.token)
}

function logger(str, color) {
    let logSelector = $('#ne-21log', window.parent.document)
    let _time = new Date().toLocaleTimeString()
    $('<hr /><p style="color: ' + color + ';">[' + _time + ']' + str + '</p>').prependTo(logSelector).on("click", function () {
        GM_setClipboard(getStr($(this).html(), "题目:", "<br>----&gt;"))
        Swal.fire({
            text: '已复制',
            position: 'top-end',
            width: 150,
            timer: 1500,
            showConfirmButton: false,
        })
    })
}

function getStr(str, start, end) {
    let res = str.match(new RegExp(`${start}(.*?)${end}`))
    return res ? res[1] : null
}

function getTaskParams() {
    try {
        var _iframeScripts = _d.scripts,
            _p = null;
        for (let i = 0; i < _iframeScripts.length; i++) {
            if (_iframeScripts[i].innerHTML.indexOf('mArg = "";') != -1 && _iframeScripts[i].innerHTML.indexOf('==UserScript==') == -1) {
                _p = getStr(_iframeScripts[i].innerHTML.replace(/\s/g, ""), 'try{mArg=', ';}catch');
                return _p
            }
        }
        return _p
    } catch (e) {
        return null
    }

}

function getCk(name) {
    return document.cookie.match(`[;\s+]?${name}=([^;]*)`)?.pop();
}


function autoLogin() {
    logger('用户已设置自动登录', 'green')
    if (setting.phone.length <= 0 || setting.password.length <= 0) {
        logger('用户未设置登录信息', 'red')
        return
    }
    setTimeout(() => {
        $('#phone').val(setting.phone)
        $('#pwd').val(setting.password)
        $('#loginBtn').click()
    }, 3000)
}

function toNext() {
    refreshCourseList().then((res) => {
        if (setting.review || !setting.work) {
            setTimeout(() => {
                $('#ne-21log', window.parent.document).html('')
                if (top.document.querySelector('#mainid > .prev_next.next') == undefined) {
                    top.document.querySelector('#prevNextFocusNext').click();
                    return
                }
                top.document.querySelector('#mainid > .prev_next.next').click();
            }, 5000)
            return
        }
        let _t = []
        $.each($(res).find('li'), (_, t) => {
            let curid = $(t).find('.posCatalog_select').attr('id'),
                status = $(t).find('.prevHoverTips').text(),
                name = $(t).find('.posCatalog_name').attr('title');
            if (curid.indexOf('cur') != -1) {
                _t.push({ 'curid': curid, 'status': status, 'name': name })
            }
        })

        let _curChaterId = $('#coursetree', window.parent.document).find('.posCatalog_active').attr('id')
        let _curIndex = _t.findIndex((item) => item['curid'] == _curChaterId)
        for (_curIndex; _curIndex < _t.length - 1; _curIndex++) {
            if (_t[_curIndex]['status'].indexOf('待完成') != -1) {
                let c_tabs = top.document.querySelectorAll('#prev_tab li')
                let c_active_tab = top.document.querySelector('#prev_tab li.active')
                if (c_tabs && c_active_tab) {
                    let c_active_tab_id = c_active_tab.getAttribute("id").replace(/dct/,'')
                    if (c_active_tab_id != c_tabs.length) {
                        setTimeout(() => {
                            $('#ne-21log', window.parent.document).html('')
                            if (top.document.querySelector('#mainid > .prev_next.next') == undefined) {
                                top.document.querySelector('#prevNextFocusNext').click();
                                return
                            }
                            top.document.querySelector('#mainid > .prev_next.next').click();
                        }, 5000)
                        return
                    }
                }
            }
            let t = _t[_curIndex + 1]
            if (t['status'].indexOf('待完成') != -1) {
                setTimeout(() => {
                    $('#ne-21log', window.parent.document).html('')
                    if (top.document.querySelector('#mainid > .prev_next.next') == undefined) {
                        top.document.querySelector('#prevNextFocusNext').click();
                        return
                    }
                    top.document.querySelector('#mainid > .prev_next.next').click();
                    showBox()
                }, 5000)
                return
            } else if (t['status'].indexOf('闯关') != -1) {
                logger('当前为闯关模式,存在未完成任务点,脚本已暂停运行,请手动完成并点击下一章节', 'red')
                return
            } else if (t['status'].indexOf('开放') != -1) {
                logger('章节未开放', 'red')
                return
            } else {
                //  console.log(t)
            }
        }
        logger('此课程处理完毕', 'green')
        return
    })
}

function missonStart() {
    if (_mlist.length <= 0) {
        logger('此页面任务处理完毕,准备跳转页面', 'green')
        return toNext()
    }
    let _type = _mlist[0]['type'],
        _dom = _domList[0],
        _task = _mlist[0];
    if (_type == undefined) {
        _type = _mlist[0]['property']["module"]
    }
    switch (_type) {
        case "video":
            if (_mlist[0]['property']['module'] == 'insertvideo') {
                logger('开始处理视频', 'purple')
                missonVideo(_dom, _task)
                break
            } else if (_mlist[0]['property']['module'] == 'insertaudio') {
                logger('开始处理音频', 'purple')
                missonAudio(_dom, _task)
                break
            } else {
                logger('未知类型任务,请联系作者,跳过', 'red')
                switchMission()
                break
            }
        case "workid":
            logger('开始处理测验', 'purple')
            missonWork(_dom, _task)
            break
        case "document":
            logger('开始处理文档', 'purple')
            missonDoucument(_dom, _task)
            break
        case "read":
            logger('开始处理阅读', 'purple')
            missonRead(_dom, _task)
            break
        case "insertbook":
            logger('开始处理读书', 'purple')
            missonBook(_dom, _task)
            break
        default:
            let GarbageTasks = ['insertimage']
            if (GarbageTasks.indexOf(_type) != -1) {
                logger('发现无需处理任务,跳过。', 'red')
                switchMission()
            } else {
                logger('暂不支持处理此类型:' + _type + ',跳过。', 'red')
                switchMission()
            }

    }
}


function missonAudio(dom, obj) {
    if (!setting.audio) {
        logger('用户设置不处理音频任务,准备开始下一个任务。', 'red')
        setTimeout(() => { switchMission() }, 3000)
        return
    }
    let isDo;
    if (setting.task) {
        logger("当前只处理任务点任务", 'red')
        if (obj['jobid'] == undefined ? false : true) {
            isDo = true
        } else {
            isDo = false
        }
    } else {
        logger("当前默认处理所有任务(包括非任务点任务)", 'red')
        isDo = true
    }
    if (isDo) {
        let classId = _defaults['clazzId'],
            userId = _defaults['userid'],
            fid = _defaults['fid'],
            reportUrl = _defaults['reportUrl'],
            isPassed = obj['isPassed'],
            otherInfo = obj['otherInfo'],
            jobId = obj['property']['_jobid'],
            name = obj['property']['name'],
            objectId = obj['property']['objectid'];
        if (!setting.review && isPassed == true) {
            logger('音频:' + name + '检测已完成,准备处理下一个任务', 'green')
            switchMission()
            return
        } else if (setting.review) {
            logger('已开启复习模式,开始处理音频:' + name, 'pink')
        }
        $.ajax({
            url: _l.protocol + '//' + _l.host + "/ananas/status/" + objectId + '?k=' + fid + '&flag=normal&_dc=' + String(Math.round(new Date())),
            type: "GET",
            success: function (res) {
                try {
                    let duration = res['duration'],
                        dtoken = res['dtoken'],
                        clipTime = '0_' + duration,
                        playingTime = 0,
                        isdrag = 3;
                    var _rt = 0.9;
                    if (setting.rate == 0) {
                        logger('已开启音频秒过,99.9%会导致进度重置、挂科等问题。', 'red')
                        logger('已开启音频秒过,请等待5秒!!!', 'red')
                    } else if (setting.rate > 1 && setting.rate <= 16) {
                        logger('已开启音频倍速,当前倍速:' + setting.rate + ',99.9%会导致进度重置、挂科等问题。', 'red')
                        logger('已开启音频倍速,进度40秒更新一次,请等待!', 'red')
                    } else if (setting.rate > 16) {
                        setting.rate = 1
                        logger('超过允许设置的最大倍数,已重置为1倍速。', 'red')
                    } else {
                        logger("音频进度每隔40秒更新一次,请等待耐心等待...", 'blue')
                    }
                    logger("音频:" + name + "开始播放")
                    updateAudio(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt).then((status) => {
                        switch (status) {
                            case 1:
                                logger("音频:" + name + "已播放" + String((playingTime / duration) * 100).slice(0, 4) + '%', 'purple')
                                isdrag = 0
                                break
                            case 3:
                                _rt = 1
                                break
                            default:
                                console.log(status)
                        }
                    })
                    let _loop = setInterval(() => {
                        playingTime += 40 * setting.rate
                        if (playingTime >= duration || setting.rate == 0) {
                            clearInterval(_loop)
                            playingTime = duration
                            isdrag = 4
                        } else if (rt = 1 && playingTime == 40 * setting.rate) {
                            isdrag = 3
                        } else {
                            isdrag = 0
                        }
                        updateAudio(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt).then((status) => {
                            switch (status) {
                                case 0:
                                    playingTime -= 40
                                    break
                                case 1:
                                    logger("音频:" + name + "已播放" + String((playingTime / duration) * 100).slice(0, 4) + '%', 'purple')
                                    break
                                case 2:
                                    clearInterval(_loop)
                                    logger("音频:" + name + "检测播放完毕,准备处理下一个任务。", 'green')
                                    switchMission()
                                    break
                                case 3:
                                    playingTime -= 40
                                    _rt = Number(_rt) == 1 ? 0.9 : 1
                                    break
                                default:
                                    console.log(status)
                            }
                        })
                    }, setting.rate == 0 ? 5000 : 40000)
                } catch (e) {
                    logger('发生错误:' + e, 'red')
                }
            }
        });
    } else {
        logger('用户设置只处理属于任务点的任务,准备处理下一个任务', 'green')
        switchMission()
        return
    }
}

function missonVideo(dom, obj) {
    if (!setting.video) {
        logger('用户设置不处理视频任务,准备开始下一个任务。', 'red')
        setTimeout(() => { switchMission() }, 3000)
        return
    }
    let isDo;
    if (setting.task) {
        logger("当前只处理任务点任务", 'red')
        if (obj['jobid'] == undefined ? false : true) {
            isDo = true
        } else {
            isDo = false
        }
    } else {
        logger("当前默认处理所有任务(包括非任务点任务)", 'red')
        isDo = true
    }
    if (isDo) {
        let classId = _defaults['clazzId'],
            userId = _defaults['userid'],
            fid = _defaults['fid'],
            reportUrl = _defaults['reportUrl'],
            isPassed = obj['isPassed'],
            otherInfo = obj['otherInfo'],
            jobId = obj['property']['_jobid'],
            name = obj['property']['name'],
            objectId = obj['property']['objectid'];
        if (!setting.review && isPassed == true) {
            logger('视频:' + name + '检测已完成,准备处理下一个任务', 'green')
            switchMission()
            return
        } else if (setting.review) {
            logger('已开启复习模式,开始处理视频:' + name, 'pink')
        }
        $.ajax({
            url: _l.protocol + '//' + _l.host + "/ananas/status/" + objectId + '?k=' + fid + '&flag=normal&_dc=' + String(Math.round(new Date())),
            type: "GET",
            success: function (res) {
                try {
                    let duration = res['duration'],
                        dtoken = res['dtoken'],
                        clipTime = '0_' + duration,
                        playingTime = 0,
                        isdrag = 3;
                    var _rt = 0.9;
                    if (setting.rate == 0) {
                        logger('已开启视频秒过,99.9%会导致进度重置、挂科等问题。', 'red')
                        logger('已开启视频秒过,请等待5秒!!!', 'red')
                    } else if (setting.rate > 1 && setting.rate <= 16) {
                        logger('已开启视频倍速,当前倍速:' + setting.rate + ',99.9%会导致进度重置、挂科等问题。', 'red')
                        logger('已开启视频倍速,进度40秒更新一次,请等待!', 'red')
                    } else if (setting.rate > 16) {
                        setting.rate = 1
                        logger('超过允许设置的最大倍数,已重置为1倍速。', 'red')
                    } else {
                        logger("视频进度每隔40秒更新一次,请等待耐心等待...", 'blue')
                    }
                    logger("视频:" + name + "开始播放")
                    updateVideo(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt).then((status) => {
                        switch (status) {
                            case 1:
                                logger("视频:" + name + "已播放" + String((playingTime / duration) * 100).slice(0, 4) + '%', 'purple')
                                isdrag = 0
                                break
                            case 3:
                                _rt = 1
                                break
                            default:
                                console.log(status)
                        }
                    })
                    let _loop = setInterval(() => {
                        playingTime += 40 * setting.rate
                        if (playingTime >= duration || setting.rate == 0) {
                            clearInterval(_loop)
                            playingTime = duration
                            isdrag = 4
                        } else if (rt = 1 && playingTime == 40 * setting.rate) {
                            isdrag = 3
                        } else {
                            isdrag = 0
                        }
                        updateVideo(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt).then((status) => {
                            switch (status) {
                                case 0:
                                    playingTime -= 40
                                    break
                                case 1:
                                    logger("视频:" + name + "已播放" + String((playingTime / duration) * 100).slice(0, 4) + '%', 'purple')
                                    break
                                case 2:
                                    clearInterval(_loop)
                                    logger("视频:" + name + "检测播放完毕,准备处理下一个任务。", 'green')
                                    switchMission()
                                    break
                                case 3:
                                    playingTime -= 40
                                    _rt = Number(_rt) == 1 ? 0.9 : 1
                                    break
                                default:
                                    console.log(status)
                            }
                        })
                    }, setting.rate == 0 ? 5000 : 40000)
                } catch (e) {
                    logger('发生错误:' + e, 'red')
                }
            }
        });
    } else {
        logger('用户设置只处理属于任务点的任务,准备处理下一个任务', 'green')
        switchMission()
        return
    }
}

function missonBook(dom, obj) {
    if (setting.task) {
        if (obj['jobid'] == undefined) {
            logger("当前只处理任务点任务,跳过", 'red')
            switchMission()
            return
        }
    }
    let jobId = obj['property']['jobid'],
        name = obj['property']['bookname'],
        jtoken = obj['jtoken'],
        knowledgeId = _defaults['knowledgeid'],
        courseId = _defaults['courseid'],
        clazzId = _defaults['clazzId'];
    if (obj['job'] == undefined) {
        logger('读书:' + name + '检测已完成,准备执行下一个任务。', 'green')
        switchMission()
        return
    }
    $.ajax({
        url: _l.protocol + "//" + _l.host + '/ananas/job?jobid=' + jobId + '&knowledgeid=' + knowledgeId + '&courseid=' + courseId + '&clazzid=' + clazzId + '&jtoken=' + jtoken + '&_dc=' + String(Math.round(new Date())),
        method: 'GET',
        success: function (res) {
            if (res.status) {
                logger('读书:' + name + res.msg + ',准备执行下一个任务。', 'green')
            } else {
                logger('读书:' + name + '处理异常,跳过。', 'red')
            }
            switchMission()
            return
        },
    })
}

function missonLive(dom, obj) {

}

function missonDoucument(dom, obj) {
    if (setting.task) {
        if (obj['jobid'] == undefined) {
            logger("当前只处理任务点任务,跳过", 'red')
            switchMission()
            return
        }
    }
    let jobId = obj['property']['jobid'],
        name = obj['property']['name'],
        jtoken = obj['jtoken'],
        knowledgeId = _defaults['knowledgeid'],
        courseId = _defaults['courseid'],
        clazzId = _defaults['clazzId'];
    if (obj['job'] == undefined) {
        logger('文档:' + name + '检测已完成,准备执行下一个任务。', 'green')
        switchMission()
        return
    }
    $.ajax({
        url: _l.protocol + "//" + _l.host + '/ananas/job/document?jobid=' + jobId + '&knowledgeid=' + knowledgeId + '&courseid=' + courseId + '&clazzid=' + clazzId + '&jtoken=' + jtoken + '&_dc=' + String(Math.round(new Date())),
        method: 'GET',
        success: function (res) {
            if (res.status) {
                logger('文档:' + name + res.msg + ',准备执行下一个任务。', 'green')
            } else {
                logger('文档:' + name + '处理异常,跳过。', 'red')
            }
            switchMission()
            return
        },
    })

}

function missonRead(dom, obj) {
    if (setting.task) {
        if (obj['jobid'] == undefined) {
            logger("当前只处理任务点任务,跳过", 'red')
            switchMission()
            return
        }
    }
    let jobId = obj['property']['jobid'],
        name = obj['property']['title'],
        jtoken = obj['jtoken'],
        knowledgeId = _defaults['knowledgeid'],
        courseId = _defaults['courseid'],
        clazzId = _defaults['clazzId'];
    if (obj['job'] == undefined) {
        logger('阅读:' + name + ',检测已完成,准备执行下一个任务。', 'green')
        switchMission()
        return
    }
    $.ajax({
        url: _l.protocol + '//' + _l.host + '/ananas/job/readv2?jobid=' + jobId + '&knowledgeid=' + knowledgeId + '&courseid=' + courseId + '&clazzid=' + clazzId + '&jtoken=' + jtoken + '&_dc=' + String(Math.round(new Date())),
        method: 'GET',
        success: function (res) {
            if (res.status) {
                logger('阅读:' + name + res.msg + ',准备执行下一个任务。', 'green')
            } else {
                logger('阅读:' + name + '处理异常,跳过。', 'red')
            }
            switchMission()
            return
        }
    })
}

function missonWork(dom, obj) {
    if (!setting.work) {
        logger('用户设置不自动处理测验,准备处理下一个任务', 'green')
        switchMission()
        return
    }
    let isDo;
    if (setting.task) {
        logger("当前只处理任务点任务", 'red')
        if (obj['jobid'] == undefined ? false : true) {
            isDo = true
        } else {
            isDo = false
        }
    } else {
        logger("当前默认处理所有任务(包括非任务点任务)", 'red')
        isDo = true
    }
    if (isDo) {
        if (obj['jobid'] !== undefined) {
            var phoneWeb = _l.protocol + '//' + _l.host + '/work/phone/work?workId=' + obj['jobid'].replace('work-', '') + '&courseId=' + _defaults['courseid'] + '&clazzId=' + _defaults['clazzId'] + '&knowledgeId=' + _defaults['knowledgeid'] + '&jobId=' + obj['jobid'] + '&enc=' + obj['enc']
            // setTimeout(() => { startDoCyWork(0, dom) }, 3000)
            setTimeout(() => { startDoPhoneCyWork(0, dom, phoneWeb) }, 3000)
        } else {
            setTimeout(() => { startDoCyWork(0, dom) }, 3000)
        }
    // } else if (!GM_getValue('cando')) {
    //     logger('存在未完成任务点,脚本已暂停执行,请手动处理后刷新网页。', 'red')
    //     return
    } else {
        logger('用户设置只处理属于任务点的任务,准备处理下一个任务', 'green')
        switchMission()
        return
    }
}

function doPhoneWork($dom) {
    let $cy = $dom.find('.Wrappadding form')
    $subBtn = $cy.find('.zquestions .zsubmit .btn-ok-bottom')
    $saveBtn = $cy.find('.zquestions .zsubmit .btn-save')
    let TimuList = $cy.find('.zquestions .Py-mian1')
    startDoPhoneTimu(0, TimuList)
}

function startDoPhoneTimu(index, TimuList) {
    if (index == TimuList.length) {
        if (setting.sub) {
            logger('测验处理完成,准备自动提交。', 'green')
            setTimeout(() => {
                $subBtn.click()
                setTimeout(() => {
                    logger('提交成功,准备切换下一个任务。', 'green')
                    _mlist.splice(0, 1)
                    _domList.splice(0, 1)
                    setTimeout(() => { switchMission() }, 3000)
                }, 3000)
            }, 5000)
        } else if (setting.force) {
            logger('测验处理完成,存在无答案题目,由于用户设置了强制提交,准备自动提交。', 'red')
            setTimeout(() => {
                $subBtn.click()
                setTimeout(() => {
                    logger('提交成功,准备切换下一个任务。', 'green')
                    _mlist.splice(0, 1)
                    _domList.splice(0, 1)
                    setTimeout(() => { switchMission() }, 3000)
                }, 3000)
            }, 5000)
        } else {
            logger('测验处理完成,存在无答案题目或用户设置不自动提交,自动保存!', 'green')
            setTimeout(() => {
                $saveBtn.click()
                setTimeout(() => {
                    logger('保存成功,准备切换下一个任务。', 'green')
                    _mlist.splice(0, 1)
                    _domList.splice(0, 1)
                    setTimeout(() => { switchMission() }, 3000)
                }, 3000)
            }, 5000)
        }
        return
    }
    let questionFull = $(TimuList[index]).find('.Py-m1-title').html()
    let _question = tidyQuestion(questionFull).replace(/.*?\[.*?题\]\s*\n\s*/, '').trim()
    let _type = ({ 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4, 选择题: 5 })[questionFull.match(/.*?\[(.*?)]|$/)[1]]
    let _a = []
    let _answerTmpArr
    switch (_type) {
        case 0:
            getAnswer(_type, _question).then((agrs) => {
                _answerTmpArr = $(TimuList[index]).find('.answerList.singleChoice li')
                $.each(_answerTmpArr, (i, t) => {
                    _a.push(tidyStr($(t).html()).replace(/^[A-Z]\s*\n\s*/, '').trim())
                })
                let _i = _a.findIndex((item) => item == agrs)
                if (_i == -1) {
                    logger('未匹配到正确答案,跳过此题', 'red')
                    setting.sub = 0
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                } else {
                    $(_answerTmpArr[_i]).click()
                    logger('自动答题成功,准备切换下一题', 'green')
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                }
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                }
            })
            break
        case 1:
            getAnswer(_type, _question).then((agrs) => {
                if (agrs == '暂无答案') {
                    logger('未匹配到正确答案,跳过此题', 'red')
                    setting.sub = 0
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                } else {
                    _answerTmpArr = $(TimuList[index]).find('.answerList.multiChoice li')
                    $.each(_answerTmpArr, (i, t) => {
                        let _tt = tidyStr($(t).html()).replace(/^[A-Z]\s*\n\s*/, '').trim()
                        if (agrs.indexOf(_tt) != -1) {
                            setTimeout(() => { $(_answerTmpArr[i]).click() }, 300)
                        }
                    })
                    let check = 0
                    setTimeout(() => {
                        $.each(_answerTmpArr, (i, t) => {
                            if ($(t).attr('class').indexOf('cur') != -1) {
                                check = 1
                            }
                        })
                        if (check) {
                            logger('自动答题成功,准备切换下一题', 'green')
                        } else {
                            logger('未能正确选择答案,请手动选择,跳过此题', 'red')
                            setting.sub = 0
                        }
                        setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                    }, 1000)
                }
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                }
            })
            break
        case 2:
            getAnswer(_type, _question).then((agrs) => {
                if (agrs == '暂无答案') {
                    logger('未匹配到正确答案,跳过此题', 'red')
                    setting.sub = 0
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                    return
                }
                let answers = agrs.split('#')
                let tkList = $(TimuList[index]).find('.blankList2 input')
                $.each(tkList, (i, t) => {
                    setTimeout(() => { $(t).val(answers[i]) }, 200)
                })
                setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                }
            })
            break
        case 3:
            getAnswer(_type, _question).then((agrs) => {
                if (agrs == '暂无答案') {
                    logger('未匹配到正确答案,跳过此题', 'red')
                    setting.sub = 0
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                } else {
                    let _true = '正确|是|对|√|T|ri'
                    _answerTmpArr = $(TimuList[index]).find('.answerList.panduan li')
                    if (_true.indexOf(agrs) != -1) {
                        $.each(_answerTmpArr, (i, t) => {
                            if ($(t).attr('val-param') == 'true') {
                                $(t).click()
                            }
                        })
                    } else {
                        $.each(_answerTmpArr, (i, t) => {
                            if ($(t).attr('val-param') == 'false') {
                                $(t).click()
                            }
                        })
                    }
                    logger('自动答题成功,准备切换下一题', 'green')
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                }
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                }
            })
            break
        case 5:
            getAnswer(_type, _question).then((agrs) => {
                setting.sub = 0
                logger('此类型题目无法区分单/多选,请手动选择答案', 'red')
                setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
                }
            })
            break
        default:
            logger('暂不支持处理此类型题目:' + questionFull.match(/.*?\[(.*?)]|$/)[1] + ',跳过!请手动作答。', 'red')
            setting.sub = 0
            setTimeout(() => { startDoPhoneTimu(index + 1, TimuList) }, setting.time)
            break
    }
}

function startDoPhoneCyWork(index, doms, phoneWeb) {
    if (index == doms.length) {
        logger('此页面全部测验已处理完毕!准备进行下一项任务')
        setTimeout(missonStart, 5000)
        return
    }

    logger('等待测验框架加载...', 'purple')
    elmGetter.get('iframe',$(doms[index]).contents()[0]).then(element=>{
        let workIframe = element
        if (workIframe.length == 0) {
            setTimeout(() => { startDoPhoneCyWork(index, doms) }, 5000)
        }
        let workStatus = $(workIframe).contents().find('.newTestCon .newTestTitle .testTit_status').text().trim()

        if (!workStatus) {
            logger("获取测验状态失败,请联系作者修复!","red")
            _domList.splice(0, 1)
            setTimeout(missonStart, 2000)
            return
        }
        if (setting.share && workStatus.indexOf("已完成") != -1) {
            logger('测验:' + (index + 1) + ',检测到此测验已完成,准备收录答案。', 'green')
            setTimeout(() => { upLoadWork(index, doms, workIframe) }, 2000)
        } else if (workStatus.indexOf("待做") != -1 || workStatus.indexOf("待完成") != -1) {
            logger('测验:' + (index + 1) + ',准备处理此测验...', 'purple')
            $(workIframe).attr('src', phoneWeb)
            elmGetter.get('iframe[src="' + phoneWeb + '"]',$(doms[index]).contents()[0]).then((element)=>{
                setTimeout(() => { doPhoneWork($(element).contents()) }, 3000)
            })
        } else if (workStatus.indexOf('待批阅') != -1) {
            _mlist.splice(0, 1)
            _domList.splice(0, 1)
            logger('测验:' + (index + 1) + ',测验待批阅,跳过', 'red')
            setTimeout(() => { startDoPhoneCyWork(index + 1, doms, phoneWeb) }, 5000)
        } else {
            _mlist.splice(0, 1)
            _domList.splice(0, 1)
            logger('测验:' + (index + 1) + ',未知状态或用户选择不收录答案,跳过', 'red')
            setTimeout(() => { startDoPhoneCyWork(index + 1, doms, phoneWeb) }, 5000)
        }
    })
}

function startDoCyWork(index, doms) {
    if (index == doms.length) {
        logger('此页面全部测验已处理完毕!准备进行下一项任务')
        setTimeout(missonStart, 5000)
        return
    }
    logger('等待测验框架加载...', 'purple')
    elmGetter.get('iframe',$(doms[index]).contents()[0]).then(element=>{
        let workIframe = element
        if (workIframe.length == 0) {
            setTimeout(() => { startDoCyWork(index, doms) }, 5000)
        }
        let workStatus = $(workIframe).contents().find('.newTestCon .newTestTitle .testTit_status').text().trim()
        if (!workStatus) {
            logger("获取测验状态失败,请联系作者修复!","red")
            _domList.splice(0, 1)
            setTimeout(missonStart, 2000)
            return
        }
        if (setting.share && workStatus.indexOf("已完成") != -1) {
            logger('测验:' + (index + 1) + ',检测到此测验已完成,准备收录答案。', 'green')
            setTimeout(() => { upLoadWork(index, doms, workIframe) }, 2000)
        } else if (workStatus.indexOf("待做") != -1 || workStatus.indexOf("待完成") != -1) {
            logger('测验:' + (index + 1) + ',准备处理此测验...', 'purple')
            setTimeout(() => { doWork(index, doms, workIframe) }, 5000)
        } else if (workStatus.indexOf('待批阅') != -1) {
            _mlist.splice(0, 1)
            _domList.splice(0, 1)
            logger('测验:' + (index + 1) + ',测验待批阅,跳过', 'red')
            setTimeout(() => { startDoCyWork(index + 1, doms) }, 5000)
        } else {
            _mlist.splice(0, 1)
            _domList.splice(0, 1)
            logger('测验:' + (index + 1) + ',未知状态或用户选择不收录答案,跳过', 'red')
            setTimeout(() => { startDoCyWork(index + 1, doms) }, 5000)
        }
    })
}


function missonHomeWork() {
    logger('开始处理作业', 'green')
    let $_homeworktable = $('.mark_table').find('form')
    let TimuList = $_homeworktable.find('.questionLi')
    doHomeWork(0, TimuList)
}

function doHomeWork(index, TiMuList) {
    if (index == TiMuList.length) {
        logger('作业题目已全部完成', 'green')
        return
    }
    let _type = ({ 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 })[$(TiMuList[index]).attr('typename')]
    let _questionFull = $(TiMuList[index]).find('.mark_name').html()
    let _question = tidyQuestion(_questionFull).replace(/^[(].*?[)]/, '').trim()
    let _a = []
    let _answerTmpArr, _textareaList
    switch (_type) {
        case 0:
            _answerTmpArr = $(TiMuList[index]).find('.stem_answer').find('.answer_p')
            getAnswer(_type, _question).then((agrs) => {
                $.each(_answerTmpArr, (i, t) => {
                    _a.push(tidyStr($(t).html()))
                })
                let _i = _a.findIndex((item) => item == agrs)
                if (_i == -1) {
                    logger('未匹配到正确答案,跳过此题', 'red')
                    setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
                } else {
                    setTimeout(() => {
                        let check = $(_answerTmpArr[_i]).parent().find('span').attr('class')
                        if (check.indexOf('check_answer') == -1) {
                            $(_answerTmpArr[_i]).parent().click()
                        }
                        logger('自动答题成功,准备切换下一题', 'green')
                        setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
                    }, 300)
                }
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
                }
            })
            break
        case 1:
            _answerTmpArr = $(TiMuList[index]).find('.stem_answer').find('.answer_p')
            getAnswer(_type, _question).then((agrs) => {
                $.each(_answerTmpArr, (i, t) => {
                    if (agrs.indexOf(tidyStr($(t).html())) != -1) {
                        setTimeout(() => {
                            let check = $(_answerTmpArr[i]).parent().find('span').attr('class')
                            if (check.indexOf('check_answer_dx') == -1) {
                                $(_answerTmpArr[i]).parent().click()
                            }
                        }, 300)
                    }
                })
                logger('自动答题成功,准备切换下一题', 'green')
                setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
                }
            })
            break
        case 2:
            _textareaList = $(TiMuList[index]).find('.stem_answer').find('.Answer .divText .textDIV textarea')
            getAnswer(_type, _question).then((agrs) => {
                let _answerTmpArr = agrs.split('#')
                $.each(_textareaList, (i, t) => {
                    let _id = $(t).attr('id')
                    setTimeout(() => { UE.getEditor(_id).setContent(_answerTmpArr[i]) }, 300)
                })
                logger('自动答题成功,准备切换下一题', 'green')
                setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
                }
            })
            break
        case 3:
            let _true = '正确|是|对|√|T|ri'
            let _false = '错误|否|错|×|F|wr'
            let _i = 0
            _answerTmpArr = $(TiMuList[index]).find('.stem_answer').find('.answer_p')
            $.each(_answerTmpArr, (i, t) => {
                _a.push($(t).text().trim())
            })
            getAnswer(_type, _question).then((agrs) => {
                if (_true.indexOf(agrs) != -1) {
                    _i = _a.findIndex((item) => _true.indexOf(item) != -1)
                } else if (_false.indexOf(agrs) != -1) {
                    _i = _a.findIndex((item) => _false.indexOf(item) != -1)
                } else {
                    logger('答案匹配出错,准备切换下一题', 'green')
                    setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
                    return
                }
                setTimeout(() => {
                    let check = $(_answerTmpArr[_i]).parent().find('span').attr('class')
                    if (check.indexOf('check_answer') == -1) {
                        $(_answerTmpArr[_i]).parent().click()
                    }
                }, 300)
                logger('自动答题成功,准备切换下一题', 'green')
                setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
                }
            })
            break
        case 4:
            _textareaList = $(TiMuList[index]).find('.stem_answer').find('.eidtDiv textarea')
            getAnswer(_type, _question).then((agrs) => {
                $.each(_textareaList, (i, t) => {
                    let _id = $(t).attr('id')
                    setTimeout(() => { UE.getEditor(_id).setContent(agrs) }, 300)
                })
                logger('自动答题成功,准备切换下一题', 'green')
                setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
                }
            })
            break
        default:
            logger('暂不支持处理此题型:' + $(TiMuList[index]).attr('typename') + ',跳过。', 'red')
            setTimeout(() => { doHomeWork(index + 1, TiMuList) }, setting.time)
    }
}

function missonExam() {
    let $_examtable = $('.mark_table').find('.whiteDiv')
    let _questionFull = tidyStr($_examtable.find('h3.mark_name').html().trim())
    let _qType = ({ 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3 })[_questionFull.match(/[(](.*?),.*?分[)]|$/)[1]]
    let _question = tidyQuestion(_questionFull.replace(/[(].*?分[)]/, '').replace(/^\s*/, ''))
    let $_ansdom = $_examtable.find('#submitTest').find('.stem_answer')
    let _answerTmpArr;
    let _a = []
    switch (_qType) {
        case 0:
            _answerTmpArr = $_ansdom.find('.clearfix.answerBg .fl.answer_p')
            getAnswer(_qType, _question).then((agrs) => {
                $.each(_answerTmpArr, (i, t) => {
                    _a.push(tidyStr($(t).html()))
                })
                let _i = _a.findIndex((item) => item == agrs)
                if (_i == -1) {
                    logger('未匹配到正确答案,跳过此题', 'red')
                    setTimeout(toNextExam, 5000)
                } else {
                    setTimeout(() => {
                        if ($(_answerTmpArr[_i]).parent().find('span').attr('class').indexOf('check_answer') == -1) {
                            $(_answerTmpArr[_i]).parent().click()
                            logger('自动答题成功,准备切换下一题', 'green')
                            toNextExam()
                        } else {
                            logger('此题已作答,准备切换下一题', 'green')
                            toNextExam()
                        }
                    }, 300)
                }
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    toNextExam()
                }
            })
            break
        case 1:
            _answerTmpArr = $_ansdom.find('.clearfix.answerBg .fl.answer_p')
            getAnswer(_qType, _question).then((agrs) => {
                if ($_ansdom.find('.clearfix.answerBg span.check_answer_dx').length > 0) {
                    logger('此题已作答,准备切换下一题', 'green')
                    toNextExam()
                } else {
                    $.each(_answerTmpArr, (i, t) => {
                        if (agrs.indexOf(tidyStr($(t).html())) != -1) {
                            setTimeout(() => { $(_answerTmpArr[i]).parent().click() }, 300)
                        }
                    })
                    logger('自动答题成功,准备切换下一题', 'green')
                    toNextExam()
                }
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    toNextExam()
                }
            })
            break
        case 2:
            let _textareaList = $_ansdom.find('.Answer .divText .subEditor textarea')
            getAnswer(_qType, _question).then((agrs) => {
                let _answerTmpArr = agrs.split('#')
                $.each(_textareaList, (i, t) => {
                    let _id = $(t).attr('id')
                    setTimeout(() => { UE.getEditor(_id).setContent(_answerTmpArr[i]) }, 300)
                })
                logger('自动答题成功,准备切换下一题', 'green')
                toNextExam()
            }).catch((agrs) => {
                if (agrs['c'] = 0) {
                    toNextExam()
                }
            })
            break
        case 3:
            let _true = '正确|是|对|√|T|ri'
            let _false = '错误|否|错|×|F|wr'
            let _i = 0
            _answerTmpArr = $_ansdom.find('.clearfix.answerBg .fl.answer_p')
            $.each(_answerTmpArr, (i, t) => {
                _a.push($(t).text().trim())
            })
            getAnswer(_qType, _question).then((agrs) => {
                if (_true.indexOf(agrs) != -1) {
                    _i = _a.findIndex((item) => _true.indexOf(item) != -1)
                } else if (_false.indexOf(agrs) != -1) {
                    _i = _a.findIndex((item) => _false.indexOf(item) != -1)
                } else {
                    logger('答案匹配出错,准备切换下一题', 'green')
                    toNextExam()
                    return
                }
                if ($(_answerTmpArr[_i]).parent().find('span').attr('class').indexOf('check_answer') == -1) {
                    setTimeout(() => { $(_answerTmpArr[_i]).parent().click() }, 300)
                    logger('自动答题成功,准备切换下一题', 'green')
                    toNextExam()
                } else {
                    logger('此题已作答,准备切换下一题', 'green')
                    toNextExam()
                }
            }).catch((agrs) => {
                if (agrs['c'] == 0) {
                    toNextExam()
                }
            })
            break
        default:
            break
    }
}

function toNextExam() {
    if (setting.examTurn) {
        let $_examtable = $('.mark_table').find('.whiteDiv')
        let $nextbtn = $_examtable.find('.nextDiv a.jb_btn')
        setTimeout(() => {
            $nextbtn.click()
        }, setting.examTurnTime ? 2000 + (Math.floor(Math.random() * 5 + 1) * 1000) : 2000)
    } else {
        logger('用户设置不自动跳转下一题,请手动点击', 'blue')
    }
}

function uploadExam() {
    logger('考试答案收录功能处于bate阶段,遇到bug请及时反馈!!', 'red')
    logger('开始收录考试答案', 'green')
    let TimuList = $('.mark_table .mark_item .questionLi')
    let data = []
    $.each(TimuList, (i, t) => {
        let _a = {}
        let _answer
        let _answerTmpArr, _answerList = []
        let TiMuFull = tidyQuestion($(t).find('h3').html())
        let _type = ({ 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 })[TiMuFull.match(/[(](.*?)[)]|$/)[1].replace(/,.*?分/, '')]
        let _question = TiMuFull.replace(/^[(].*?[)]|$/, '').trim()
        let _rightAns = $(t).find('.mark_answer').find('.colorGreen').text().replace(/正确答案[::]/, '').trim()
        switch (_type) {
            case 0:
                if (_rightAns.length <= 0) {
                    _isTrue = $(t).find('.mark_answer').find('.mark_score span').attr('class')
                    _isZero = $(t).find('.mark_answer').find('.mark_score .totalScore.fr i').text()
                    if (_isTrue == 'marking_dui' || _isZero != '0') {
                        _rightAns = $(t).find('.mark_answer').find('.colorDeep').text().replace(/我的答案[::]/, '').trim()
                    } else {
                        break
                    }
                }
                _answerTmpArr = $(t).find('.mark_letter li')
                $.each(_answerTmpArr, (a, b) => {
                    _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, ''))
                })
                let _i = ({ A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 })[_rightAns]
                _answer = _answerList[_i]
                _a['question'] = _question
                _a['type'] = _type
                _a['answer'] = _answer
                data.push(_a)
                break
            case 1:
                _answer = []
                if (_rightAns.length <= 0) {
                    _isTrue = $(t).find('.mark_answer').find('.mark_score span').attr('class')
                    _isZero = $(t).find('.mark_answer').find('.mark_score .totalScore.fr i').text()
                    if (_isTrue == 'marking_dui' || _isTrue == 'marking_bandui' || _isZero != '0') {
                        _rightAns = $(t).find('.mark_answer').find('.colorDeep').text().replace(/我的答案[::]/, '').trim()
                    } else {
                        break
                    }
                }
                _answerTmpArr = $(t).find('.mark_letter li')
                $.each(_answerTmpArr, (a, b) => {
                    _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, ''))
                })
                $.each(_rightAns.split(''), (c, d) => {
                    let _i = ({ A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 })[d]
                    _answer.push(_answerList[_i])
                })
                _a['question'] = _question
                _a['type'] = _type
                _a['answer'] = _answer.join("#")
                data.push(_a)
                break
            case 2:
                _answerTmpArr = []
                let answers = $(t).find('.mark_answer').find('.colorDeep').find('dd')
                if (_rightAns.length <= 0) {
                    $.each(answers, (i, t) => {
                        _isTrue = $(t).find('span:eq(1)').attr('class')
                        if (_isTrue == 'marking_dui') {
                            _rightAns = $(t).find('span:eq(0)').html()
                            _answerTmpArr.push(_rightAns.replace(/[(][0-9].*?[)]/, '').replace(/第.*?空:/, '').trim())
                        } else {
                            return
                        }
                    })
                    _answer = _answerTmpArr.join('#')
                } else {
                    _answer = _rightAns.replace(/\s/g, '').replace(/[(][0-9].*?[)]/g, '#').replace(/第.*?空:/g, '#').replace(/^#*/, '')
                }
                if (_answer.length != 0) {
                    _a['question'] = _question
                    _a['type'] = _type
                    _a['answer'] = _answer
                    data.push(_a)
                }
                break
            case 3:
                if (_rightAns.length <= 0) {
                    _isTrue = $(t).find('.mark_answer').find('.mark_score span').attr('class')
                    _isZero = $(t).find('.mark_answer').find('.mark_score .totalScore.fr i').text()
                    if (_isTrue == 'marking_dui' || _isZero != '0') {
                        _rightAns = $(t).find('.mark_answer').find('.colorDeep').text().replace(/我的答案[::]/, '').trim()
                    } else {
                        let _true = '正确|是|对|√|T|ri'
                        _rightAns = $(t).find('.mark_answer').find('.colorDeep').text().replace(/我的答案[::]/, '').trim()
                        if (_true.indexOf(_rightAns) != -1) {
                            _rightAns = '错'
                        } else {
                            _rightAns = '对'
                        }
                    }
                }
                _a['question'] = _question
                _a['type'] = _type
                _a['answer'] = _rightAns
                data.push(_a)
                break
            case 4:
                if (_rightAns.length <= 0) {
                    break
                }
                _a['question'] = _question
                _a['type'] = _type
                _a['answer'] = _rightAns
                data.push(_a)
                break
            default:
                break
        }
    })
    setTimeout(() => { uploadAnswer(data) }, 1500)

}

function refreshCourseList() {
    let _p = parseUrlParams()
    return new Promise((resolve, reject) => {
        $.ajax({
            url: _l.protocol + '//' + _l.host + '/mycourse/studentstudycourselist?courseId=' + _p['courseid'] + '&chapterId=' + _p['knowledgeid'] + '&clazzid=' + _p['clazzid'] + '&mooc2=1',
            type: 'GET',
            dateType: 'html',
            success: function (res) {
                resolve(res)
            }
        })
    })

}

function updateAudio(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt) {
    return new Promise((resolve, reject) => {
        getEnc(classId, userId, jobId, objectId, playingTime, duration, clipTime).then((enc) => {
            if (reportUrlChange) {
                reportUrl = http2https(reportUrl)
            }
            $.ajax({
                url: reportUrl + '/' + dtoken + '?clazzId=' + classId + '&playingTime=' + playingTime + '&duration=' + duration + '&clipTime=' + clipTime + '&objectId=' + objectId + '&otherInfo=' + otherInfo + '&jobid=' + jobId + '&userid=' + userId + '&isdrag=' + isdrag + '&view=pc&enc=' + enc + '&rt=' + Number(_rt) + '&dtype=Audio&_t=' + String(Math.round(new Date())),
                type: 'GET',
                success: function (res) {
                    try {
                        if (res['isPassed']) {
                            if (setting.review && playingTime != duration) {
                                resolve(1)
                            } else {
                                resolve(2)
                            }
                        } else {
                            if (setting.rate == 0 && playingTime == duration) {
                                resolve(2)
                            } else {
                                resolve(1)
                            }
                        }
                    } catch (e) {
                        logger('发生错误:' + e, 'red')
                        resolve(0)
                    }
                },
                error: function (xhr) {
                    if (xhr.status == 403) {
                        logger('超星返回错误信息,尝试更换参数,40s后将重试,请等待...', 'red')
                        resolve(3)
                    } else {
                        reportUrlChange = 1;
                        logger('超星返回错误信息,如果持续出现,请联系作者', 'red')
                    }
                }
            })
        })
    })
}

function updateVideo(reportUrl, dtoken, classId, playingTime, duration, clipTime, objectId, otherInfo, jobId, userId, isdrag, _rt) {
    return new Promise((resolve, reject) => {
        getEnc(classId, userId, jobId, objectId, playingTime, duration, clipTime).then((enc) => {
            if (reportUrlChange) {
                reportUrl = http2https(reportUrl)
            }
            $.ajax({
                url: reportUrl + '/' + dtoken + '?clazzId=' + classId + '&playingTime=' + playingTime + '&duration=' + duration + '&clipTime=' + clipTime + '&objectId=' + objectId + '&otherInfo=' + otherInfo + '&jobid=' + jobId + '&userid=' + userId + '&isdrag=' + isdrag + '&view=pc&enc=' + enc + '&rt=' + Number(_rt) + '&dtype=Video&_t=' + String(Math.round(new Date())),
                type: 'GET',
                success: function (res) {
                    try {
                        if (res['isPassed']) {
                            if (setting.review && playingTime != duration) {
                                resolve(1)
                            } else {
                                resolve(2)
                            }
                        } else {
                            if (setting.rate == 0 && playingTime == duration) {
                                resolve(2)
                            } else {
                                resolve(1)
                            }
                        }
                    } catch (e) {
                        logger('发生错误:' + e, 'red')
                        resolve(0)
                    }
                },
                error: function (xhr) {
                    if (xhr.status == 403) {
                        logger('超星返回错误信息,尝试更换参数,40s后将重试,请等待...', 'red')
                        resolve(3)
                    } else {
                        reportUrlChange = 1;
                        logger('超星返回错误信息,如果持续出现,请联系作者', 'red')
                    }
                }
            })
        })
    })
}

function upLoadWork(index, doms, dom) {
    let $CyHtml = $(dom).contents().find('.CeYan')
    let TiMuList = $CyHtml.find('.TiMu')
    let data = []
    for (let i = 0; i < TiMuList.length; i++) {
        let _a = {}
        let questionFull = $(TiMuList[i]).find('.Zy_TItle.clearfix > div.clearfix').html().trim()
        let _question = tidyQuestion(questionFull)
        let _TimuType = ({ 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 })[questionFull.match(/^<span.*?newZy_TItle.*?【(.*?)】<\/span>|$/)[1]]
        _a['question'] = _question
        _a['type'] = _TimuType
        let _selfAnswerCheck = $(TiMuList[i]).find('.newAnswerBx > .myAnswerBx > .answerScore .CorrectOrNot span').attr('class')
        switch (_TimuType) {
            case 0:
                if (_selfAnswerCheck == "marking_dui") {
                    let _selfAnswer = ({ A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 })[$(TiMuList[i]).find('.newAnswerBx > .myAnswerBx > .myAnswer').text().trim().replace(/正确答案[::]/, '').replace(/我的答案[::]/, '').trim()]
                    let _answerForm = $(TiMuList[i]).find('.Zy_ulTop li')
                    let _answer = $(_answerForm[_selfAnswer]).find('a.fl').html()
                    _a['answer'] = tidyStr(_answer)
                }
                break
            case 1:
                let _answerArr = $(TiMuList[i]).find('.newAnswerBx > .myAnswerBx > .myAnswer').text().trim().replace(/正确答案[::]/, '').replace(/我的答案[::]/, '').trim()
                let _answerForm = $(TiMuList[i]).find('.Zy_ulTop li')
                let _answer = []
                if (_selfAnswerCheck == "marking_dui" || _selfAnswerCheck == "marking_bandui") {
                    for (let i = 0; i < _answerArr.length; i++) {
                        let _answerIndex = ({ A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 })[_answerArr[i]]
                        _answer.push($(_answerForm[_answerIndex]).find('a.fl').html())
                    }
                } else {
                    break
                }
                _a['answer'] = tidyStr(_answer.join('#'))
                break
            case 2:
                let _TAnswerArr = $(TiMuList[i]).find('.newAnswerBx > .myAnswerBx > .myAnswer')
                let _TAnswer = []
                for (let i = 0; i < _TAnswerArr.length; i++) {
                    let item = _TAnswerArr[i];
                    if ($(item).find('i').attr('class') == 'marking_dui') {
                        _TAnswer.push($(item).find('p').html().replace(/[(][0-9].*?[)]/, '').replace(/第.*?空:/, '').trim())
                    }
                }
                if (_TAnswer.length <= 0) { break }
                _a['answer'] = tidyStr(_TAnswer.join('#'))
                break
            case 3:
                if (_selfAnswerCheck == "marking_dui") {
                    let _answer = $(TiMuList[i]).find('.newAnswerBx > .myAnswerBx > .myAnswer').html().replace(/正确答案[::]/, '').replace(/我的答案[::]/, '').trim()
                    _a['answer'] = tidyStr(_answer)
                } else {
                    if ($(TiMuList[i]).find('.newAnswerBx > .myAnswerBx > .myAnswer').html()) {
                        let _answer = $(TiMuList[i]).find('.newAnswerBx > .myAnswerBx > .myAnswer').html().replace(/正确答案[::]/, '').replace(/我的答案[::]/, '').trim()
                        if ("对|√|正确".indexOf(tidyStr(_answer)) != -1) {
                            _a['answer'] = "错"
                        } else {
                            _a['answer'] = "对"
                        }
                    } else {
                        break
                    }
                }
                break
            case 4:
                break
        }
        if (_a['answer'] != undefined) {
            data.push(_a)
        } else {
            continue
        }
    }
    uploadAnswer(data).then(() => {
        _mlist.splice(0, 1)
        _domList.splice(0, 1)
        setTimeout(() => { startDoCyWork(index + 1, doms) }, 3000)
    })
}

function filterAnswerIndex(answertext) {
    let result = answertext.match(/[我的|正确]答案[::]\s{1}([A-Z]+?):/)
    return result ? result[1] : null
}

function uploadHomeWork() {
    logger('开始收录答案', 'green')
    let $_homeworktable = $('.mark_table')
    let TiMuList = $_homeworktable.find('.mark_item').find('.questionLi')
    let data = []
    $.each(TiMuList, (i, t) => {
        let _a = {}
        let _answer
        let _answerTmpArr, _answerList = []
        let TiMuFull = tidyQuestion($(t).find('h3.mark_name').html())
        let TiMuType = ({ 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 })[TiMuFull.match(/[(](.*?)[)]|$/)[1].replace(/, .*?分/, '')]
        let TiMu = TiMuFull.replace(/^[(].*?[)]|$/, '').trim()
        let rightAns_path = $(t).find('.mark_answer').find('.colorGreen')[0]
        switch (TiMuType) {
            case 0:
                if (rightAns_path) {
                    d_rightAns = filterAnswerIndex($(t).find('.mark_answer').find('.colorGreen').text())
                } else {
                    _isTrue = $(t).find('.mark_answer').find('.mark_score span').attr('class')
                    _isZero = $(t).find('.mark_answer').find('.mark_score .totalScore.fr i').text()
                    if (_isTrue == 'marking_dui' || _isZero != '0') {
                        d_rightAns = filterAnswerIndex($(t).find('.mark_answer').find('.colorDeep').text())
                    } else {
                        return
                    }
                }
                _answerTmpArr = $(t).find('.mark_letter li')
                $.each(_answerTmpArr, (a, b) => {
                    _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, ''))
                })
                let _i = ({ A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 })[d_rightAns]
                _answer = _answerList[_i]
                _a['question'] = TiMu
                _a['type'] = TiMuType
                _a['answer'] = _answer
                data.push(_a)
                break
            case 1:
                _answer = []
                if (rightAns_path) {
                    m_rightAns = filterAnswerIndex($(t).find('.mark_answer').find('.colorGreen').text())
                } else {
                    _isTrue = $(t).find('.mark_answer').find('.mark_score span').attr('class')
                    _isZero = $(t).find('.mark_answer').find('.mark_score .totalScore.fr i').text()
                    if (_isTrue == 'marking_dui' || _isTrue == 'marking_bandui' || _isZero != '0') {
                        m_rightAns = filterAnswerIndex($(t).find('.mark_answer').find('.colorDeep').text())
                    } else {
                        break
                    }
                }
                _answerTmpArr = $(t).find('.mark_letter li')
                $.each(_answerTmpArr, (a, b) => {
                    _answerList.push(tidyStr($(b).html()).replace(/[A-Z].\s*/, ''))
                })
                $.each(m_rightAns.split(''), (c, d) => {
                    let _i = ({ A: 0, B: 1, C: 2, D: 3, E: 4, F: 5, G: 6 })[d]
                    _answer.push(_answerList[_i])
                })
                _a['question'] = TiMu
                _a['type'] = TiMuType
                _a['answer'] = _answer.join("#")
                data.push(_a)
                break
            case 2:
                _answerTmpArr = []
                let answers = $(t).find('.mark_answer').find('.colorDeep').find('dd')
                if (rightAns_path) {
                    t_rightAns = $(rightAns_path)
                                .text()
                                .replace(/\s/g,"")
                                .replace(/[(][0-9].*?[)]/g, '#')
                                .replace(/第.*?空:/g, '#')
                                .replace(/^正确答案[::]#*/,'')
                    _answer = t_rightAns
                } else {
                    _isZero = $(t).find('.mark_answer').find('.mark_score .totalScore.fr i').text()
                    if (_isZero && _isZero != 0) {
                        $.each(answers, (i, t) => {
                            t_rightAns = $(t).find('span:eq(0)').text()
                            _answerTmpArr.push(t_rightAns.replace(/[(][0-9].*?[)]/, '').replace(/第.*?空:/, '').trim())
                        })
                    } else {
                        $.each(answers, (i, t) => {
                            _isTrue = $(t).find('span:eq(1)').attr('class')
                            if (_isTrue == 'marking_dui') {
                                t_rightAns = $(t).find('span:eq(0)').text()
                                _answerTmpArr.push(t_rightAns.replace(/[(][0-9].*?[)]/, '').replace(/第.*?空:/, '').trim())
                            } else {
                                return
                            }
                        })
                    }
                    
                    _answer = _answerTmpArr.join('#')
                }

                if (_answer.length != 0) {
                    _a['question'] = TiMu
                    _a['type'] = TiMuType
                    _a['answer'] = _answer
                    data.push(_a)
                }
                break
            case 3:
                if (rightAns_path) {
                    p_rightAns = $(rightAns_path)
                                .text()
                                .replace(/\s/g,'')
                                .replace(/^正确答案[::]/,'')
                } else {
                    _isTrue = $(t).find('.mark_answer').find('.mark_score span').attr('class')
                    _isZero = $(t).find('.mark_answer').find('.mark_score .totalScore.fr i').text()
                    if (_isTrue == 'marking_dui' || _isZero != '0') {
                        p_rightAns = $(t).find('.mark_answer').find('.colorDeep')
                                    .text()
                                    .replace(/\s/g,'')
                                    .replace(/^我的答案[::]/, '')
                    } else {
                        let _true = '正确|是|对|√|T|ri'
                        p_rightAns = $(t).find('.mark_answer').find('.colorDeep')
                                    .text()
                                    .replace(/\s/g,'')
                                    .replace(/^我的答案[::]/, '')
                        if (_true.indexOf(p_rightAns) != -1) {
                            p_rightAns = '错'
                        } else {
                            p_rightAns = '对'
                        }
                    }
                }
                _a['question'] = TiMu
                _a['type'] = TiMuType
                _a['answer'] = p_rightAns
                data.push(_a)
                break
            case 4:
                if (rightAns_path) {
                    j_rightAns = $(rightAns_path)
                                .text()
                                .replace(/\s/g,'')
                } else {
                    break
                }
                _a['question'] = TiMu
                _a['type'] = TiMuType
                _a['answer'] = j_rightAns
                data.push(_a)
                break
        }
    })
    setTimeout(() => { uploadAnswer(data) }, 1500)
}

function getEnc(a, b, c, d, e, f, g) {
    return new Promise((resolve, reject) => {
        let strEnc = `[${a}][${b}][${c}][${d}][${e * 1000}][d_yHJ!$pdA~5][${f * 1000}][${g}]`
        resolve(md5(strEnc)) 
    })
}

function getAnswer(_t, _q) {
    if (GM_getValue("lemtkpro")) {
        logger("🎈请注意:您正在使用高级搜索功能。","#CC33FF")
        tkurl = _host + '/api/v1/mcx'
    } else {
        tkurl = _host + '/api/v1/cx'
    }
    return new Promise((resolve, reject) => {
        let _u = getCk('_uid') || getCk('UID')
        GM_xmlhttpRequest({
            method: 'POST',
            url: tkurl,
            headers: {
                'Content-type': 'application/json',
                'Authorization': 'Bearer ' + setting.token
            },
            data: JSON.stringify({
                "v": GM_info['script']['version'],
                "question": _q,
                "uid": _u
              }),
            timeout: setting.time,
            onload: function (xhr) {
                if (xhr.status == 200) {
                    var obj = $.parseJSON(xhr.responseText) || {};
                    if (obj.code == 1000) {

                        _answer = /^http/.test(obj.data.answer) ? '<img src="' + obj.data.answer + '">' : obj.data.answer;

                        logger('题目:' + _q + "<br />---->答案:" + _answer, 'purple')
                        resolve(_answer)
                    } else if (obj.code == 5000 || obj.code == 5001) {
                        logger(obj.msg, 'red')
                        setting.sub = 0
                        reject({ 'c': 0 })
                    } else if (obj.code == 1003) {
                        logger('题目:' + _q + "<br />---->暂无答案", 'red')
                        setting.sub = 0
                        reject({ 'c': 0 })
                    } else {
                        logger(obj.msg, 'red')
                        setting.sub = 0
                        reject({ 'c': 0 })
                    }
                } else if (xhr.status == 403) {
                    logger('请求过于频繁,请稍后再试', 'red')
                    reject({ 'c': 403 })
                } else if (xhr.status == 500) {
                    logger('题库程序异常,请过一会再试', 'red')
                    reject({ 'c': 500 })
                } else if (xhr.status == 444) {
                    logger('IP异常,已被拉入服务器黑名单,请过几个小时再试', 'red')
                    reject({ 'c': 444 })
                } else if (xhr.status == 400) {
                    var obj = $.parseJSON(xhr.responseText) || {};
                    logger(obj.msg, 'red')
                    reject({ 'c': 400 })
                } else {
                    logger('题库异常,可能被恶意攻击了...请等待恢复', 'red')
                    reject({ 'c': 555 })
                }
            },
            ontimeout: function () {
                logger('题库异常,可能被恶意攻击了...请等待恢复', 'red')
                reject({ 'c': 666 })
            }
        });
    })
}


function doWork(index, doms, dom) {
    $frame_c = $(dom).contents();
    let $CyHtml = $frame_c.find('.CeYan')
    let TiMuList = $CyHtml.find('.TiMu')
    $subBtn = $frame_c.find('.ZY_sub').find('.btnSubmit')
    $saveBtn = $frame_c.find('.ZY_sub').find('.btnSave')
    startDoWork(index, doms, 0, TiMuList)
}

function startDoWork(index, doms, c, TiMuList) {
    if (c == TiMuList.length) {
        if (setting.sub) {
            logger('测验处理完成,准备自动提交。', 'green')
            setTimeout(() => {
                $subBtn.click()
                setTimeout(() => {
                    let $recof = $frame_c.find('.maskDiv .popDiv .popBottom a#popok')
                    $recof[0].click()
                    logger('提交成功,准备切换下一个任务。', 'green')
                    _mlist.splice(0, 1)
                    _domList.splice(0, 1)
                    setTimeout(() => { startDoCyWork(index + 1, doms) }, 3000)
                }, 5000)
            }, 3000)
        } else if (setting.force) {
            logger('测验处理完成,存在无答案题目,由于用户设置了强制提交,准备自动提交。', 'red')
            setTimeout(() => {
                $subBtn.click()
                setTimeout(() => {
                    let $recof = $frame_c.find('.maskDiv .popDiv .popBottom a#popok')
                    $recof[0].click()
                    logger('提交成功,准备切换下一个任务。', 'green')
                    _mlist.splice(0, 1)
                    _domList.splice(0, 1)
                    setTimeout(() => { startDoCyWork(index + 1, doms) }, 3000)
                }, 3000)
            }, 5000)
        } else {
            logger('测验处理完成,存在无答案题目或者用户设置不提交。', 'red')
        }
        return
    }
    let questionFull = $(TiMuList[c]).find('.Zy_TItle.clearfix > div').html()
    questionFull = tidyQuestion(questionFull).replace('/<span.*?>.*?<\/span>/',"")
    let _question = tidyQuestion(questionFull)
    let _TimuType = ({ 单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3, 简答题: 4 })[questionFull.match(/^【(.*?)】|$/)[1]]
    let _a = []
    let _answerTmpArr
    switch (_TimuType) {
        case 0:
            _answerTmpArr = $(TiMuList[c]).find('.Zy_ulTop li').find('a')
            $.each(_answerTmpArr, (i, t) => {
                _a.push(tidyStr($(t).html()))
            })
            getAnswer(_TimuType, _question).then((agrs) => {
                let _i = _a.findIndex((item) => item == agrs)
                if (_i == -1) {
                    logger('未匹配到正确答案,跳过', 'red')
                    setting.sub = 0
                } else {
                    $(_answerTmpArr[_i]).parent().click()
                }
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            })
            break
        case 1:
            _answerTmpArr = $(TiMuList[c]).find('.Zy_ulTop li').find('a')
            getAnswer(_TimuType, _question).then((agrs) => {
                $.each(_answerTmpArr, (i, t) => {
                    if (agrs.indexOf(tidyStr($(t).html())) != -1) {
                        $(_answerTmpArr[i]).parent().click()
                        _a.push(['A', 'B', 'C', 'D', 'E', 'F', 'G'][i])
                    }
                })
                if (_a.length <= 0) {
                    logger('未匹配到正确答案,跳过', 'red')
                    setting.sub = 0
                }
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            })
            break
        case 2:
            let _textareaList = $(TiMuList[c]).find('.Zy_ulTk .XztiHover1')
            getAnswer(_TimuType, _question).then((agrs) => {
                let _answerList = agrs.split("#")
                $.each(_textareaList, (i, t) => {
                    setTimeout(() => {
                        $(t).find('#ueditor_' + i).contents().find('.view p').html(_answerList[i]);
                        $(t).find('textarea').html('<p>' + _answerList[i] + '</p>')
                    }, 300)
                })
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            })
            break
        case 3:
            _answerTmpArr = $(TiMuList[c]).find('.Zy_ulTop li').find('a')
            let _true = '正确|是|对|√|T|ri'
            let _false = '错误|否|错|×|F|wr'

            $.each(_answerTmpArr, (i, t) => {
                _a.push(tidyStr($(t).html()))
            })

            getAnswer(_TimuType, _question).then((agrs) => {
                agrs = _true.indexOf(agrs) != -1 ? "对" : "错"
                let _i = _a.findIndex((item) => item == agrs)
                if (_i == -1) {
                    logger('未匹配到正确答案,跳过', 'red')
                    setting.sub = 0
                } else {
                    $(_answerTmpArr[_i]).parent().click()
                }
               setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            })
            break
        case 4:
            let _textareaLista = $(TiMuList[c]).find('.Zy_ulTk .XztiHover1')
            getAnswer(_TimuType, _question).then((agrs) => {
                if (agrs == '暂无答案') {
                    setting.sub = 0
                }
                let _answerList = agrs.split("#")
                $.each(_textareaLista, (i, t) => {
                    setTimeout(() => {
                        $(t).find('#ueditor_' + i).contents().find('.view p').html(_answerList[i]);
                        $(t).find('textarea').html('<p>' + _answerList[i] + '</p>')
                    }, 300)
                })
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            }).catch((agrs) => {
                setTimeout(() => { startDoWork(index, doms, c + 1, TiMuList) }, setting.time)
            })
            break
    }
}

function uploadAnswer(a) {
    a.forEach((item)=>{
        item.type = item.type+""
    })
    return new Promise((resolve, reject) => {
        let _u = getCk('_uid') || getCk('UID')
        GM_xmlhttpRequest({
            url: _host + '/api/v1/upload',
            data: JSON.stringify({
                "v":GM_info['script']['version'],
                "data":a,
                "uid":_u
            }),
            method: 'POST',
            headers: {
                "Content-Type": "application/json"
            },
            onload: function (xhr) {
                try {
                    let res = $.parseJSON(xhr.responseText)
                    if (res['code'] == 1000) {
                        logger('答案收录成功!已提交题库后端处理!准备处理下一个任务。', 'green')
                    } else {
                        logger('答案收录失败了,请向作者反馈,准备处理下一个任务。', 'red')
                    }
                    resolve()
                } catch {
                    let res = xhr.responseText
                    if (res.indexOf('防火墙') != -1) {
                        logger('答案收录失败了,已被防火墙拦截,请联系作者手动收录。', 'red')
                    } else {
                        logger('答案收录失败了,未知错误,请向作者反馈。', 'red')
                    }
                    resolve()
                }
            }
        })
    })

}

function switchMission() {
    _mlist.splice(0, 1)
    _domList.splice(0, 1)
    setTimeout(missonStart, 5000)
}

function tidyStr(s) {
    if (s) {
        let str = s.replace(/<(?!img).*?>/g, "").replace(/^【.*?】\s*/, '').replace(/\s*(\d+\.\d+分)$/, '').trim().replace(/&nbsp;/g, '').replace('javascript:void(0);','').replace(new RegExp("&nbsp;", ("gm")), '').replace(/^\s+/, '').replace(/\s+$/, '');
        return str
    } else {
        return null
    }
}

function tidyQuestion(s) {
    if (s) {
        let str = s.replace(/<(?!img).*?>/g, "").replace(/^【.*?】\s*/, '').replace(/\s*(\d+\.\d+分)$/, '').replace(/^\d+[\.、]/, '').trim().replace(/&nbsp;/g, '').replace('javascript:void(0);', '').replace(new RegExp("&nbsp;", ("gm")), '').replace(/^\s+/, '').replace(/\s+$/, '');
        return str
    } else {
        return null
    }
}


function decryptFont() {
    /**
    * Author   wyn665817
    * From     https://greasyfork.org/zh-CN/scripts/445007
    */
    var $tip = $('style:contains(font-cxsecret)');
    if (!$tip.length) return;
    var font = $tip.text().match(/base64,([\w\W]+?)'/)[1];
    font = Typr.parse(base64ToUint8Array(font))[0];
    var table = JSON.parse(GM_getResourceText('Table'));
    var match = {};
    for (var i = 19968; i < 40870; i++) {
        $tip = Typr.U.codeToGlyph(font, i);
        if (!$tip) continue;
        $tip = Typr.U.glyphToPath(font, $tip);
        $tip = md5(JSON.stringify($tip)).slice(24);
        match[i] = table[$tip];
    }
    $('.font-cxsecret').html(function (index, html) {
        $.each(match, function (key, value) {
            key = String.fromCharCode(key);
            key = new RegExp(key, 'g');
            value = String.fromCharCode(value);
            html = html.replace(key, value);
        });
        return html;
    }).removeClass('font-cxsecret');
}

function base64ToUint8Array(base64) {
    var data = window.atob(base64);
    var buffer = new Uint8Array(data.length);
    for (var i = 0; i < data.length; ++i) {
        buffer[i] = data.charCodeAt(i);
    }
    return buffer;
}

console.log("%c\u522b\u5047\u88c5\u52aa\u529b\uff0c\n\u7ed3\u5c40\u4e0d\u4f1a\u966a\u4f60\u6f14\u620f\uff01\n\u52a0\u6cb9\uff0c\u540c\u5b66\uff01","color:green")