【已更新】超星尔雅刷网课插件支持自动答题、阅读时长~
市面上超星、尔雅刷课的软件和脚本很多,但是真正好用的却是很少!有的功能比较少、而有的付费价格太高!今天介绍的这款超星尔雅刷课插件却有不一样的体验!它支持自动挂机看尔雅MOOC,支持视频、音频、文档、图书自动完成,章节测验自动答题提交,支持自动切换任务点、挂机阅读时长、自动登录等,解除各类功能限制,开放自定义参数!
软件截图:
软件功能介绍
V4.0.0版本为超星网课助手的最后一个版本,脚本已停止维护。
脚本功能
解除视频播放限制
支持自动挂机、切换窗口不暂停
屏蔽视频内的题目、图片、PPT
倍速播放、进度条拖动(使用该功能会导致出现不良记录)
自动答题,高准确率题库
支持章节测验、作业,已取消支持考试
支持自动提交或暂时保存答案
全自动挂机切换
支持多视频、多任务点,支持未开放章节
支持自定义响应速度
支持自动切换课程
其他任务点
音频任务点,支持自动播放
图书阅读任务点(非课程阅读)
文档阅读任务点,PPT类任务点自动完成
高级功能
挂机课程阅读时长,需要自行打开阅读页面
自动登录功能需要配置相关参数
复习模式:完整挂机视频(音频)时长,支持挂机任务点已完成的视频和音频
队列模式:单页面所有任务点,支持排队完成或同时进行
脚本亮点
使用html5播放器,支持自动倍速、默认静音等功能,取消支持flash播放器
支持单页面多视频、多测验、视频和测验混合等,支持文档课件等资源下载
支持多账号同时挂机(多开需要使用隐身窗口,建议使用虚拟机)
支持选择视频播放的默认资源线路,支持选择清晰度,默认公网1、标清
自动答题功能已支持单选、多选、判断、填空、分录、资料、简答、论述、计算、名词解释、口语等题型
支持手动更改和补充答案,支持暂时保存已作答的题目
课程阅读支持自定义挂机时间,临时停止可以点击右侧返回顶部按钮
支持解除文本类题目答题框的粘贴限制和大小限制,支持解除手机端限制
切换窗口不会有视频的短时暂停,支持用户主动暂停视频播放,解析视频下载链接
支持自定义部分功能的开启或关闭(脚本18~57行提供自定义参数的配置,详情可见脚本中的注释)
常见问题
Q1:视频无法自动播放,浏览器窗口恢复后视频才播放。
A1:由于浏览器安全策略限制,html5播放器不支持在窗口最小化时自动播放视频(已测试爱奇艺、腾讯视频、YouTube,均存在此问题)。解决方法:不要最小化浏览器窗口(窗口可以被覆盖,全屏游戏也不影响)。
感谢
@baochen 提交脚本BUG和参与脚本新功能的测试
@Blacrazy 提交优质建议和参与脚本新功能的测试
声明
刷课有风险,脚本的设计已尽可能避免被检测,但仍有出现不良记录的可能性,请合理使用脚本。
使用倍速播放、进度条拖动、秒过功能会导致出现不良记录,请慎重使用。
默认操作,即单选、多选、判断题随机选择,填空、简答等文本类题目不修改。
题库的答案准确率较高,但无法保证自动答题功能始终可用,也无法保证答案全部正确。
自动答题功能会采集部分非隐私数据上传,仅用于提升答案匹配度。
每次脚本更新都会导致自定义参数重置为默认值,如有设置,请更新后及时修改。
更新日志:
v4.1.1
19/1/2021 修改html播放器处理机制,优化部分代码结构
v4.1.0
21/12/2020 移除部分失效功能,修复部分功能异常,优化queue、video、audio、face参数功能和部分代码结构
v4.0.3
11/12/2020 新增bypass参数功能,修复course参数功能异常
v4.0.2
6/12/2020 填空类无答案不修改,修复部分功能异常,优化部分代码结构,移除失效功能
v4.0.1
4/12/2020 删除token参数,使之符合最新的脚本发布规则
v4.0.0
18/4/2020 V4.0.0版本为超星网课助手的最后一个版本,脚本已停止维护
v3.5.1
16/4/2020 精简代码,优化部分代码结构
v3.5.0
14/4/2020 修复自动答题功能异常
v3.4.4
14/4/2020 修复自动答题功能异常
v3.4.3
13/4/2020 优化部分代码结构
v3.4.2
12/4/2020 修复填空题无法自动答题,优化部分代码结构
v3.4.1
10/4/2020 优化音视频下载功能,优化部分代码结构
v3.4.0
7/4/2020 新增队列模式、资源下载、课堂测验自动答题,优化限制解除功能,优化部分代码结构
v3.3.1
22/3/2020 修复题目循环查询,精简和优化部分代码结构
v3.3.0
15/3/2020 新增超时跳过当前题目按钮,修复脚本功能异常,优化部分代码结构
v3.2.2
2/3/2020 修复填空类题目答案丢失空格、标点符号异常等问题
v3.2.1
2/3/2020 优化音频题目的采集检索和图片答案的自动答题,提升答案匹配度
v3.2.0
29/2/2020 恢复自动提交参数,优化答案匹配,移除上传选项功能,优化部分代码结构
v3.1.1
11/2/2020 修复lock参数功能异常
v3.1.0
31/1/2020 优化任务点自定义开关和完成的处理方式,优化答案匹配,优化部分代码结构
v3.0.0
24/12/2019 新增视频下载功能,优化答案匹配,精简参数,重写和优化部分代码,修复脚本异常
v2.5.1
10/11/2019 修复自动答题功能异常,优化答案采集功能
v2.5.0
1/11/2019 新增lock参数,优化自动答题功能,修复特殊情况下的脚本功能异常,优化部分代码结构
v2.4.4
9/9/2019 优化异常情况处理,优化部分代码结构
v2.4.3
30/8/2019 新增异常处理、提示信息,修复跨域问题、作业答题,优化phone参数功能、更改默认值为开启
v2.4.2
21/8/2019 修复自动切换课程功能异常,更改check参数的默认值为关闭,优化部分代码结构
v2.4.1
9/8/2019 优化自动答题功能,优化部分代码结构
v2.4.0
25/7/2019 新增review、total,优化核心代码、任务点功能、限制解除、自动登录,优化部分代码结构
v2.3.0
2/7/2019 新增safe参数和答案采集,优化自动答题和自动保存,修复脚本功能异常,优化部分代码结构
v2.2.5
31/5/2019 优化部分代码结构
v2.2.4
30/5/2019 优化部分代码结构
v2.2.3
25/5/2019 修复自动切换功能异常,优化自动切换功能处理逻辑,优化部分代码结构
v2.2.2
19/5/2019 优化题库兼容性,修复自动答题功能异常,优化图片答案的显示,优化部分代码结构
v2.2.1
7/5/2019 修复自动答题功能异常,优化部分代码结构
v2.2.0
4/5/2019 新增支持edu.cn域名和新任务点功能,修复特殊情况下的脚本功能异常,优化部分代码结构
v2.1.0
11/3/2019 修复Edge浏览器异常,新增自动登录功能相关参数,优化部分功能的兼容性和使用体验
v2.0.0
20/2/2019 功能完善和代码优化,更新日志详细内容在反馈区
v1.8.0
11/10/2018 新增wait、none、copy、scale参数,修复自动答题功能异常,优化按钮显示和代码结构
v1.7.1
3/10/2018 章节测验和视频共同排队并依次完成,修复flash播放器白屏问题,优化显示提示信息
v1.7.0
25/9/2018 修复自动答题功能,移除考试功能,移除已失效的参数,新增auto自动提交参数
v1.6.0
17/9/2018 新增支持html5播放器,自动适配系统默认播放器(支持自定义默认播放器),修改部分参数
v1.5.2
11/9/2018 新增muted参数配置视频静音播放功能,修复考试功能错误加载,优化部分代码结构
v1.5.1
2/9/2018 优化自定义参数的处理方式(临时取消任务点),优化脚本错误处理机制,优化部分代码结构
v1.5.0
23/8/2018 新增proxy参数配置代理服务器,原生js改写ajax请求防止监听,部分代码结构优化
v1.4.3
16/8/2018 修改自动答题功能的加载方式和判断逻辑,屏蔽ajax全局事件监听,增强脚本安全性
v1.4.2
8/8/2018 自动切换功能代码重写优化逻辑,部分代码结构优化
v1.4.1
26/7/2018 优化视频播放的默认资源线路的选择方式(存在兼容性问题),精简命令,代码结构微调
v1.4.0
22/7/2018 新增修改视频播放的默认资源线路,优化代码逻辑,修复特殊情况下的脚本功能异常
v1.3.0
18/7/2018 启用沙盒增强脚本安全性,替换参数switch为jump,脚本结构微调
v1.2.1
15/7/2018 进一步jQ改写和优化逻辑,修复部分章节无法跳转,修复自动答题功能可能出现的异常
脚本代码:
// ==UserScript==
// @name超星网课助手
// @namespacewyn665817@163.com
// @version4.1.1
// @description自动挂机看尔雅MOOC,支持视频、音频、文档、图书自动完成,章节测验自动答题提交,支持自动切换任务点、挂机阅读时长、自动登录等,解除各类功能限制,开放自定义参数
// @authorwyn665817
// @match://.chaoxing.com/
// @match://.edu.cn/
// @connectforestpolice.org
// @run-atdocument-end
// @grantunsafeWindow
// @grantGM_xmlhttpRequest
// @grantGM_setClipboard
// @supportURLhttps://greasyfork.org/zh-CN/scripts/369625/feedback
// @licenseMIT
// ==/UserScript==
// 设置修改后,需要刷新或重新打开网课页面才会生效
varsetting={
// 5E3 == 5000,科学记数法,表示毫秒数
time:5E3// 默认响应速度为5秒,不建议小于3秒
,review:0// 复习模式,完整挂机视频(音频)时长,支持挂机任务点已完成的视频和音频,默认关闭
,queue:1// 队列模式,开启后任务点逐一完成,关闭则单页面所有任务点同时进行,默认开启
// 1代表开启,0代表关闭
,video:0// 视频支持后台、切换窗口不暂停,支持多视频,默认关闭
,work:1// 自动答题功能(章节测验),作业需要手动开启查询,高准确率,默认开启
,audio:0// 音频自动播放,与视频功能共享vol和rate参数,默认关闭
,book:0// 图书阅读任务点,非课程阅读任务点,默认关闭
,docs:0// 文档阅读任务点,PPT类任务点自动完成阅读任务,默认关闭
// 本区域参数,上方为任务点功能,下方为独立功能
,jump:0// 自动切换标签、章节、课程(需要配置course参数),默认关闭
,read:&9;0&9;// 挂机课程阅读时间,单位是分钟,&9;65&9;代表挂机65分钟,请手动打开阅读页面,默认&9;0&9;分钟
,face:0// 解除面部识别(不支持二维码类面部采集),此功能仅为临时解除,默认关闭
,total:0// 显示课程进度的统计数据,在学习进度页面的上方展示,默认关闭
// 仅开启video(audio)时,修改此处才会生效
,line:&9;公网1&9;// 视频播放的默认资源线路,此功能适用于系统默认线路无资源,默认&9;公网1&9;
,http:&9;标清&9;// 视频播放的默认清晰度,无效参数则使用系统默认清晰度,默认&9;标清&9;
// 本区域参数,上方为video功能独享,下方为audio功能共享
,vol:&9;0&9;// 默认音量的百分数,设定范围:[0,100],&9;0&9;为静音,默认&9;0&9;
,rate:&9;1&9;// 视频播放默认倍率,参数范围0∪[0.0625,16],&9;0&9;为秒过,默认&9;1&9;倍
// 仅开启work时,修改此处才会生效
,auto:0// 答题完成后自动提交,默认开启
,none:0// 无匹配答案时执行默认操作,关闭后若题目无匹配答案则会暂时保存已作答的题目,默认开启
,scale:0// 富文本编辑器高度自动拉伸,用于文本类题目,答题框根据内容自动调整大小,默认关闭
// 仅开启jump时,修改此处才会生效
,course:0// 当前课程完成后自动切换课程,仅支持按照根目录课程顺序切换,默认关闭
,lock:1// 跳过未开放(图标是锁)的章节,即闯关模式或定时发放的任务点,默认开启
// 自动登录功能配置区
,school:&9;账号为手机号可以不修改此参数&9;// 学校/单位/机构码,要求完整有效可查询,例如&9;清华大学&9;
,username:&9;&9;// 学号/工号/借书证号(邮箱/手机号/账号),例如&9;2018010101&9;,默认&9;&9;
,password:&9;&9;// 密码,例如&9;123456&9;,默认&9;&9;
},
_self=unsafeWindow,
url=location.pathname,
top=_self;
if(url!=&9;/studyApp/studying&9;&&top!=_self.top)document.domain=location.host.replace(/.+?\./,&9;&9;);
try{
while(top!=_self.top){
top=top.parent.document?top.parent:_self.top;
if(top.location.pathname==&9;/mycourse/studentstudy&9;)break;
}
}catch(err){
// console.log(err);
top=_self;
}
var$=_self.jQuerytop.jQuery,
parent=_self==top?self:_self.parent,
Ext=_self.Extparent.Ext{},
UE=_self.UE,
vjs=_self.videojs,
dl=&9;https://d0.ananas.chaoxing.com/download/&9;;
String.prototype.toCDB=function(){
returnthis.replace(/\s/g,&9;&9;).replace(/[\uff01-\uff5e]/g,function(str){
returnString.fromCharCode(str.charCodeAt(0)-65248);
}).replace(/[“”]/g,&9;"&9;).replace(/[‘’]/g,"&9;").replace(/。/g,&9;.&9;);
};
_self.alert=console.log;
setting.normal=&9;&9;;// &9;:visible&9;
// setting.time += Math.ceil(setting.timeMath.random()) - setting.time / 2;
setting.job=[&9;:not()&9;];
setting.video&&setting.job.push(&9;iframe[src="/video/index.html"]&9;);
setting.work&&setting.job.push(&9;iframe[src="/work/index.html"]&9;);
setting.audio&&setting.job.push(&9;iframe[src="/audio/index.html"]&9;);
setting.book&&setting.job.push(&9;iframe[src="/innerbook/index.html"]&9;);
setting.docs&&setting.job.push(&9;iframe[src="/ppt/index.html"]&9;,&9;iframe[src="/pdf/index.html"]&9;);
if(url==&9;/mycourse/studentstudy&9;){
_self.checkMobileBrowerLearn=$.noop;
varclassId=location.search.match(/cla[zs]{2}id=(\d+)/i)[1]0,
courseId=_self.courseIdlocation.search.match(/courseId=(\d+)/i)[1]0;
!setting.jumpsetting.lock$(&9;coursetree&9;).on(&9;click&9;,&9;[onclick=void], [href=void]&9;,function(){
_self.getTeacherAjax(courseId,classId,$(this).parent().attr(&9;id&9;).slice(3));
});
}elseif(url==&9;/ananas/modules/video/index.html&9;&&setting.video){
if(setting.review)_self.greenligth=Ext.emptyFn;
vjs.hook(&9;beforesetup&9;,hookVideoB);
vjs.hook(&9;setup&9;,hookVideoS);
Ext.isIos=Ext.isAndroid=false;
}elseif(url==&9;/work/doHomeWorkNew&9;url==&9;/api/work&9;url==&9;/work/addStudentWorkNewWeb&9;){
if(!UE){
varlen=($Ext.queryArray)(&9;font:contains(未登录)&9;,document).length;
setTimeout(len==1?top.location.reload:parent.greenligth,setting.time);
}elseif(setting.work){
setTimeout(relieveLimit,0);
beforeFind();
}
}elseif(url==&9;/ananas/modules/audio/index.html&9;&&setting.audio){
if(setting.review)_self.greenligth=Ext.emptyFn;
vjs.hook(&9;beforesetup&9;,hookAudioB);
vjs.hook(&9;setup&9;,hookAudioS);
}elseif(url==&9;/ananas/modules/innerbook/index.html&9;&&setting.book){
setTimeout(function(){
if(getTip())_self.setting?_self.top.onchangepage(_self.getFrameAttr(&9;end&9;)):_self.greenligth();
},setting.time);
}elseif(url.match(/^\/ananas\/modules\/(ppt|pdf)\/index\.html$/)&&setting.docs){
setTimeout(function(){
if(getTip())_self.setting?_self.finishJob():_self.greenligth();
},setting.time);
frameElement.setAttribute(&9;download&9;,1);
if(_self.downloadNum==&9;&9;)_self.downloadNum=&9;1&9;;
}elseif(url==&9;/knowledge/cards&9;){
$&&checkToNext();
}elseif(url.match(/^\/(course|zt)\/\d+\.html$/)){
setTimeout(function(){
+setting.read&&_self.sendLogs&&$(&9;.course_section:eq(0) .chapterText&9;).click();
},setting.time);
}elseif(url==&9;/ztnodedetailcontroller/visitnodedetail&9;){
setting.read=60/$(&9;.course_section&9;).length;
setting.read&&_self.sendLogs&&autoRead();
}elseif(url.match(/^\/visit\/(courses|interaction)$/)){
setting.face&&$(&9;.zmodel&9;).on(&9;click&9;,&9;[onclick^=openFaceTip]&9;,function(){
varid=$(this).attr(&9;onclick&9;).match(/(\d+).+?(\d+)/)[];
$(this).closest(&9;li&9;).find(&9;[onclick^=openFaceTip]&9;).removeAttr(&9;onclick&9;).attr({
target:&9;_blank&9;,
href:&9;stucoursemiddle?courseid=&9;+id[1]+&9;&clazzid=&9;+id[2]
});
alert(&9;本课程已临时解除面部识别&9;);
});
}elseif(url==&9;/mycourse/studentcourse&9;){
vargv=location.search.match(/d=\d+&/g);
setting.total&&$(&9;<a>&9;,{
href:&9;/moocAnalysis/chapterStatisticByUser?classI&9;+gv[1]+&9;courseI&9;+gv[0]+&9;userId=&9;+_self.getCookie(&9;_uid&9;)+&9;&ut=s&9;,
target:&9;_blank&9;,
title:&9;点击查看章节统计&9;,
style:&9;margin: 0 25px;&9;,
html:&9;本课程共&9;+$(&9;.icon&9;).length+&9;节,剩余&9;+$(&9;em:not(.openlock)&9;).length+&9;节未完成&9;
}).appendTo(&9;.zt_logo&9;).parent().width(&9;auto&9;);
}elseif(location.host.match(/^passport2/)){
setting.username&&getSchoolId();
}elseif(location.hostname==&9;i.mooc.chaoxing.com&9;){
_self.layui.use(&9;layer&9;,function(){
this.layer.open({content:&9;拖动进度条、倍速播放、秒过会导致不良记录!&9;,title:&9;超星网课助手提示&9;,btn:&9;我已知悉&9;,offset:&9;t&9;,closeBtn:0});
});
}elseif(url==&9;/work/selectWorkQuestionYiPiYue&9;){
submitAnswer(getIframe().parent(),$.extend(true,[],parent._data));
}
functiongetTip(){
returntop!=_self&&jobSort($Ext.query);
}
functionjobSort($){
varfn=$.fn?[getIframe(1),&9;length&9;]:[self,&9;dom&9;],
sel=setting.job.join(&9;, :not(.ans-job-finished) > .ans-job-icon&9;+setting.normal+&9; ~ &9;);
if(!getIframe()[fn[1]]getIframe().parent().is(&9;.ans-job-finished&9;))return0;
if(!setting.queue$(sel,fn[0].parent.document)[0]==fn[0].frameElement)return1;
setInterval(function(){
$(sel,fn[0].parent.document)[0]==fn[0].frameElement&&fn[0].location.reload();
},setting.time);
}
functiongetIframe(tip,win,job){
if(!$)returnExt.get(frameElement[]).parent().child(&9;.ans-job-icon&9;)Ext.get([]);
do{
win=win?win.parent:_self;
job=$(win.frameElement).prevAll(&9;.ans-job-icon&9;);
}while(!job.length&&win.parent.frameElement);
returntip?win:job;
}
functionhookVideoB(el,config){
varExtArr=Ext.Array,
line=ExtArr.filter(ExtArr.map(config.playlines,function(value,index){
returnvalue.label==setting.line&&index;
}),function(value){
returnExt.isNumber(value);
})[0]0,
http=ExtArr.filter(config.sources,function(value){
returnvalue.label==setting.http;
})[0];
config.playlines.unshift(config.playlines[line]);
config.playlines.splice(line+1,1);
config.plugins.videoJsResolutionSwitcher.default=http?http.res:360;
config.plugins.studyControl.enableSwitchWindow=1;
config.plugins.timelineObjects.url=&9;/richvideo/initdatawithviewer?&9;;
config.plugins.seekBarControl.enableFastForward=1;
config.playbackRates=[1,1.25,1.5,2];
setting.queuevjs.registerPlugin(&9;studyControl&9;,Ext.emptyFn);
// config.preload = setting.tip ? &9;auto&9; : &9;none&9;;
returnconfig;
}
functionhookVideoS(player){
vara=&9;<a href="&9;+dl+_self.config(&9;objectid&9;)+&9;" target="_blank">&9;,
img=&9;<img src="&9;+dl+&9;e363b256c0e9bc5bd8266bf99dd6d6bb" style="margin: 6px 0 0 6px;">&9;;
player.volume(Math.round(setting.vol)/1000);
Ext.fly(player.controlBar.addChild(&9;Button&9;).el_).setHTML(a+img+&9;</a>&9;).dom.title=&9;下载视频&9;;
player.on(&9;loadstart&9;,function(){
getTip()&&this.play().catch(Ext.emptyFn);
this.playbackRate(setting.rate>16setting.rate<0.0625?1:setting.rate);
});
player.one([&9;loadedmetadata&9;,&9;firstplay&9;],function(){
setting.two=setting.rate===&9;0&9;&&setting.two<1;
setting.two&&this.options_.plugins.seekBarControl.sendLog(this.children_[0],&9;ended&9;,Math.floor(this.cache_.duration));
});
player.on(&9;ended&9;,function(){
Ext.fly(frameElement).parent().addCls(&9;ans-job-finished&9;);
});
}
functionhookAudioB(el,config){
config.plugins.studyControl.enableSwitchWindow=1;
config.plugins.seekBarControl.enableFastForward=1;
setting.queuevjs.registerPlugin(&9;studyControl&9;,Ext.emptyFn);
returnconfig;
}
functionhookAudioS(player){
vara=&9;<a href="&9;+dl+_self.config(&9;objectid&9;)+&9;" target="_blank">&9;,
img=&9;<img src="&9;+dl+&9;e363b256c0e9bc5bd8266bf99dd6d6bb" style="margin: 6px 0 0 6px;">&9;;
player.volume(Math.round(setting.vol)/1000);
player.playbackRate(setting.rate>16setting.rate<0.0625?1:setting.rate);
Ext.fly(player.controlBar.addChild(&9;Button&9;).el_).setHTML(a+img+&9;</a>&9;).dom.title=&9;下载音频&9;;
player.on(&9;loadeddata&9;,function(){
getTip()&&this.play().catch(Ext.emptyFn);
});
player.one(&9;firstplay&9;,function(){
setting.rate===&9;0&9;&&this.options_.plugins.seekBarControl.sendLog(this.children_[0],&9;ended&9;,Math.floor(this.cache_.duration));
});
player.on(&9;ended&9;,function(){
Ext.fly(frameElement).parent().addCls(&9;ans-job-finished&9;);
});
}
functionrelieveLimit(){
if(setting.scale)_self.UEDITOR_CONFIG.scaleEnabled=false;
$.each(UE.instants,function(){
varkey=this.key;
this.ready(function(){
this.destroy();
UE.getEditor(key);
});
});
}
functionbeforeFind(){
setting.regl=parent.greenligth$.noop;
if($.type(parent._data)==&9;array&9;)returnsetting.regl();
setting.div=$(
&9;<div style="border: 2px dashed rgb(0, 85, 68); width: 330px; position: fixed; top: 0; right: 0; z-index: 99999; background-color: rgba(70, 196, 38, 0.6); overflow-x: auto;">&9;+
&9;<span style="font-size: medium;"></span>&9;+
&9;<div style="font-size: medium;">正在搜索答案...</div>&9;+
&9;<button style="margin-right: 10px;">暂停答题</button>&9;+
&9;<button style="margin-right: 10px;">&9;+(setting.auto?&9;取消本次自动提交&9;:&9;开启本次自动提交&9;)+&9;</button>&9;+
&9;<button style="margin-right: 10px;">重新查询</button>&9;+
&9;<button>折叠面板</button>&9;+
&9;<div style="max-height: 300px; overflow-y: auto;">&9;+
&9;<table border="1" style="font-size: 12px;">&9;+
&9;<thead>&9;+
&9;<tr>&9;+
&9;<th style="width: 25px; min-width: 25px;">题号</th>&9;+
&9;<th style="width: 60%; min-width: 130px;">题目(点击可复制)</th>&9;+
&9;<th style="min-width: 130px;">答案(点击可复制)</th>&9;+
&9;</tr>&9;+
&9;</thead>&9;+
&9;<tfoot style="display: none;">&9;+
&9;<tr>&9;+
&9;<th colspan="3">答案提示框 已折叠</th>&9;+
&9;</tr>&9;+
&9;</tfoot>&9;+
&9;<tbody>&9;+
&9;<tr>&9;+
&9;<td colspan="3" style="display: none;"></td>&9;+
&9;</tr>&9;+
&9;</tbody>&9;+
&9;</table>&9;+
&9;</div>&9;+
&9;</div>&9;
).appendTo(&9;body&9;).on(&9;click&9;,&9;button, td&9;,function(){
varlen=$(this).prevAll(&9;button&9;).length;
if(this.nodeName==&9;TD&9;){
$(this).prev().length&&GM_setClipboard($(this).text());
}elseif(!$(this).siblings().length){
$(this).parent().text(&9;正在搜索答案...&9;);
setting.num++;
}elseif(len===0){
if(setting.loop){
clearInterval(setting.loop);
deletesetting.loop;
len=[&9;已暂停搜索&9;,&9;继续答题&9;];
}else{
setting.loop=setInterval(findAnswer,setting.time);
len=[&9;正在搜索答案...&9;,&9;暂停答题&9;];
}
setting.div.children(&9;div:eq(0)&9;).html(function(){
return$(this).data(&9;html&9;)len[0];
}).removeData(&9;html&9;);
$(this).html(len[1]);
}elseif(len==1){
setting.auto=!setting.auto;
$(this).html(setting.auto?&9;取消本次自动提交&9;:&9;开启本次自动提交&9;);
}elseif(len==2){
parent.location.reload();
}elseif(len==3){
setting.div.find(&9;tbody, tfoot&9;).toggle();
}
}).find(&9;table, td, th&9;).css(&9;border&9;,&9;1px solid&9;).end();
setting.lose=setting.num=0;
setting.data=parent._data=[];
setting.over=&9;<button style="margin-right: 10px;">跳过此题</button>&9;;
setting.curs=$(&9;script:contains(courseName)&9;,top.document).text().match(/courseName:\&9;(.+?)\&9;|$/)[1]$(&9;h1&9;).text().trim()&9;无&9;;
setting.loop=setInterval(findAnswer,setting.time);
vartip=({undefined:&9;任务点排队中&9;,0:&9;等待切换中&9;})[getTip()];
tip&&setting.div.children(&9;div:eq(0)&9;).data(&9;html&9;,tip).siblings(&9;button:eq(0)&9;).click();
}
functionfindAnswer(){
if(setting.num>=$(&9;.TiMu&9;).length){
vararr=setting.lose?[&9;共有 <font color="red">&9;+setting.lose+&9;</font> 道题目待完善(已深色标注)&9;,saveThis]:[&9;答题已完成&9;,submitThis];
setting.div.children(&9;div:eq(0)&9;).data(&9;html&9;,arr[0]).siblings(&9;button:eq(0)&9;).hide().click();
returnsetTimeout(arr[1],setting.time);
}
var$TiMu=$(&9;.TiMu&9;).eq(setting.num),
question=filterImg($TiMu.find(&9;.Zy_TItle:eq(0) .clearfix&9;)).replace(/^【.?】\s/,&9;&9;).replace(/\s(\d+\.\d+分)$/,&9;&9;),
type=$TiMu.find(&9;input[name^=answertype]:eq(0)&9;).val()&9;-1&9;;
GM_xmlhttpRequest({
method:&9;POST&9;,
url:&9;http://mooc.forestpolice.org/cx/0/&9;+encodeURIComponent(question),
headers:{
&9;Content-type&9;:&9;application/x-www-form-urlencoded&9;
},
data:&9;question=&9;+encodeURIComponent(question)+&9;&type=&9;+type,
timeout:setting.time,
onload:function(xhr){
if(!setting.loop){
}elseif(xhr.status==200){
varobj=$.parseJSON(xhr.responseText){};
if(obj.code){
setting.div.children(&9;div:eq(0)&9;).text(&9;正在搜索答案...&9;);
vartd=&9;<td style="border: 1px solid;&9;,
data=String(obj.data).replace(/&/g,&9;&&9;).replace(/<(?!img)/g,&9;<&9;);
obj.data=/^http/.test(data)?&9;<img src="&9;+obj.data+&9;">&9;:obj.data;
$(
&9;<tr>&9;+
td+&9; text-align: center;">&9;+$TiMu.find(&9;.Zy_TItle:eq(0) i&9;).text().trim()+&9;</td>&9;+
td+&9;" title="点击可复制">&9;+(question.match(&9;<img&9;)?question:question.replace(/&/g,&9;&&9;).replace(/</g,&9;<&9;))+&9;</td>&9;+
td+&9;" title="点击可复制">&9;+(/^http/.test(data)?obj.data:&9;&9;)+data+&9;</td>&9;+
&9;</tr>&9;
).appendTo(setting.div.find(&9;tbody&9;)).css(&9;background-color&9;,fillAnswer($TiMu.find(&9;ul:eq(0)&9;).find(&9;li&9;),obj,type)?&9;&9;:&9;rgba(0, 150, 136, 0.6)&9;);
setting.data[setting.num++]={
code:obj.code>0?1:0,
question:question,
option:obj.data,
type:Number(type)
};
}else{
setting.div.children(&9;div:eq(0)&9;).html(obj.datasetting.over+&9;服务器繁忙,正在重试...&9;);
}
setting.div.children(&9;span&9;).html(obj.msg&9;&9;);
}elseif(xhr.status==403){
varhtml=xhr.responseText.indexOf(&9;{&9;)?&9;请求过于频繁,建议稍后再试&9;:$.parseJSON(xhr.responseText).data;
setting.div.children(&9;div:eq(0)&9;).data(&9;html&9;,html).siblings(&9;button:eq(0)&9;).click();
}else{
setting.div.children(&9;div:eq(0)&9;).html(setting.over+&9;服务器异常,正在重试...&9;);
}
},
ontimeout:function(){
setting.loop&&setting.div.children(&9;div:eq(0)&9;).html(setting.over+&9;服务器超时,正在重试...&9;);
}
});
}
functionfillAnswer($li,obj,type){
var$input=$li.find(&9;:radio, :checkbox&9;),
str=String(obj.data).toCDB()newDate().toString(),
data=str.split(/|\x01|\|/),
opt=obj.optstr,
state=setting.lose;
// $li.find(&9;:radio:checked&9;).prop(&9;checked&9;, false);
obj.code>0&&$input.each(function(index){
if(this.value==&9;true&9;){
data.join().match(/(^|,)(正确|是|对|√|T|ri|right|true)(,|$)/)&&this.click();
}elseif(this.value==&9;false&9;){
data.join().match(/(^|,)(错误|否|错|×|F|wr|wrong|false)(,|$)/)&&this.click();
}else{
vartip=filterImg($li.eq(index).find(&9;.after&9;)).toCDB()newDate().toString();
Boolean($.inArray(tip,data)+1(type==&9;1&9;&&str.indexOf(tip)+1))==this.checkedthis.click();
}
}).each(function(){
if(!/^A?B?C?D?E?F?G?$/.test(opt))returnfalse;
Boolean(opt.match(this.value))==this.checkedthis.click();
});
if(type.match(/^[013]$/)){
$input.is(&9;:checked&9;)(setting.none?($input[Math.floor(Math.random()$input.length)]$()).click():setting.lose++);
}elseif(type.match(/^(2|[4-9]|1[08])$/)){
data=String(obj.data).split(/|\x01|\|/);
str=$li.end().find(&9;textarea&9;).each(function(index){
index=(obj.code>0&&data[index])this.value&9;&9;;
UE.getEditor(this.name).setContent(index.trim());
}).length;
(obj.code>0&&data.length==str)setting.nonesetting.lose++;
}else{
setting.nonesetting.lose++;
}
returnstate==setting.lose;
}
functionsaveThis(){
if(!setting.auto)returnsetTimeout(saveThis,setting.time);
setting.div.children(&9;button:lt(3)&9;).hide().eq(1).click();
$(&9;tempsave&9;).click();
setting.regl();
}
functionsubmitThis(){
if(!setting.auto){
}elseif(!$(&9;.Btn_blue_1:visible&9;).length){
setting.div.children(&9;button:lt(3)&9;).hide().eq(1).click();
returnsetting.regl();
}elseif($(&9;confirmSubWin:visible&9;).length){
varbtn=$(&9;tipContent +> a&9;).offset(){top:0,left:0},
mouse=document.createEvent(&9;MouseEvents&9;);
btn=[btn.left+Math.ceil(Math.random()46),btn.top+Math.ceil(Math.random()26)];
mouse.initMouseEvent(&9;click&9;,true,true,document.defaultView,0,0,0,btn[0],btn[1],false,false,false,false,0,null);
_self.event=$.extend(true,{},mouse);
delete_self.event.isTrusted;
_self.form1submit();
}else{
$(&9;.Btn_blue_1&9;)[0].click();
}
setTimeout(submitThis,Math.ceil(setting.timeMath.random())2);
}
functioncheckToNext(){
var$tip=$(setting.job.join(&9;, &9;),document).prevAll(&9;.ans-job-icon&9;+setting.normal);
setInterval(function(){
$tip.parent(&9;:not(.ans-job-finished)&9;).lengthsetting.jump&&toNext();
},setting.time);
}
functiontoNext(){
var$cur=$(&9;cur&9;+$(&9;chapterIdid&9;).val()),
$tip=$(&9;span.currents ~ span&9;),
sel=setting.review?&9;html&9;:&9;.blue&9;;
if(!$cur.has(sel).length&&$tip.length)return$tip.eq(0).click();
$tip=$(&9;.roundpointStudent, .roundpoint&9;).parent();
$tip=$tip.slice($tip.index($cur)+1).not(&9;:has(&9;+sel+&9;)&9;);
$tip.not(setting.lock?&9;:has(.lock)&9;:&9;html&9;).find(&9;span&9;).eq(0).click();
$tip.lengthsetting.course&&switchCourse();
}
functionswitchCourse(){
GM_xmlhttpRequest({
method:&9;GET&9;,
url:&9;/visit/courses/study?isAjax=true&fileId=0&debug=&9;,
headers:{
&9;Referer&9;:location.origin+&9;/visit/courses&9;,
&9;X-Requested-With&9;:&9;XMLHttpRequest&9;
},
onload:function(xhr){
var$list=$(&9;.curFile .courseName&9;,xhr.responseText),
index=$list.index($list.filter(&9;[href="courseid=&9;+top.courseId+&9;&"]&9;))+1;
index=index&&$list.eq(index).attr(&9;href&9;);
setting.course=index&&goCourse(index);
}
});
}
functiongoCourse(url){
GM_xmlhttpRequest({
method:&9;GET&9;,
url:url,
onload:function(xhr){
$.globalEval(&9;location.href = "&9;+$(&9;.articlename a[href]&9;,xhr.responseText).attr(&9;href&9;)+&9;";&9;);
}
});
}
functionautoRead(){
$(&9;html, body&9;).animate({
scrollTop:$(document).height()-$(window).height()
},Math.round(setting.read)1E3,function(){
$(&9;.nodeItem.r i&9;).click();
}).one(&9;click&9;,&9;top&9;,function(event){
$(event.delegateTarget).stop();
});
}
functiongetSchoolId(){
varschool=/^1\d{10}$/.test(setting.username)?&9;&9;:setting.school;
if(!isNaN(school))returnsetTimeout(toLogin,setting.time,school);
if(school==&9;账号为手机号可以不修改此参数&9;)returnalert(&9;请修改school参数&9;);
$.getJSON(&9;/org/searchUnis?filter=&9;+encodeURI(school)+&9;&product=44&9;,function(data){
if(!data.result)returnalert(&9;学校查询错误&9;);
varmsg=$.grep(data.froms,function(value){
returnvalue.name==school;
})[0];
msg?setTimeout(toLogin,setting.time,msg.schoolid):alert(&9;学校名称不完整&9;);
});
}
functiontoLogin(fid){
GM_xmlhttpRequest({
method:&9;GET&9;,
url:&9;/api/login?name=&9;+setting.username+&9;&pwd=&9;+setting.password+&9;&schoolid=&9;+fid+&9;&verify=0&9;,
onload:function(xhr){
varobj=$.parseJSON(xhr.responseText){};
obj.result?location.href=decodeURIComponent($(&9;[id^=ref]&9;).val()):alert(obj.errorMsg&9;Error&9;);
}
});
}
functionsubmitAnswer($job,data){
$job.removeClass(&9;ans-job-finished&9;);
data=data.length?$(data):$(&9;.TiMu&9;).map(function(){
vartitle=filterImg($(&9;.Zy_TItle .clearfix&9;,this));
return{
question:title.replace(/^【.?】\s/,&9;&9;),
type:({单选题:0,多选题:1,填空题:2,判断题:3})[title.match(/^【(.?)】|$/)[1]]
};
});
data=$.grep(data.map(function(index){
var$TiMu=$(&9;.TiMu&9;).eq(index);
if(!($.isPlainObject(this)&&this.type<4&&$TiMu.find(&9;.fr&9;).length)){
returnfalse;
}elseif(this.type==2){
var$ans=$TiMu.find(&9;.Py_tk, .Py_answer&9;).eq(0);
if(!$TiMu.find(&9;.cuo&9;).length&&this.code){
returnfalse;
}elseif(!$ans.find(&9;.cuo&9;).length){
this.option=$ans.find(&9;.clearfix&9;).map(function(){
returnfilterImg(this);
}).get().join(&9;&9;)&9;无&9;;
}elseif(this.code){
this.code=-1;
}else{
returnfalse;
}
}elseif(this.type==3){
varans=$TiMu.find(&9;.font20:last&9;).text();
if($TiMu.find(&9;.cuo&9;).length){
this.option=({&9;√&9;:&9;错误&9;,&9;×&9;:&9;正确&9;})[ans]&9;无&9;;
}elseif(!this.code){
this.option=({&9;√&9;:&9;正确&9;,&9;×&9;:&9;错误&9;})[ans]&9;无&9;;
}else{
returnfalse;
}
}else{
vartext=$TiMu.find(&9;.Py_answer > span:eq(0)&9;).text();
if($TiMu.find(&9;.dui&9;).length&&this.code&&!/^A?B?C?D?E?F?G?$/.test(this.option)){
returnfalse;
}elseif($TiMu.find(&9;.dui&9;).lengthtext.match(&9;正确答案&9;)){
text=text.match(/[A-G]/gi)[];
this.option=$.map(text,function(value){
returnfilterImg($TiMu.find(&9;.fl:contains(&9;+value+&9;) + a&9;));
}).join(&9;&9;)&9;无&9;;
this.key=text.join(&9;&9;);
}elseif(this.code){
this.code=-1;
}else{
returnfalse;
}
}
returnthis;
}),function(value){
returnvalue&&value.option!=&9;无&9;;
});
setting.curs=$(&9;script:contains(courseName)&9;,top.document).text().match(/courseName:\&9;(.+?)\&9;|$/)[1]$(&9;h1&9;).text().trim()&9;无&9;;
data.length&&GM_xmlhttpRequest({
method:&9;POST&9;,
url:&9;http://mooc.forestpolice.org/upload/cx/0/?workRelationId=&9;+$(&9;workId&9;).val(),
headers:{
&9;Content-type&9;:&9;application/x-www-form-urlencoded&9;
},
data:&9;course=&9;+encodeURIComponent(setting.curs)+&9;&data=&9;+encodeURIComponent((Ext.encodeJSON.stringify)(data))+&9;&id=&9;+$(&9;jobid&9;).val().slice(5)
});
$job.addClass(&9;ans-job-finished&9;);
}
functionfilterImg(dom){
return$(dom).clone().find(&9;img[src]&9;).replaceWith(function(){
return$(&9;<p></p>&9;).text(&9;<img src="&9;+$(this).attr(&9;src&9;)+&9;">&9;);
}).end().find(&9;iframe[src]&9;).replaceWith(function(){
return$(&9;<p></p>&9;).text(&9;<iframe src="&9;+$(this).attr(&9;src&9;)+&9;"></irame>&9;);
}).end().text().trim();
}
下载地址:
https://greasyfork.org/id/scripts/369625-%E8%B6%85%E6%98%9F%E7%BD%91%E8%AF%BE%E5%8A%A9%E6%89%8B/