Greasy Fork

⭐超星|学习通【旧版考试专版】🌳智慧树|知到【网课小助手】|支持作业、考试答题|可以设置挂机时长,到时间自动提醒,自动播放下一个视频|题库永久免费|

⭐超星|学习通【旧版考试专版,返回旧版再进行考试即可】🌳智慧树|知到网课小助手。支持以下功能:1、智慧树/知到视频挂机[可以设置挂机时长,到时间自动提醒,自动播放下一个视频]。2、智慧树/知到测验答题[自动搜索相关题目]。3、智慧树/知到考试作答[自动搜索相关题目,并且进行选择]

目前为 2022-11-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         ⭐超星|学习通【旧版考试专版】🌳智慧树|知到【网课小助手】|支持作业、考试答题|可以设置挂机时长,到时间自动提醒,自动播放下一个视频|题库永久免费|
// @namespace    shushoujiu
// @version      3.0
// @description  ⭐超星|学习通【旧版考试专版,返回旧版再进行考试即可】🌳智慧树|知到网课小助手。支持以下功能:1、智慧树/知到视频挂机[可以设置挂机时长,到时间自动提醒,自动播放下一个视频]。2、智慧树/知到测验答题[自动搜索相关题目]。3、智慧树/知到考试作答[自动搜索相关题目,并且进行选择]
// @author       shushoujiu
// @match        *://*.zhihuishu.com/videoStudy*
// @match        *://*.zhihuishu.com/portals_h5*
// @match        *://*.zhihuishu.com/live/vod_room*
// @match        *://*.zhihuishu.com/stuExamWeb*
// @match        *://*.chaoxing.com/exam-ans/exam/test/reVersionTestStartNew*
// @connect      cx.icodef.com
// @connect      s.jiaoyu139.com
// @run-at       document-end
// @grant        unsafeWindow
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_getValue
// @resource css https://unpkg.com/[email protected]/dist/css/bootstrap.min.css
// @license      MIT
// @original-script https://greasyfork.org/scripts/380506
// @original-author wyn665817
// @original-license MIT
// ==/UserScript==

