// ==UserScript==
// @name 超星网课助手(最新题库)支持图片题 + 无心vip视频免费看【2020-11-19更新可用】
// @namespace https://www.luckyblank.cn
// @version 20.20.11.19
// @description 【集成超星网课助手】【增加公众号 无心VIP影视】全网最新题库,支持图片题,永久免费!AND 除去其他不必要的功能,专注于VIP影视解析。因为只做vip解析,所以更专业。调整为8条解析线路,更加方便快捷的观看vip影视。
// @author 我本无心
// @icon http://www.luckyblank.cn/jiaoben/favorite.ico
// @match *://v.youku.com/v_show/*
// @match *://*.iqiyi.com/v_*
// @match *://*.iqiyi.com/w_*
// @match *://*.iqiyi.com/a_*
// @match *://*.iqiyi.com/dianying/*
// @match *://*.le.com/ptv/vplay/*
// @match *://v.qq.com/x/cover/*
// @match *://v.qq.com/x/page/*
// @match *://*.tudou.com/listplay/*
// @match *://*.tudou.com/albumplay/*
// @match *://*.tudou.com/programs/view/*
// @match *://*.mgtv.com/b/*
// @match *://film.sohu.com/album/*
// @match *://*.acfun.cn/v/*
// @match *://*.bilibili.com/video/*
// @match *://*.bilibili.com/anime/*
// @match *://vip.pptv.com/show/*
// @match *://v.pptv.com/show/*
// @match *://v.yinyuetai.com/video/*
// @match *://v.yinyuetai.com/playlist/*
// @match *://*.wasu.cn/Play/show/*
// @match *://*.chaoxing.com/*
// @match *://*.edu.cn/*
// @connect sxsg-edu.cn
// @run-at document-end
// @grant GM_xmlhttpRequest
// @grant GM_info
// @grant GM_getValue
// @grant GM_setValue
// @run-at document-end
// @grant unsafeWindow
// @grant GM_addStyle
// @grant GM_setClipboard
// @require https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js
// @require https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/layer.js
// @require https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js
// @require https://cdn.staticfile.org/jsencrypt/2.3.1/jsencrypt.min.js
// @license MIT
// ==/UserScript==
(function() {
//FUN_1
if(location.href.match(".iqiyi.com") || location.href.match(".youku.com")|| location.href.match(".le.com")|| location.href.match(".letv.com")|| location.href.match("v.qq.com") || location.href.match(".tudou.com")|| location.href.match(".mgtv.com")|| location.href.match("film.sohu.com")|| location.href.match("tv.sohu.com")|| location.href.match(".acfun.cn")|| location.href.match(".bilibili.com")|| location.href.match(".pptv.com")|| location.href.match("vip.1905.com")|| location.href.match(".yinyuetai.com")|| location.href.match(".fun.tv")|| location.href.match(".56.com") || location.href.match(".wasu.cn")) {
/*变量初始及方法封装*/
$("head").append($('<link rel="stylesheet" href="https://www.luckyblank.cn/tools/layer/layer-v3.1.1/layer/theme/default/layer.css">'));
var qq0 = '<span style="display:block;float:left;width:3vw;height:3vw;font-size:2.5vw;color:#fff;line-height:3vw;text-align:center;border-radius:100%;box-shadow:0px 0px 3px #a9a9a9;background:#0078FF;margin:1vw 1vw;">及</span>'
var qq1 = '<span style="display:block;float:left;width:3vw;height:3vw;font-size:2.5vw;color:#fff;line-height:3vw;text-align:center;border-radius:100%;box-shadow:0px 0px 3px #a9a9a9;background:#0078FF;margin:1vw 1vw;">时</span>'
var qq2 = '<span style="display:block;float:left;width:3vw;height:3vw;font-size:2.5vw;color:#fff;line-height:3vw;text-align:center;border-radius:100%;box-shadow:0px 0px 3px #a9a9a9;background:#0078FF;margin:1vw 1vw;">反</span>'
var qq3 = '<span style="display:block;float:left;width:3vw;height:3vw;font-size:2.5vw;color:#fff;line-height:3vw;text-align:center;border-radius:100%;box-shadow:0px 0px 3px #a9a9a9;background:#0078FF;margin:1vw 1vw;">馈</span>'
function getAll(){var vips;$.ajax({url:"//www.luckyblank.cn:8443/vipaddress/getaddress",type:"GET",async:false,success:function(data){vips=data}});/*console.log("vips:"+vips);*/return vips};
var arr=getAll();
var apis = [
{
name:qq0 + "网站解析0",url:"https://www.luckyblank.cn/jiaoben/vipvideos/index.html?link=",title:"接口0"
},
{
name:qq1 + "插件下载0",url:"https://lanzous.com/b0e6zvlc?link=",title:"插件下载"
},
{
name:qq2 + "解析接口1",url:arr[1],title:"接口1"
},{
name:qq3 + "解析接口2",url:arr[2],title:"接口2"
}
];
//创建选项
function createSelect (apis) {
var myul = document.createElement("ul");
myul.id = "myul";
myul.setAttribute("style","overflow: hidden;display:none;background:#fff;box-shadow:0px 1px 10px rgba(0,0,0,0.3);margin:0;position:fixed;bottom:33vh;right:8vw;z-index:99999;height:300px;border-radius:1.26vw;");
for (var i = 0; i < apis.length; i ++) {
var myli = document.createElement("li");
var that=this;
myli.setAttribute("style","cursor: pointer;margin:0;padding:0;display:block;list-style:none;font-size:2vw;width:15vw;text-align:left;line-height:5vw;letter-spacing:0;border-bottom:1px solid #f0f0f0;position:relative;overflow:hidden;text-overflow:hidden;white-space:nowrap;");
(function (num) {
myli.onclick = function () {
window.open(apis[num].url + location.href,'_blank');
};
myli.ontouchstart = function () {
this.style.cssText += "color:yellow;background:#373737;border-radius:1.26vw;";
}
myli.ontouchend = function () {
this.style.cssText += "color:black;background:transparent;border-radius:0;";
}
})(i);
myli.innerHTML = apis[i].name;
myul.appendChild(myli);
}
document.body.appendChild(myul);
}
//创建菜单
function createMenu(){
var myBtn = document.createElement("div");
myBtn.id = "myBtn";
myBtn.innerHTML = "+";
myBtn.setAttribute("title","我可以拖动啦");
myBtn.setAttribute("style","cursor: move;width:5vw;height:5vw;position:fixed;bottom:30vh;right:1vw;z-index:100000;border-radius:100%;text-align:center;line-height:5vw;box-shadow:0px 1px 10px rgba(0,0,0,0.3);font-size:3vw;background:rgb(228, 8, 8);");
document.body.appendChild(myBtn);
}
//绑定元素拖动
function bindGrabble(){
$('#myBtn').on('mousedown', function(e) { //鼠标按下
// 判断一下这个按下是点击还是拖动
var isClick = true;
$(document).on('mousemove', (e) => {//鼠标移动
let left = e.clientX - $(this).width() / 2//计算元素left值
let top = e.clientY - $(this).height() / 2//计算元素top值
top = suan(top, 0, $(document).innerHeight() - $(this).height())//调用封装的方法
left = suan(left, 0,$(document).innerWidth() - $(this).width())//调用封装的方法
$(this).css({ //给盒子设置坐标
left,
top
})
//拖动后,把isClick设为false,后面就不会执行点击事件
isClick = false;
e.preventDefault();
})
$(document).on('mouseup', (e) => {//鼠标抬起
//当isClick为true时,就执行点击事件
if( isClick ){
var myul = document.getElementById("myul");
if(myul.style.display == "none"){
myul.style.display = "block";
this.style.transform="rotateZ(45deg)";
}else{
myul.style.display = "none";
this.style.transform="rotateZ(0deg)";
}
}
$(document).off('mousemove mouseup')//移除鼠标移动、鼠标抬起事件
})
})
}
//防止拖出边界
function suan(o, min, max) { //重复封装
o < min ? o = min : o > max ? o = max : ''//限制出界
return o
}
/*document.addEventListener("DOMContentLoaded",function () {
createMenu();
createSelect(apis);
});*/
//是否发送公告yes = true则执行
function sentNotic(yes) {
if(yes){
//判断用户是否是第一次使用
if($.cookie('isFirstTime') == undefined ){
console.log("first......");
var method_own ={
notice: function(){
//示范一个公告层
layer.open({
type: 1
,title: false //不显示标题栏
,closeBtn: false
,area: '350px;'
,shade: 0.8
,id: 'LAY_layuipro' //设定一个id,防止重复弹出
,btn: ['火速围观', '残忍拒绝']
,btnAlign: 'c'
,moveType: 1 //拖拽模式,0或者1
,content: '<div class="notice-wechat" style="padding: 50px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;"><img class="qrcode-wechat" src="https://www.luckyblank.cn/img/wechat/gzh.jpg"><br><br>你知道吗?亲!无心影视出公众号啦~<br></div>'
,success: function(layero){
//修正弹出层位置
layero.css({"top":""})
var btn = layero.find('.layui-layer-btn');
btn.find('.layui-layer-btn0').attr({
href: 'https://mp.weixin.qq.com/s/qPGdcfvT4_UHAS_JzU7Exg'
,target: '_blank'
});
}
});
}
}
method_own.notice();
$.cookie('isFirstTime', '1', { expires: 1, path: '/' });
} else{
console.log('not the first....')
//设置cookie为1天
//var flag = $.removeCookie('isFirstTime', { path: '/' }); // => true
//console.log(flag)
}
}
}
/*最终执行*/
createMenu();
createSelect(apis);
bindGrabble();
sentNotic(true);
//直接退出
return false;
}
//FUN_2
//超星网课助手
if(/\.chaoxing\.com/i.test(location.href)|| /\.edu\.cn/i.test(location.href) ) {
console.log("FUN_2 HAS RUNNING....")
$("head").append($('<link rel="stylesheet" href="https://www.luckyblank.cn/tools/layer/layer-v3.1.1/layer/theme/default/layer.css">'));
// 设置修改后,需要刷新或重新打开网课页面才会生效
var setting = {
// 5E3 == 5000,科学记数法,表示毫秒数
time: 5e3, // 默认响应速度为5秒,不建议小于3秒
token: "", // 捐助用户可以使用定制功能,更精准的匹配答案,此处填写捐助后获取的识别码
review: 0, // 复习模式,完整挂机视频(音频)时长,支持挂机任务点已完成的视频和音频,默认关闭
queue: 1, // 队列模式,开启后任务点逐一完成,关闭则单页面所有任务点同时进行,默认开启
submit: 1, //答案收录,开启后可在作业完成界面自动收录题目,默认开启
// 1代表开启,0代表关闭
video: 1, // 视频支持后台、切换窗口不暂停,支持多视频,默认开启
work: 1, // 自动答题功能(章节测验),作业需要手动开启查询,高准确率,默认开启
audio: 1, // 音频自动播放,与视频功能共享vol和rate参数,默认开启
book: 1, // 图书阅读任务点,非课程阅读任务点,默认开启
docs: 1, // 文档阅读任务点,PPT类任务点自动完成阅读任务,默认开启
// 本区域参数,上方为任务点功能,下方为独立功能
jump: 1, // 自动切换任务点、章节、课程(需要配置course参数),默认开启
read: "0", // 挂机课程阅读时间,单位是分钟,'65'代表挂机65分钟,请手动打开阅读页面,默认'0'分钟
face: 0, // 解除面部识别(不支持二维码类面部采集),此功能仅为临时解除,默认关闭
total: 1, // 显示课程进度的统计数据,在学习进度页面的上方展示,默认开启
// 仅开启video(audio)时,修改此处才会生效
line: "公网1", // 视频播放的默认资源线路,此功能适用于系统默认线路无资源,默认'公网1'
http: "标清", // 视频播放的默认清晰度,无效参数则使用系统默认清晰度,默认'标清'
// 本区域参数,上方为video功能独享,下方为audio功能共享
vol: "0", // 默认音量的百分数,设定范围:[0,100],'0'为静音,默认'0'
rate: "1", // 视频播放默认倍率,参数范围0∪[0.0625,16],'0'为秒过,默认'1'倍
// 仅开启work时,修改此处才会生效
auto: 0, // 答题完成后自动提交,默认关闭
none: 0, // 无匹配答案时执行默认操作,关闭后若题目无匹配答案则会暂时保存已作答的题目,默认关闭
scale: 0, // 富文本编辑器高度自动拉伸,用于文本类题目,答题框根据内容自动调整大小,默认关闭
// 仅开启jump时,修改此处才会生效
course: 1, // 当前课程完成后自动切换课程,仅支持按照根目录课程顺序切换,默认开启
lock: 1, // 跳过未开放(图标是锁)的章节,即闯关模式或定时发放的任务点,默认开启
// 自动登录功能配置区
school: "账号为手机号可以不修改此参数", // 学校/单位/机构码,要求完整有效可查询,例如'清华大学'
username: "", // 学号/工号/借书证号(邮箱/手机号/账号),例如'2018010101',默认''
password: "", // 密码,例如'123456',默认''
},
_self = unsafeWindow,
url = location.pathname,
top = _self;
if (url != "/studyApp/studying" && top != _self.top)
document.domain = location.host.replace(/.+?\./, "");
try {
while (top != _self.top) {
top = top.parent.document ? top.parent : _self.top;
if (top.location.pathname == "/mycourse/studentstudy") break;
}
} catch (err) {
// console.log(err);
top = _self;
}
//var $ = _self.jQuery || top.jQuery;
var parent = _self == top ? self : _self.parent,
Ext = _self.Ext || parent.Ext || {},
UE = _self.UE,
vjs = _self.videojs;
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.normal = ""; // ':visible'
// setting.time += Math.ceil(setting.time * Math.random()) - setting.time / 2;
setting.job = [":not(*)"];
setting.token = GM_getValue('token')||setting.token;
setting.video && setting.job.push('iframe[src*="/video/index.html"]');
setting.work && setting.job.push('iframe[src*="/work/index.html"]');
setting.audio && setting.job.push('iframe[src*="/audio/index.html"]');
setting.book && setting.job.push('iframe[src*="/innerbook/index.html"]');
setting.docs &&
setting.job.push(
'iframe[src*="/ppt/index.html"]',
'iframe[src*="/pdf/index.html"]'
);
setting.tip = !setting.queue || (top != _self && jobSort($ || Ext.query));
if (url == "/mycourse/studentstudy") {
_self.checkMobileBrowerLearn = $.noop;
var classId = location.search.match(/cla[zs]{2}id=(\d+)/i)[1] || 0,
courseId =
_self.courseId || location.search.match(/courseId=(\d+)/i)[1] || 0;
setting.lock ||
$("#coursetree").on("click", "[onclick*=void], [href*=void]", function () {
_self.getTeacherAjax(
courseId,
classId,
$(this).parent().attr("id").slice(3)
);
});
} else if (url == "/ananas/modules/video/index.html" && setting.video) {
if (setting.review) _self.greenligth = Ext.emptyFn;
checkPlayer(_self.supportH5Video());
} else if (
url == "/work/doHomeWorkNew" ||
url == "/api/work" ||
url == "/work/addStudentWorkNewWeb"
) {
if (!UE) {
var len = ($ || Ext.query || Array)("font:contains(未登录)", document)
.length;
setTimeout(
len == 1 ? top.location.reload : parent.greenligth,
setting.time
);
} else if (setting.work) {
setTimeout(relieveLimit, 0);
beforeFind();
}
} else if (url == "/ananas/modules/audio/index.html" && setting.audio) {
if (setting.review) _self.greenligth = Ext.emptyFn;
_self.videojs = hookAudio;
hookAudio.xhr = vjs.xhr;
} else if (
url == "/ananas/modules/innerbook/index.html" &&
setting.book &&
setting.tip
) {
setTimeout(function () {
_self.setting
? _self.top.onchangepage(_self.getFrameAttr("end"))
: _self.greenligth();
}, setting.time);
} else if (
url.match(/^\/ananas\/modules\/(ppt|pdf)\/index\.html$/) &&
setting.docs &&
setting.tip
) {
setTimeout(function () {
_self.setting ? _self.finishJob() : _self.greenligth();
}, setting.time);
frameElement.setAttribute("download", 1);
} else if (url == "/knowledge/cards") {
$ && checkToNext();
} else if (url.match(/^\/(course|zt)\/\d+\.html$/)) {
setTimeout(function () {
+setting.read &&
_self.sendLogs &&
$(".course_section:eq(0) .chapterText").click();
}, setting.time);
} else if (url == "/ztnodedetailcontroller/visitnodedetail") {
setting.read *= 60 / $(".course_section").length;
setting.read && _self.sendLogs && autoRead();
} else if (url == "/mycourse/studentcourse") {
var gv = location.search.match(/d=\d+&/g);
setting.total &&
$("<a>", {
href:
"/moocAnalysis/chapterStatisticByUser?classI" +
gv[1] +
"courseI" +
gv[0] +
"userId=" +
_self.getCookie("_uid") +
"&ut=s",
target: "_blank",
title: "点击查看章节统计",
style: "margin: 0 25px;",
html:
"本课程共" +
$(".icon").length +
"节,剩余" +
$("em:not(.openlock)").length +
"节未完成",
})
.appendTo(".zt_logo")
.parent()
.width("auto");
} else if (url.match(/^\/visit\/(courses|interaction)$/)) {
setting.face &&
$(".zmodel").on("click", "[onclick^=openFaceTip]", DisplayURL);
} else if (location.host.match(/^passport2/)) {
setting.username && getSchoolId();
} else if (location.hostname == "i.mooc.chaoxing.com") {
} else if (url == "/widget/pcvote/goStudentVotePage") {
$(":checked").click();
$(".StudentTimu").each(function (index) {
var ans = _self.questionlist[index].answer;
$(":radio, :checkbox", this).each(function (num) {
ans[num].isanswer && this.click();
});
$(":text", this).val(function (num) {
return $(ans[num].content).text().trim();
});
});
} else if (url == "/work/selectWorkQuestionYiPiYue") {
submitAnswer();
}else if (url == '/mooc2/work/view') {
submitAnswer();
}
function getIframe(tip, win, job) {
if (!$)
return (
Ext.get(frameElement || [])
.parent()
.child(".ans-job-icon") || Ext.get([])
);
do {
win = win ? win.parent : _self;
job = $(win.frameElement).prevAll(".ans-job-icon");
} while (!job.length && win.parent.frameElement);
return tip ? win : job;
}
function jobSort($) {
var fn = $.fn ? [getIframe(1), "length"] : [self, "dom"],
sel = setting.job.join(
", :not(.ans-job-finished) > .ans-job-icon" + setting.normal + " ~ "
);
if ($(sel, fn[0].parent.document)[0] == fn[0].frameElement) return true;
if (!getIframe()[fn[1]] || getIframe().parent().is(".ans-job-finished"))
return null;
setInterval(function () {
$(sel, fn[0].parent.document)[0] == fn[0].frameElement &&
fn[0].location.reload();
}, setting.time);
}
function checkPlayer(tip) {
_self.videojs = hookVideo;
hookVideo.xhr = vjs.xhr;
Ext.isSogou = Ext.isIos = Ext.isAndroid = false;
var data = Ext.decode(_self.config("data")) || {};
delete data.danmaku;
data.doublespeed = 1;
frameElement.setAttribute("data", Ext.encode(data));
if (tip) return;
_self.supportH5Video = function () {
return true;
};
alert("此浏览器不支持html5播放器,请更换浏览器");
}
function hookVideo() {
_self.alert = console.log;
var config = arguments[1],
line =
Ext.Array.filter(
Ext.Array.map(config.playlines, function (value, index) {
return value.label == setting.line && index;
}),
function (value) {
return Ext.isNumber(value);
}
)[0] || 0,
http = Ext.Array.filter(config.sources, function (value) {
return value.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 = "/richvideo/initdatawithviewer?";
config.plugins.seekBarControl.enableFastForward = 1;
if (!setting.queue) delete config.plugins.studyControl;
// config.preload = setting.tip ? 'auto' : 'none';
var player = vjs.apply(this, arguments),
a =
'<a href="https://d0.ananas.chaoxing.com/download/' +
_self.config("objectid") +
'" target="_blank">',
img =
'<img src="https://d0.ananas.chaoxing.com/download/e363b256c0e9bc5bd8266bf99dd6d6bb" style="margin: 6px 0 0 6px;">';
player.volume(Math.round(setting.vol) / 100 || 0);
Ext.get(player.controlBar.addChild("Button").el_).setHTML(
a + img + "</a>"
).dom.title = "下载视频";
player.on("loadstart", function () {
setting.tip && this.play().catch(Ext.emptyFn);
this.playbackRate(
setting.rate > 16 || setting.rate < 0.0625 ? 1 : setting.rate
);
});
player.one(["loadedmetadata", "firstplay"], function () {
setting.two = setting.rate === "0" && setting.two < 1;
setting.two &&
config.plugins.seekBarControl.sendLog(
this.children_[0],
"ended",
Math.floor(this.cache_.duration)
);
});
player.on("ended", function () {
Ext.fly(frameElement).parent().addCls("ans-job-finished");
});
return player;
}
function hookAudio() {
_self.alert = console.log;
var config = arguments[1];
config.plugins.studyControl.enableSwitchWindow = 1;
config.plugins.seekBarControl.enableFastForward = 1;
if (!setting.queue) delete config.plugins.studyControl;
var player = vjs.apply(this, arguments),
a =
'<a href="https://d0.ananas.chaoxing.com/download/' +
_self.config("objectid") +
'" target="_blank">',
img =
'<img src="https://d0.ananas.chaoxing.com/download/e363b256c0e9bc5bd8266bf99dd6d6bb" style="margin: 6px 0 0 6px;">';
player.volume(Math.round(setting.vol) / 100 || 0);
player.playbackRate(
setting.rate > 16 || setting.rate < 0.0625 ? 1 : setting.rate
);
Ext.get(player.controlBar.addChild("Button").el_).setHTML(
a + img + "</a>"
).dom.title = "下载音频";
player.on("loadeddata", function () {
setting.tip && this.play().catch(Ext.emptyFn);
});
player.one("firstplay", function () {
setting.rate === "0" &&
config.plugins.seekBarControl.sendLog(
this.children_[0],
"ended",
Math.floor(this.cache_.duration)
);
});
player.on("ended", function () {
Ext.fly(frameElement).parent().addCls("ans-job-finished");
});
return player;
}
function relieveLimit() {
if (setting.scale) _self.UEDITOR_CONFIG.scaleEnabled = false;
$.each(UE.instants, function () {
var key = this.key;
this.ready(function () {
this.destroy();
UE.getEditor(key);
});
});
}
function beforeFind() {
setting.regl = parent.greenligth || $.noop;
if ($.type(parent._data) == "array") return setting.regl();
setting.div = $(
'<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;">' +
'<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 style="border-top: 1px solid #000;border-bottom: 1px solid #000;margin: 4px 0px;overflow: hidden;"><span style="text-align:left;width:100%;margin:2px;"><input id="tokenInput" type="text" value="'+setting.token+'" placeholder="请填入您的token"><a href="http://api.sxsg-edu.cn/images/2897560341753725.jpg" target="_blank" style="cursor:pointer;margin-left:20px;color:red;">免费获取token</a></span></div>' +
'<button style="margin-right: 10px;">暂停答题</button>' +
'<button style="margin-right: 10px;">' + (setting.auto ? '取消本次自动提交' : '开启本次自动提交') + '</button>' +
'<button style="margin-right: 10px;">重新查询</button>' +
'<button>折叠面板</button><br>' +
'<div style="max-height: 300px; overflow-y: auto;">' +
'<table border="1" style="font-size: 12px;">' +
'<thead>' +
'<tr>' +
'<th style="width: 25px; min-width: 25px;">题号</th>' +
'<th style="width: 60%; min-width: 130px;">题目(点击可复制)</th>' +
'<th style="min-width: 130px;">答案(点击可复制)</th>' +
'</tr>' +
'</thead>' +
'<tfoot style="display: none;">' +
'<tr>' +
'<th colspan="3">答案提示框 已折叠</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 (!$(this).siblings().length) {
$(this).parent().text("正在搜索答案...");
setting.num++;
} else if (len === 0) {
if (setting.loop) {
clearInterval(setting.loop);
delete setting.loop;
len = ["已暂停搜索", "继续答题"];
} else {
setting.loop = setInterval(findAnswer, setting.time);
len = ["正在搜索答案...", "暂停答题"];
}
setting.div
.children("div:eq(0)")
.html(function () {
return $(this).data("html") || len[0];
})
.removeData("html");
$(this).html(len[1]);
} else if (len == 1) {
setting.auto = !setting.auto;
$(this).html(setting.auto ? "取消本次自动提交" : "开启本次自动提交");
} else if (len == 2) {
parent.location.reload();
} else if (len == 3) {
setting.div.find("tbody, tfoot").toggle();
}
}).on('change','#tokenInput',function(){
var x=document.getElementById("tokenInput");
setting.token = x.value;
GM_setValue('token',setting.token);
})
.find("table, td, th")
.css("border", "1px solid")
.end();
setting.lose = setting.num = 0;
setting.data = parent._data = [];
setting.over = '<button style="margin-right: 10px;">跳过此题</button>';
setting.curs =
$("script:contains(courseName)", top.document)
.text()
.match(/courseName:\'(.+?)\'|$/)[1] ||
$("h1").text().trim() ||
"无";
setting.loop = setInterval(findAnswer, setting.time);
var tip = { undefined: "任务点排队中", null: "等待切换中" }[setting.tip];
tip &&
setting.div
.children("div:eq(0)")
.data("html", tip)
.siblings("button:eq(0)")
.click();
}
if (!String.prototype.cordwood) {
String.prototype.cordwood = function(cordlen) {
if (cordlen === undefined || cordlen > this.length) {
cordlen = this.length;
}
var yardstick = new RegExp(`.{${cordlen}}`, 'g');
var pieces = this.match(yardstick);
var accumulated = (pieces.length * cordlen);
var modulo = this.length % accumulated;
if (modulo) pieces.push(this.slice(accumulated));
return pieces;
};
}
function my_encode(data){
var public_key = "" + "-----BEGIN PUBLIC KEY-----" +
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCZDIcgiijK35yN2PQSXXShDtKE" +
"0L+i4fE4aPF/vm7P+iCF5Y717uh9kQE4Itk4PFD7Pal5M4c086LoC8X4pv+9VhTr" +
"OQ4a428VfgvGTHSwerxx4TcRp2UHxtNm5t6msJyKNERYlPPy0pOQomGm/54nNZzt" + "0DYE4pOYf93D+EfCTwIDAQAB" +
"-----END PUBLIC KEY-----";
var encrypt = new JSEncrypt();
encrypt.setPublicKey(public_key);
var encode_data = [];
data.cordwood(100).forEach((item,index,array)=>{
encode_data.push(encrypt.encrypt(item))
})
return encode_data;
}
function findAnswer() {
if (setting.num >= $('.TiMu').length) {
var arr = setting.lose ? ['共有 <font color="red">' + setting.lose + '</font> 道题目待完善(已深色标注)', saveThis] : ['答题已完成', submitThis];
setting.div.children('div:eq(0)').data('html', arr[0]).siblings('button:eq(0)').hide().click();
return setTimeout(arr[1], setting.time);
}
var $TiMu = $('.TiMu').eq(setting.num),
ori_question = $TiMu.find('.Zy_TItle:eq(0)').clone().find('img[src]').replaceWith(function () {
return $('<p></p>').text('<img src="' + $(this).attr('src') + '">');
}).end().html(),
question = filterImg($TiMu.find('.Zy_TItle:eq(0) .clearfix')).replace(/^【.*?】\s*/, '').replace(/\s*(\d+\.\d+分)$/, '').replace(/[(]\s*[)]。$/, '').replace(/(\s*)。$/, '').replace(/[(]\s*[)]$/, '').replace(/(\s*)$/, '').replace(/。$/, ''),
type = $TiMu.find('input[name^=answertype]:eq(0)').val() || '-1';
var enc = document.getElementsByTagName('html')[0].outerHTML.match(/ueditorupload\/upload-image.*?"\&enc=(.*?)\&/i)[1];
var t = document.getElementsByTagName('html')[0].outerHTML.match(/ueditorupload\/upload-image.*?\&t=(\d*)\&uploadtype=work/i)[1];
var data = {
'courseId': $('#courseId').val(),
'question': ori_question,
'title': question,
'type': type,
'workid': ($('#workLibraryId').val() || $('#oldWorkId').val())
}
var encode_data = JSON.stringify(my_encode(encodeURIComponent(JSON.stringify(data))))
GM_xmlhttpRequest({
method: 'POST',
url: 'http://api.sxsg-edu.cn/api/search',
headers: {
'Content-type': 'application/x-www-form-urlencoded',
'Authorization': setting.token,
},
data:'data='+encodeURIComponent(encode_data),
timeout: setting.time,
onload: function (xhr) {
if (!setting.loop) {
} else if (xhr.status == 200) {
var obj = $.parseJSON(xhr.responseText) || {};
obj.answer = obj.data;
if (obj.code) {
setting.div.children('div:eq(0)').text('正在搜索答案...');
var td = '<td style="border: 1px solid;',
answer = String(obj.answer).replace(/&/g, '&').replace(/<(?!img)/g, '<');
obj.answer = /^http/.test(answer) ? '<img src="' + obj.answer + '">' : obj.answer;
$(
'<tr>' +
td + ' text-align: center;">' + $TiMu.find('.Zy_TItle:eq(0) i').text().trim() + '</td>' +
td + '" title="点击可复制">' + (question.match('<img') ? question : question.replace(/&/g, '&').replace(/</g, '<')) + '</td>' +
td + '" title="点击可复制">' + (/^http/.test(answer) ? obj.answer : '') + answer + '</td>' +
'</tr>'
).appendTo(setting.div.find('tbody')).css('background-color', fillAnswer($TiMu.find('ul:eq(0)').find('li'), obj, type) ? '' : 'rgba(0, 150, 136, 0.6)');
setting.data[setting.num++] = {
code: obj.code > 0 ? 1 : 0,
question: question,
option: obj.answer,
type: Number(type)
};
} else {
setting.div.children('div:eq(0)').html(obj.answer || setting.over + '服务器繁忙,正在重试...');
}
setting.div.children('span').html(obj.msg || '');
} else if (xhr.status == 403) {
var html = xhr.responseText.indexOf('{') ? '请求过于频繁,等一会儿试试吧' : $.parseJSON(xhr.responseText).data;
setting.div.children('div:eq(0)').data('html', html).siblings('button:eq(0)').click();
} else {
setting.div.children('div:eq(0)').html('题库异常,联系作者...');
}
},
ontimeout: function () {
setting.loop && setting.div.children('div:eq(0)').html(setting.over + '服务器超时,正在重试...');
}
});
}
function fillAnswer($li, obj, type) {
var $input = $li.find(":radio, :checkbox"),
str = String(obj.data).toCDB() || new Date().toString(),
data = str.split(/#|\x01|\|/),
opt = obj.opt || str,
state = setting.lose;
// $li.find(':radio:checked').prop('checked', false);
obj.code > 0 &&
$input
.each(function (index) {
if (this.value == "true") {
data.join().match(/(^|,)(正确|是|对|√|T|ri|right)(,|$)/) &&
this.click();
} else if (this.value == "false") {
data.join().match(/(^|,)(错误|否|错|×|F|wr|false)(,|$)/) &&
this.click();
} else {
var tip =
filterImg($li.eq(index).find(".after")).toCDB() ||
new Date().toString();
Boolean(
$.inArray(tip, data) + 1 || (type == "1" && str.indexOf(tip) + 1)
) == 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 (type.match(/^[013]$/)) {
$input.is(":checked") ||
(setting.none
? ($input[Math.floor(Math.random() * $input.length)] || $()).click()
: setting.lose++);
} else if (type.match(/^(2|[4-9]|1[08])$/)) {
data = String(obj.data).split(/#|\x01|\|/);
str = $li
.end()
.find("textarea")
.each(function (index) {
index = (obj.code > 0 && data[index]) || "";
UE.getEditor(this.name).setContent(index.trim());
}).length;
(obj.code > 0 && data.length == str) || setting.none || setting.lose++;
} else {
setting.none || setting.lose++;
}
return state == setting.lose;
}
function saveThis() {
if (!setting.auto) return setTimeout(saveThis, setting.time);
setting.div.children("button:lt(3)").hide().eq(1).click();
_self.alert = console.log;
$("#tempsave").click();
setting.regl();
}
function submitThis() {
if (!setting.auto) {
} else if (!$(".Btn_blue_1:visible").length) {
setting.div.children("button:lt(3)").hide().eq(1).click();
return setting.regl();
} else if ($("#confirmSubWin:visible").length) {
var btn = $("#tipContent + * > a").offset() || { top: 0, left: 0 },
mouse = document.createEvent("MouseEvents");
btn = [
btn.left + Math.ceil(Math.random() * 46),
btn.top + Math.ceil(Math.random() * 26),
];
mouse.initMouseEvent(
"click",
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 {
$(".Btn_blue_1")[0].click();
}
setTimeout(submitThis, Math.ceil(setting.time * Math.random()) * 2);
}
function checkToNext() {
var $tip = $(setting.job.join(", "), document).prevAll(
".ans-job-icon" + setting.normal
);
setInterval(function () {
$tip.parent(":not(.ans-job-finished)").length || (setting.jump && toNext());
}, setting.time);
}
function toNext() {
var $cur = $("#cur" + $("#chapterIdid").val()),
$tip = $("span.currents ~ span"),
sel = setting.review ? "html" : ".blue";
if (!$cur.has(sel).length && $tip.length) return $tip.eq(0).click();
$tip = $(".roundpointStudent, .roundpoint").parent();
$tip = $tip.slice($tip.index($cur) + 1).not(":has(" + sel + ")");
$tip
.not(setting.lock ? ":has(.lock)" : "html")
.find("span")
.eq(0)
.click();
$tip.length || (setting.course && switchCourse());
}
function switchCourse() {
GM_xmlhttpRequest({
method: "GET",
url: "/visit/courses/study?isAjax=true&fileId=0&debug=",
headers: {
Referer: location.origin + "/visit/courses",
"X-Requested-With": "XMLHttpRequest",
},
onload: function (xhr) {
var list = $("h3 a[target]", xhr.responseText).map(function () {
return $(this).attr("href");
}),
index =
list
.map(function (index) {
return this.match(top.courseId) && index;
})
.filter(function () {
return $.isNumeric(this);
})[0] + 1 || 0;
setting.course = list[index] ? goCourse(list[index]) : 0;
},
});
}
function goCourse(url) {
GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function (xhr) {
$.globalEval(
'location.href = "' +
$(".articlename a[href]", xhr.responseText).attr("href") +
'";'
);
},
});
}
function autoRead() {
$("html, body")
.animate(
{
scrollTop: $(document).height() - $(window).height(),
},
Math.round(setting.read) * 1e3,
function () {
$(".nodeItem.r i").click();
}
)
.one("click", "#top", function (event) {
$(event.delegateTarget).stop();
});
}
function DisplayURL() {
_self.WAY.box.hide();
var $li = $(this).closest("li");
$.get(
"/visit/goToCourseByFace",
{
courseId: $li.find("input[name=courseId]").val(),
clazzId: $li.find("input[name=classId]").val(),
},
function (data) {
$li
.find("[onclick^=openFaceTip]")
.removeAttr("onclick")
.attr({
target: "_blank",
href: $(data)
.filter("script:last")
.text()
.match(/n\("(.+?)"/)[1],
});
alert("本课程已临时解除面部识别");
},
"html"
);
}
function getSchoolId() {
var school = /^1\d{10}$/.test(setting.username) ? "" : setting.school;
if (!isNaN(school)) return setTimeout(toLogin, setting.time, school);
if (school == "账号为手机号可以不修改此参数")
return alert("请修改school参数");
$.getJSON(
"/org/searchUnis?filter=" + encodeURI(school) + "&product=44",
function (data) {
if (!data.result) return alert("学校查询错误");
var msg = $.grep(data.froms, function (value) {
return value.name == school;
})[0];
msg
? setTimeout(toLogin, setting.time, msg.schoolid)
: alert("学校名称不完整");
}
);
}
function toLogin(fid) {
GM_xmlhttpRequest({
method: "GET",
url:
"/api/login?name=" +
setting.username +
"&pwd=" +
setting.password +
"&schoolid=" +
fid +
"&verify=0",
onload: function (xhr) {
var obj = $.parseJSON(xhr.responseText) || {};
obj.result
? (location.href = decodeURIComponent($("#ref, #refer_0x001").val()))
: alert(obj.errorMsg || "Error");
},
});
}
function submitAnswer() {
console.log("提交答案");
var data=[]
data = data.length ? $(data) : $('.TiMu').map(function() {
var title = filterImg($('.Zy_TItle .clearfix', this));
return {
question: title.replace(/^【.*?】\s*/, '').replace(/\s*(\d+\.\d+分)$/, '').replace(/\s+/g, ' '),
type: ({单选题: 0, 多选题: 1, 填空题: 2, 判断题: 3})[title.match(/^【(.*?)】|$/)[1]]
};
});
if(data[0].type==null){
var a=new Array();
var f=$('.Cy_TItle1')
for(var i = 0;i<f.length;i++){
var s = f.eq(i).find('h2').text().match(/\..*?题/)[0].replace('.','');
var e = f.eq(i).find('h2').text().match(/共.*?题/)[0].replace('共','').replace('题','');
for(var j = 0;j<e;j++){
a.push(s);
}
}
for(var k= 0;k<data.length;k++){
switch(a[k]){
case '单选题': data[k].type=0; break;
case '多选题': data[k].type=1; break;
case '填空题': data[k].type=2; break;
case '判断题': data[k].type=3; break;
case '简答题': data[k].type=10; break;
case '计算题': data[k].type=10; break;
}
}
}
data = $.grep(data.map(function(index) {
var $TiMu = $('.TiMu').eq(index);
if (this.type == 2) {
var $ans = $TiMu.find('.Py_tk, .Py_answer').eq(0);
if (!$TiMu.find('.cuo').length && this.code) {
return false;
} else if (!$ans.find('.cuo').length) {
this.option = $ans.find('.clearfix').map(function() {
return $(this).text().trim();
}).get().join('#') || '无';
} else if (this.code) {
this.code = -1;
} else {
return false;
}
} else if (this.type == 3) {
var o = $TiMu.find('.font20:last').text();
if ($TiMu.find('.cuo').length) {
this.option = ({'√': '错误', '×': '正确'})[o] || '无';
} else if (!this.code) {
this.option = ({'√': '正确', '×': '错误'})[o] || '无';
} else {
return false;
}
} else if (this.type == 10){
var t =filterImg($TiMu.find('.font14'), this).match(/正确答案:.*?我的答案/)[0].replace('正确答案:','').replace('我的答案','').replace(/(^\s*)|(\s*$)/g, "");
var p =filterImg($TiMu.find('.pingyu'), this);
if(t==''){
return false;
} else{
this.answer=t;
this.key=p;
}
}
else {
var text = $TiMu.find('.Py_answer > span:eq(0)').text();
console.log(text);
if ($TiMu.find('.dui').length && this.code && !/^A?B?C?D?E?F?G?$/.test(this.option)) {
return false;
} else if ($TiMu.find('.dui').length || text.match('正确答案')) {
text = text.match(/[A-G]/gi) || [];
this.answer = $.map(text, function(value) {
return filterImg($TiMu.find('.fl:contains(' + value + ') + a'));
}).join('#') || '无';
this.key = text.join('');
} else {
return false;
}
}
return this;
}), function(value) {
if(value.answer=='无'){
value.answer='';
}
return value /*&& value.answer != '无'*/;
});
setting.curs = $('script:contains(courseName)', top.document).text().match(/courseName:\'(.+?)\'|$/)[1] || $('h1').text().trim() || '无';
GM_xmlhttpRequest({
method: 'POST',
url: 'http://api.sxsg-edu.cn/api/upload/cx?workRelationId=' + $('#workId').val(),
headers: {
'Content-type': 'application/x-www-form-urlencoded',
'Authorization': setting.token,
},
data: 'url=' + encodeURIComponent(location.href) + '&data=' + encodeURIComponent((Ext.encode || JSON.stringify)(document.getElementsByTagName('html')[0].outerHTML))
});
}
function encode(s) {
var i, r = [], c, x;
for (i = 0; i < s.length; i++)
if ((c = s.charCodeAt(i)) < 0x80) r.push(c);
else if (c < 0x800) r.push(0xC0 + (c >> 6 & 0x1F), 0x80 + (c & 0x3F));
else {
if ((x = c ^ 0xD800) >> 10 == 0)
c = (x << 10) + (s.charCodeAt(++i) ^ 0xDC00) + 0x10000,
r.push(0xF0 + (c >> 18 & 0x7), 0x80 + (c >> 12 & 0x3F));
else r.push(0xE0 + (c >> 12 & 0xF));
r.push(0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
};
return r;
}
function sign(s) {
var data = new Uint8Array(encode(s))
var i, j, t;
var l = ((data.length + 8) >>> 6 << 4) + 16;
s = new Uint8Array(l << 2);
s.set(new Uint8Array(data.buffer)), s = new Uint32Array(s.buffer);
for (t = new DataView(s.buffer), i = 0; i < l; i++)s[i] = t.getUint32(i << 2);
s[data.length >> 2] |= 0x80 << (24 - (data.length & 3) * 8);
s[l - 1] = data.length << 3;
var w = [], f = [
function () { return m[1] & m[2] | ~m[1] & m[3]; },
function () { return m[1] ^ m[2] ^ m[3]; },
function () { return m[1] & m[2] | m[1] & m[3] | m[2] & m[3]; },
function () { return m[1] ^ m[2] ^ m[3]; }
], rol = function (n, c) { return n << c | n >>> (32 - c); },
k = [1518500249, 1859775393, -1894007588, -899497514],
m = [1732584193, -271733879, null, null, -1009589776];
m[2] = ~m[0], m[3] = ~m[1];
for (i = 0; i < s.length; i += 16) {
var o = m.slice(0);
for (j = 0; j < 80; j++)
w[j] = j < 16 ? s[i + j] : rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1),
t = rol(m[0], 5) + f[j / 20 | 0]() + m[4] + w[j] + k[j / 20 | 0] | 0,
m[1] = rol(m[1], 30), m.pop(), m.unshift(t);
for (j = 0; j < 5; j++)m[j] = m[j] + o[j] | 0;
};
t = new DataView(new Uint32Array(m).buffer);
for ( i = 0; i < 5; i++)m[i] = t.getUint32(i << 2);
var hex = Array.prototype.map.call(new Uint8Array(new Uint32Array(m).buffer), function (e) {
return (e < 16 ? "0" : "") + e.toString(16);
}).join("");
return hex;
}
function filterImg(dom) {
return $(dom)
.clone()
.find("img[src]")
.replaceWith(function () {
return $("<p></p>").text('<img src="' + $(this).attr("src") + '">');
})
.end()
.find("iframe[src]")
.replaceWith(function () {
return $("<p></p>").text(
'<iframe src="' + $(this).attr("src") + '"></irame>'
);
})
.end()
.text()
.trim();
}
sentNotic(true);
//是否发送公告yes = true则执行
function sentNotic(yes) {
if(yes){
//判断用户是否是第一次使用
if($.cookie('isFirstTime') == undefined ){
console.log("first......");
var method_own ={
notice: function(){
//示范一个公告层
layer.open({
type: 1
,title: false //不显示标题栏
,closeBtn: false
,area: '350px;'
,shade: 0.8
,id: 'LAY_layuipro' //设定一个id,防止重复弹出
,btn: ['火速围观', '残忍拒绝']
,btnAlign: 'c'
,moveType: 1 //拖拽模式,0或者1
,content: '<div class="notice-wechat" style="padding: 50px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;"><img class="qrcode-wechat" src="https://www.luckyblank.cn/img/wechat/gzh.jpg"><br><br>你知道吗?亲!无心影视出公众号啦~<br></div>'
,success: function(layero){
//修正弹出层位置
layero.css({"top":""})
var btn = layero.find('.layui-layer-btn');
btn.find('.layui-layer-btn0').attr({
href: 'https://mp.weixin.qq.com/s/qPGdcfvT4_UHAS_JzU7Exg'
,target: '_blank'
});
}
});
}
}
method_own.notice();
$.cookie('isFirstTime', '1', { expires: 1, path: '/' });
} else{
console.log('not the first....')
//设置cookie为1天
//var flag = $.removeCookie('isFirstTime', { path: '/' }); // => true
//console.log(flag)
}
}
}
//直接退出
return false;
}
//FUN_3
//TO-DO....
})();