// 获取url
let _url = location.href;
let _api = [
    {'url': 'http://cx.icodef.com/wyn-nb?v=4', 'method': 'POST'},
    {'url': 'http://s.jiaoyu139.com:886/get?t=ks', 'method': 'POST'}
]
// 如果url里面有zhihuishu
if (_url.indexOf('zhihuishu') !== -1) {
    // 设置修改后,需要刷新或重新打开网课页面才会生效
    var setting = {
            // 5E3 == 5000,科学记数法,表示毫秒数
            time: 5E3 // 默认响应速度为5秒,不建议小于3秒

            // 1代表开启,0代表关闭
            , video: 1 // 视频支持课程、见面课,默认关闭
            , work: 1 // 自动答题功能,支持章测试、考试,高准确率,默认开启
            , jump: 1 // 自动切换视频,支持课程、见面课,默认关闭
            , habit: '0' // 限制共享课视频挂机时长,单位是分钟,如需挂机习惯分,可以修改参数为'30',默认不限制

            // 仅开启video时,修改此处才会生效
            , line: '流畅' // 视频播放的默认线路,可选参数:['高清', '流畅', '校内'],默认'流畅'
            , vol: '0' // 默认音量的百分数,设定范围:[0,100],'0'为静音,默认'0'
            , speed: '1.5' // 进度统计速率,高倍率可以快速完成任务点,设定范围:(0,+∞),默认'1.5'倍
            // 上方参数支持在页面改动,下方参数仅支持代码处修改
            , que: 1 // 屏蔽视频时间点对应的节试题,取消屏蔽则自动切换为模拟点击关闭弹题,默认关闭
            , danmu: 0 // 见面课弹幕,关闭后在网页中无法手动开启,默认关闭

            // 仅开启work时,修改此处才会生效
            , none: 0 // 无匹配答案时执行默认操作,默认关闭
            , hide: 0 // 不加载答案搜索提示框,键盘↑和↓可以临时移除和加载,默认关闭
        },
        _self = unsafeWindow,
        url = location.pathname,
        $ = _self.jQuery,
        vjsC = _self.vjsComponent;
    GM_addStyle(GM_getResourceText("css"));

    String.prototype.toCDB = function () {
        return this.replace(/\s/g, '').replace(/[\uff01-\uff5e]/g, function (str) {
            return String.fromCharCode(str.charCodeAt(0) - 65248);
        }).replace(/[“”]/g, '"').replace(/[‘’]/g, "'").replace(/。/g, '.');
    };

    // setting.time += Math.ceil(setting.time * Math.random()) - setting.time / 2;
    setting.queue = setting.curs = [];

    if (!$) {
    } else if (url == '/live/vod_room.html') {
        courseFn(0);
    } else if (url == '/videoStudy.html') {
        var xhr = _self.XMLHttpRequest.prototype;
        courseFn(1, xhr.open, setting.habit * 6E4);
    } else if (url == '/portals_h5/2clearning.html') {
        courseFn(2);
    } else if (url.match('/sourceLearning')) {
        courseFn(3);
    } else if (location.hostname.match('examh5')) {
        setTimeout(relieveLimit, 100, document);
        if (location.hash.match(/dohomework|doexamination/) && setting.work) beforeFind();
        $(window).on('hashchange', function () {
            setting.work && location.reload();
        });
    } else if (url == '/shareCourse/questionDetailPage') {
        setTimeout(relieveLimit, 100, document);
        $('textarea[oncut]').each(function () {
            setTimeout(relieveLimit, 100, this);
        });
    }

    function courseFn(tip, open, habit) {
        setting.jump && setInterval(checkToNext, setting.time);
        habit && setTimeout(totalTime, setting.time, habit);
        if (!setting.video) return;
        // _self.PlayerUtil.debugMode = true;
        setting.tip = tip;
        _self.vjsComponent = vjsComponent;
        $(document).on('click', '.definiLines b', function () {
            setting.line = ({xiaonei: '校内', line1gq: '高清', line1bq: '流畅'})[this.classList[0]];
        }).on('mouseup click', function () {
            if (!_self.PlayerStarter.playerArray[0]) return;
            setting.vol = _self.PlayerStarter.playerArray[0].player.cache_.volume * 100;
        }).on('click', '.speedList div', function () {
            setting.speed = $(this).attr('rate');
        });
        if (setting.tip != 1) return;
        setting.que ? xhr.open = function (type, url, async) {
            if (url.match('/loadVideoPointerInfo')) type = 'GET';
            return open.call(this, type, url, async);
        } : setInterval(doTest, 1E3);
    }

    function vjsComponent(obj) {
        var options = obj.options,
            line = $.map(options.sourceSrc.lines, function (value) {
                return value.lineName.replace('标准', '高清');
            }),
            vol = setting.vol > 100 ? 100 : Math.round(setting.vol);
        options.volume = vol > 0 ? vol / 100 : 0;
        options.autostart = true;
        setting.speed = setting.speed > 0 ? +setting.speed : 1;
        options.rate = $.inArray(setting.speed, [1, 1.25, 1.5]) < 0 ? options.rate : setting.speed;
        setting.tip && obj.callback.playbackRate(setting.speed);
        options.chooseLine = $.inArray(setting.line, line) + 1 || options.chooseLine + 1;
        options.src = options.sourceSrc.lines[--options.chooseLine].lineUrl || options.src;
        if (!setting.danmu) {
            obj.defOptions.control.danmuBtn = false;
            delete options.control.danmuBtn;
        }
        obj.player.on('loadstart', function () {
            this.loop(true);
            this.play();
            $('.speedBox span').text('X ' + setting.speed);
        });
        vjsC.call(this, obj);
    }

    function totalTime(habit) {
        var obj = _self.PlayerStarter.playerArray[0];
        if (obj) habit -= obj.player.paused() ? 0 : setting.time;
        if (habit >= 0) return setTimeout(totalTime, setting.time, habit);
        obj.player.pause();
        var $tips = $('.dialog-tips').eq(0).clone().css('z-index', 3000).appendTo('.video-study').show(),
            html = '<div class="el-dialog__title" style="margin-top: 45px; text-align: center; color: red;">已达到挂机限制时间</div>';
        $tips.find('.el-dialog__title').text('智慧树网课助手提示').next().remove();
        $tips.find('.el-dialog__footer').before(html).find('button').click(function () {
            $tips.remove();
        }).find('span').text('明白了');
    }

    function checkToNext() {
        if (setting.habit < 0) return;
        var $tip = $('.video, .lessonItem, .file-item');
        if ($('.current_play .time_icofinish').length) {
            $tip.slice($tip.index($('.current_play')) + 1).not(':has(.time_icofinish)').eq(0).click();
        } else if ($('.lessonItemActive .finish').length) {
            // _self.PlayerStarter.playerArray[0].callback.playerNext();
            $tip.slice($tip.index($('.lessonItemActive')) + 1).not(':has(.finish)').eq(0).click();
        } else if (url.match('vod_room')) {
            $('.current_player:contains("100%") + li').click();
            // $('.finish_tishi').hasClass('disNo') || console.log('签到已完成');
        } else if ($('.active .icon-finish').length) {
            $tip.slice($tip.index($('.active')) + 1).not(':has(.icon-finish)').eq(0).click();
        }
    }

    function doTest() {
        if (!$('.dialog-test').length) {
        } else if (setting.queue.length) {
            $(setting.queue.shift()).parent().click();
        } else if (!$('.item-topic.active').length) {
            $('.topic-item').eq(0).click();
        } else if ($('.error').length) {
            var tip = $('.answer span').text().match(/[A-Z]/g) || [];
            if (tip.length == 1) return $('.topic-option-item:contains(' + tip[0] + ')').click();
            $('.topic-option-item').each(function () {
                $.inArray($(this).text().slice(0, 1), tip) < 0 == $(this).hasClass('active') && setting.queue.push(this);
            });
        } else if ($('.btn-next:enabled').length) {
            $('.btn-next:enabled').click();
        } else {
            $('.dialog-test .btn').click();
            _self.PlayerStarter.playerArray[0].player.play();
        }
    }

    function relieveLimit(doc) {
        if (!doc.oncut && !doc.onselectstart) return setTimeout(relieveLimit, 100, doc);
        doc.oncontextmenu = doc.onpaste = doc.oncopy = doc.oncut = doc.onselectstart = null;
    }

    function beforeFind() {
        setting.div = $(
            '<div class="jumbotron" style="border: 2px solid rgb(0, 0, 0); margin:5px; padding: 20px 20px 10px 20px;  width: 500px; position: fixed; top: 0; left: 0; z-index: 99999; background-color: ; overflow-x: auto;">' +
            '<span style="font-size: medium;"></span>' +
            '<div><h4>欢迎使用脚本</br>如果遇到搜不到的题,可以下载查题app,<b>扫码下载</b>即可<img src="https://cdn.fm210.cn/img/huoxin.png" style="width:150px;" class="img-thumbnail"></br>(平台风控严格,建议留作备用查题)</br>或者关注公众号“高校工具箱”进行查题<h4></div>' +
            '<button class="btn btn-primary" style="width:80px; height:35px;margin-right: 10px;">暂停答题</button>' +
            '<button class="btn btn-primary" style="margin-right: 10px;">重新查询</button>' +
            '<button class="btn btn-primary" style="margin-right: 10px;">折叠面板</button>' +
            '<button class="btn btn-primary" style="margin-top: 10px;display: none;">未作答题目</button>' +
            '<form style="margin: 2px 0;">' +
            '<h4><label class="label label-warning" >自定义答题范围:</label><h4>' +
            '<input class="form-control" name="num" type="number" min="1" placeholder="开始" style="width: 80px;" disabled>' +
            '<span>   </span> ' +
            '<input class="form-control" name="max" type="number" min="1" placeholder="结束" style="width: 80px;" disabled>' +
            '</form>' +
            '<div style="max-height: 300px; overflow-y: auto;">' +
            '<table  class="table table-striped" style="font-size: 12px;">' +
            '<thead>' +
            '<tr>' +
            '<th style="width: 30px; min-width: 30px; font-weight: bold; text-align: center;">题号</th>' +
            '<th style="width: 60%; min-width: 130px; font-weight: bold; text-align: center;">题目(点击可复制)</th>' +
            '<th style="min-width: 130px; font-weight: bold; text-align: center;">答案(点击可复制)</th>' +
            '</tr>' +
            '</thead>' +
            '<tfoot style="display: none;">' +
            '<tr>' +
            '<th colspan="3" style="font-weight: bold; text-align: center;">答案提示框 已折叠</th>' +
            '</tr>' +
            '</tfoot>' +
            '<tbody>' +
            '<tr>' +
            '<td colspan="3" style="display: none;"></td>' +
            '</tr>' +
            '</tbody>' +
            '</table>' +
            '</div>' +
            '</div>'
        ).appendTo('body').on('click', 'button, td', function () {
            var len = $(this).prevAll('button').length;
            if (this.nodeName == 'TD') {
                $(this).prev().length && GM_setClipboard($(this).text());
            } else if (len === 0) {
                if (setting.loop) {
                    clearInterval(setting.loop);
                    delete setting.loop;
                    len = [false, '<h3>已赞停搜索<h3>', '继续答题'];
                } else {
                    setting.loop = setInterval(findAnswer, setting.time);
                    len = [true, '<h3>正在搜索答案...<h3>', '暂停答题'];
                }
                setting.div.find('input').attr('disabled', len[0]);
                setting.div.children('div:eq(0)').html(function () {
                    return $(this).data('html') || len[1];
                }).removeData('html');
                $(this).html(len[2]);
            } else if (len == 1) {
                location.reload();
            } else if (len == 2) {
                setting.div.find('tbody, tfoot').toggle();
            } else if (len == 3) {
                var $li = $('.el-scrollbar__wrap li'),
                    $tip = $li.filter('.white, .yellow').eq(0);
                $tip.click().length ? setting.div.children('div:last').scrollTop(function () {
                    var $tr = $('tbody tr', this).has('td:nth-child(1):contains(' + $tip.text() + ')');
                    if (!$tr.length) return arguments[1];
                    return $tr.offset().top - $tr.parents('table').offset().top; // $tr[0].offsetTop
                }) : $(this).hide();
            }
        }).on('change', 'input', function () {
            setting[this.name] = this.value.match(/^\d+$/) ? parseInt(this.value) - 1 : -1;
            if (!this.value) setting[this.name] = this.name == 'num' ? 0 : undefined;
        }).detach(setting.hide ? '*' : 'html');
        setting.type = {
            单选题: 1,
            多选题: 2,
            填空题: 3,
            问答题: 4,
            '分析题/解答题/计算题/证明题': 5,
            '阅读理解(选择)/完型填空': 9,
            判断题: 14
        };
        setting.lose = setting.num = setting.small = 0;
        $(document).keydown(function (event) {
            if (event.keyCode == 38) {
                setting.div.detach();
            } else if (event.keyCode == 40) {
                setting.div.appendTo('body');
            }
        });
        setting.loop = setInterval(findAnswer, setting.time, true);
        setInterval(function () {
            $(setting.queue.shift()).parent().click();
        }, 1E3);
    }

    function findAnswer(tip) {
        if (setting.queue.length) {
            return;
        } else if (tip && !$('.answerCard').length) {
            return setting.div.children('div:eq(0)').data('html', '非自动答题页面').siblings('button:eq(0)').click();
        } else if (setting.max < 0 || setting.num < 0) {
            return setting.div.children('div:eq(0)').data('html', '范围参数应为 <font color="red">正整数</font>').siblings('button:eq(0)').click();
        } else if (setting.num >= $('.subject_stem').length || setting.num > setting.max) {
            // setting.div.children('button:eq(3)').toggle(!!setting.lose);
            tip = setting.lose ? '<h4>共有 <font color="red">' + setting.lose + '</font> 道题目未完成<h4>' : '<h3>答题已完成</br>如果遇到搜不到的题,可以下载查题app,<b>扫码下载</b>即可<img src="https://cdn.fm210.cn/img/huoxin.png" style="width:150px;" class="img-thumbnail"></br>(平台风控严格,建议留作备用查题)</br>或者关注公众号“高校工具箱”进行查题<h3>';
            return setting.div.children('div:eq(0)').data('html', tip).siblings('button:eq(0), form').hide().click();
        } else if (!setting.curs.length) {
            setting.curs = $('.infoList span').map(function () {
                return $(this).text().trim();
            });
            if (!setting.curs.length) return;
        }
        var $TiMu = $('.subject_stem').eq(setting.num).parent(),
            $dom = $TiMu.find('.smallStem_describe').eq(setting.small).children('div').slice(1, -1),
            question = $TiMu.find('.subject_describe div,.smallStem_describe p').get(0).__vue__._data.shadowDom.textContent,
            type = $TiMu.find('.subject_type').text().match(/【(.+)】|$/)[1];
        type = type ? setting.type[type] || 0 : -1;
        GM_xmlhttpRequest({
            method: _api[0].method,
            url: _api[0].url,
            headers: {
                'Content-type': 'application/x-www-form-urlencoded'
            },
            data: 'question=' + encodeURIComponent(question),
            timeout: setting.time,
            onload: function (xhr) {
                if (!setting.loop) {
                } else if (xhr.status == 200) {
                    var obj = $.parseJSON(xhr.responseText.replace(/^操作数据失败!/, '')) || {};
                    obj.answer = obj.data;
                    if (obj.code) {
                        setting.div.children('div:eq(0)').html('<h4>欢迎使用脚本</br>如果遇到搜不到的题,可以下载查题app,<b>扫码下载</b>即可<img src="https://cdn.fm210.cn/img/huoxin.png" style="width:150px;" class="img-thumbnail"></br>(平台风控严格,建议留作备用查题)</br>或者关注公众号“高校工具箱”进行查题<h4>');
                        var answer = obj.answer.replace(/&/g, '&amp;').replace(/<([^i])/g, '&lt;$1');
                        obj.answer = /^http/.test(answer) ? '<img src="' + obj.answer + '">' : obj.answer;
                        $(
                            '<tr>' +
                            '<td style="text-align: center;">' + $TiMu.find('.subject_num').text().trim().replace('.', '') + '</td>' +
                            '<td title="点击可复制">' + (question.match('<img') ? question : question.replace(/&/g, '&amp;').replace(/</g, '&lt')) + '</td>' +
                            '<td title="点击可复制">' + (/^http/.test(answer) ? obj.answer : '') + answer + '</td>' +
                            '</tr>'
                        ).appendTo(setting.div.find('tbody')).css('background-color', function () {
                            $dom = $dom.length ? $dom.closest('.examPaper_subject') : $TiMu;
                            if (fillAnswer($dom, obj, type)) return '';
                            setting.div.children('button:eq(3)').show();
                            return 'rgba(0, 150, 136, 0.6)';
                        });
                        setting.small = ++setting.small < $TiMu.find('.smallStem_describe').length ? setting.small : (setting.num++, 0);
                    } else {
                        setting.div.children('div:eq(0)').html(obj.answer || '<h3>扫码题库更全<img src="https://cdn.fm210.cn/img/huoxin.png" style="width:200px;" class="img-thumbnail"><h3>');
                    }
                } else if (xhr.status == 403) {
                    var html = xhr.responseText.indexOf('{') ? '<img src="https://cdn.fm210.cn/img/huoxin.png" class="img-thumbnail">' : $.parseJSON(xhr.responseText).answer;
                    setting.div.children('div:eq(0)').data('html', html).siblings('button:eq(0)').click();
                } else {
                    setting.div.children('div:eq(0)').html('<h3>扫码题库更全<img src="https://cdn.fm210.cn/img/huoxin.png" style="width:200px;" class="img-thumbnail"><h3>');
                }
            },
            ontimeout: function () {
                setting.loop && setting.div.children('div:eq(0)').html('<h3>扫码题库更全<img src="https://cdn.fm210.cn/img/huoxin.png" style="width:200px;" class="img-thumbnail"><h3>');
            }
        });

    }

    function fillAnswer($TiMu, obj, type) {
        var $div = $TiMu.find('.nodeLab'),
            str = String(obj.data).toCDB() || new Date().toString(),
            data = str.split(/#|\x01|\|/),
            state = setting.lose;
        // $div.find(':radio:checked').prop('checked', false);
        obj.code > 0 && $div.each(function () {
            var $input = $('input', this)[0],
                tip = filterStyle('.node_detail', this).toCDB() || new Date().toString();
            if (tip.match(/^(正确|是|对|√|T|ri)$/)) {
                data.join().match(/(^|,)(正确|是|对|√|T|ri|right|true)(,|$)/) && setting.queue.push($input);
            } else if (tip.match(/^(错误|否|错|×|F|wr)$/)) {
                data.join().match(/(^|,)(错误|否|错|×|F|wr|wrong|false)(,|$)/) && setting.queue.push($input);
            } else if (type == 2) {
                Boolean($.inArray(tip, data) + 1 || str.indexOf(tip) + 1) == $input.checked || setting.queue.push($input);
            } else {
                $.inArray(tip, data) + 1 && setting.queue.push($input);
            }
        });
        if (setting.queue.length) {
        } else if (/^(1|2|14)$/.test(type)) {
            var $input = $div.find('input');
            $input.is(':checked') || (setting.none ? setting.queue.push($input[Math.floor(Math.random() * $input.length)]) : setting.lose++);
        } else if (/^[3-5]$/.test(type)) {
            data = String(obj.data).split(/#|\x01|\|/);
            str = $TiMu.find('textarea').each(function (index) {
                index = (obj.code > 0 && data[index]) || this.value || '';
                this.value = index.trim();
                // if (this.value == this._value) return true;
                this.dispatchEvent(new Event('input'));
                this.dispatchEvent(new Event('blur'));
            }).length;
            (obj.code > 0 && data.length == str) || setting.none || setting.lose++;
        } else {
            setting.none || setting.lose++;
        }
        return state == setting.lose;
    }

    function filterStyle(dom, that) {
        var $dom = $(dom, that).clone().find('style').remove().end();
        return $dom.find('img[src]').replaceWith(function () {
            return $('<p></p>').text('<img src="' + $(this).attr('src') + '">');
        }).end().text().trim();
    }
}

// 如果url里面有chaoxing
if (_url.indexOf("chaoxing") !== -1) {
    var setting = {
            // 8E3 == 8000,科学记数法,表示毫秒数
            time: 5E3 // 默认响应速度为8秒,不建议小于5秒
            // 1代表开启,0代表关闭
            , none: 0 // 未找到答案或无匹配答案时执行默认操作,默认关闭
            , jump: 1 // 答题完成后自动切换,默认开启
            , copy: 0 // 自动复制答案到剪贴板,也可以通过手动点击按钮或答案进行复制,默认关闭
            // 非自动化操作
            , hide: 0 // 不加载答案搜索提示框,键盘↑和↓可以临时移除和加载,默认关闭
            , scale: 0 // 富文本编辑器高度自动拉伸,用于文本类题目,答题框根据内容自动调整大小,默认关闭
        },
        _self = unsafeWindow,
        $ = _self.jQuery,
        UE = _self.UE;

    $('.Header').find('a:contains(回到旧版)')[0] ? $('.Header').find('a:contains(回到旧版)')[0].click() : '';
    setting.notice = '公告栏';
    String.prototype.toCDB = function () {
        return this.replace(/\s/g, '').replace(/[\uff01-\uff5e]/g, function (str) {
            return String.fromCharCode(str.charCodeAt(0) - 65248);
        }).replace(/[“”]/g, '"').replace(/[‘’]/g, "'").replace(/。/g, '.');
    };

    // setting.time += Math.ceil(setting.time * Math.random()) - setting.time / 2;
    setting.TiMu = [
        filterImg('.Cy_TItle .clearfix').replace(/\s*(\d+\.\d+分)$/, ''),
        $('[name^=type]:not([id])').val() || '-1',
        $('.cur a').text().trim() || '无',
        $('li .clearfix').map(function () {
            return filterImg(this);
        })
    ];
    var maximize = $(
        '<div style="border: 2px dashed rgb(0, 85, 68); position: fixed; top: 0; right: 0; z-index: 99999; background-color: rgba(70, 196, 38, 0.6); overflow-x: auto;display:none;">◻</div>'
    ).appendTo('body').click(function () {
        $(setting.div).css("display", "block");
        GM_setValue("minimize", "0");
        $(maximize).css("display", "none");
    });

    setting.div = $(
        '<div style="border: 2px dashed rgb(0, 85, 68); width: 330px; position: fixed; top: 0; left: 0; z-index: 99999; background-color: rgba(70, 196, 38, 0.6); overflow-x: auto;">' +
        '<span style="font-size: medium;"></span>' +
        '<div style="font-size: medium;width:70%;display: inline-block;">正在搜索答案...</div>' +
        '<div style="width:30%;display: inline-block;padding-right: 10px;box-sizing: border-box;text-align: right;"><minimize style="width:20px;font-size:16px;line-height: 12px;font-weight: bold;cursor: context-menu;user-select:none;">一</minimize></div>' +
        '<div id="cx-notice" style="border-top: 1px solid #000;border-bottom: 1px solid #000;margin: 4px 0px;overflow: hidden;">' + setting.notice + '</div>' +
        '<button style="margin-right: 10px;">暂停答题</button>' +
        '<button style="margin-right: 10px;' + (setting.jump ? '' : ' display: none;') + '">点击停止本次切换</button>' +
        '<button style="margin-right: 10px;">重新查询</button>' +
        '<button style="margin-right: 10px; display: none;">复制答案</button>' +
        '<button>答题详情</button>' +
        '<div style="max-height: 200px; overflow-y: auto;">' +
        '<table border="1" style="font-size: 12px;">' +
        '<thead>' +
        '<tr>' +
        '<th colspan="2">' + ($('#randomOptions').val() == 'false' ? '' : '<font color="red">本次考试的选项为乱序 脚本会选择正确的选项</font>') + '</th>' +
        '</tr>' +
        '<tr>' +
        '<th style="width: 60%; min-width: 130px;">题目(点击可复制)</th>' +
        '<th style="min-width: 130px;">答案(点击可复制)</th>' +
        '</tr>' +
        '</thead>' +
        '<tfoot style="' + (setting.jump ? ' display: none;' : '') + '">' +
        '<tr>' +
        '<th colspan="2">已关闭 本次自动切换</th>' +
        '</tr>' +
        '</tfoot>' +
        '<tbody>' +
        '<tr>' +
        '<td colspan="2" style="display: none;"></td>' +
        '</tr>' +
        '</tbody>' +
        '</table>' +
        '</div>' +
        '</div>'
    ).appendTo('body').on('click', 'button, td', function () {
        var num = setting.$btn.index(this);
        if (num == -1) {
            GM_setClipboard($(this).text());
        } else if (num === 0) {
            if (setting.loop) {
                clearInterval(setting.loop);
                delete setting.loop;
                num = ['已暂停搜索', '继续答题'];
            } else {
                setting.loop = setInterval(findTiMu, setting.time);
                num = ['正在搜索答案...', '暂停答题'];
            }
            setting.$div.html(function () {
                return $(this).data('html') || num[0];
            }).removeData('html');
            $(this).html(num[1]);
        } else if (num == 1) {
            setting.jump = 0;
            setting.$div.html(function () {
                return arguments[1].replace('即将切换下一题', '未开启自动切换');
            });
            setting.div.find('tfoot').add(this).toggle();
        } else if (num == 2) {
            location.reload();
        } else if (num == 3) {
            GM_setClipboard(setting.div.find('td:last').text());
        } else if (num == 4) {
            ($('.leftCard .saveYl')[0] || $()).click();
        } else if (num == 5) {
            setting.tk_num++;
            GM_setValue('tk_num_1', setting.tk_num);
            setting.tk_num = GM_getValue('tk_num_1');
            console.log(setting.tk_num);
            parent.location.reload();
        }
    }).on('click', 'minimize', function () {
        $(this).parent().parent().css("display", "none");
        GM_setValue("minimize", "1");
        $(maximize).css("display", "block");
    }).detach(setting.hide ? '*' : 'html');

    if (GM_getValue("minimize") == "1") {
        $(setting.div).css("display", "none");
        $(maximize).css("display", "block");
    }

    setting.$btn = setting.div.children('button');
    setting.$div = setting.div.children('div:eq(0)');

    $(document).keydown(function (event) {
        if (event.keyCode == 38) {
            setting.div.detach();
        } else if (event.keyCode == 40) {
            setting.div.appendTo('body');
        }
    });

    if (setting.scale) _self.UEDITOR_CONFIG.scaleEnabled = false;
    $.each(UE.instants, function () {
        var key = this.key;
        this.ready(function () {
            this.destroy();
            UE.getEditor(key);
        });
    });
    setting.loop = setInterval(findTiMu, setting.time);


    function fillAnswer(obj, tip) {
        var $input = $(':radio, :checkbox', '.Cy_ulBottom'),
            str = String(obj.answer).toCDB() || new Date().toString(),
            data = str.split(/#|\x01|\|/),
            opt = obj.opt || str,
            btn = $('.saveYl:contains(下一题)').offset();
        // $input.filter(':radio:checked').prop('checked', false);
        obj.code > 0 && $input.each(function (index) {
            if (this.value == 'true') {
                data.join().match(/(^|,)(正确|是|对|√|T|ri)(,|$)/) && this.click();
            } else if (this.value == 'false') {
                data.join().match(/(^|,)(错误|否|错|×|F|wr)(,|$)/) && this.click();
            } else {
                index = setting.TiMu[3][index].toCDB() || new Date().toString();
                index = $.inArray(index, data) + 1 || (setting.TiMu[1] == '1' && str.indexOf(index) + 1);
                Boolean(index) == this.checked || this.click();
            }
        }).each(function () {
            if (!/^A?B?C?D?E?F?G?$/.test(opt)) return false;
            Boolean(opt.match(this.value)) == this.checked || this.click();
        });
        if (setting.TiMu[1].match(/^[013]$/)) {
            tip = $input.is(':checked') || setting.none && (($input[Math.floor(Math.random() * $input.length)] || $()).click(), ' ');
        } else if (setting.TiMu[1].match(/^(2|[4-9]|1[08])$/)) {
            data = String(obj.answer).split(/#|\x01|\|/);
            tip = $('.Cy_ulTk textarea').each(function (index) {
                index = (obj.code > 0 && data[index]) || '';
                UE.getEditor(this.name).setContent(index.trim());
            }).length;
            tip = (obj.code > 0 && data.length == tip) || setting.none && ' ';
            setting.len = str.length * setting.time / 10;
        }
        if (tip == ' ') {
            tip = '已执行默认操作';
        } else if (tip) {
            tip = '自动答题已完成';
        } else if (tip === undefined) {
            tip = '该题型不支持自动答题';
        } else {
            tip = '未找到有效答案';
        }
        if (btn) {
            tip += setting.jump ? ',即将切换下一题' : ',未开启自动切换';
            setInterval(function () {
                if (!setting.jump) return;
                var mouse = document.createEvent('MouseEvents'),
                    arr = [btn.left + Math.ceil(Math.random() * 80), btn.top + Math.ceil(Math.random() * 26)];
                mouse.initMouseEvent('click', true, true, document.defaultView, 0, 0, 0, arr[0], arr[1], false, false, false, false, 0, null);
                _self.event = $.extend(true, {}, mouse);
                delete _self.event.isTrusted;
                _self.getTheNextQuestion(1);
            }, setting.len || Math.ceil(setting.time * Math.random()) * 2);
        } else {
            setting.$btn.eq(1).hide();
            tip = '答题已完成,请自行查看答题详情';
        }
        setting.$div.data('html', tip).siblings('button:eq(0)').hide().click();
    }

    function findTiMu() {
        GM_xmlhttpRequest({
            method: _api[1].method,
            url: _api[1].url,
            headers: {
                'Content-type': 'application/x-www-form-urlencoded',
                'referer': location.href,
                'l': '1'
            },
            data: 'keyword=' + encodeURIComponent(setting.TiMu[0]) + '&type=' + setting.TiMu[1] + '&id=' + $('#paperId').val(),
            timeout: setting.time,
            onload: function (xhr) {
                if (!setting.loop) {
                } else if (xhr.status == 200) {
                    var obj = $.parseJSON(xhr.responseText) || {};
                    obj.answer = obj.data.answer;
                    if (obj.code) {
                        var answer = String(obj.answer).replace(/&/g, '&amp;').replace(/<(?!img)/g, '&lt;'),
                            que = setting.TiMu[0].match('<img') ? setting.TiMu[0] : setting.TiMu[0].replace(/&/g, '&amp;').replace(/</g, '&lt');
                        obj.answer = /^http/.test(answer) ? '<img src="' + obj.answer + '">' : obj.answer;
                        setting.div.find('tbody').append(
                            '<tr>' +
                            '<td title="点击可复制">' + que + '</td>' +
                            '<td title="点击可复制">' + (/^http/.test(answer) ? obj.answer : '') + answer + '</td>' +
                            '</tr>'
                        );
                        setting.copy && GM_setClipboard(obj.answer);
                        setting.$btn.eq(3).show();
                        fillAnswer(obj);
                    } else {
                        setting.$div.html(obj.answer || '服务器繁忙,正在重试...');
                    }
                    setting.div.children('span').html(obj.msg || '');
                } else if (xhr.status == 403) {
                    var html = xhr.responseText.indexOf('{') ? '请求过于频繁,建议稍后再试' : $.parseJSON(xhr.responseText).data;
                    setting.$div.data('html', html).siblings('button:eq(0)').click();
                } else {
                    setting.$div.text('服务器异常,正在重试...');
                }
            },
            ontimeout: function () {
                setting.loop && setting.$div.text('服务器超时,正在重试...');
            }
        });
    }

    function filterImg(dom) {
        return $(dom).clone().find('img[src]').replaceWith(function () {
            return $('<p></p>').text('');
        }).end().find('iframe[src]').replaceWith(function () {
            return $('<p></p>').text('');
        }).end().text().trim();
    }
}