this.$ = this.jQuery = jQuery.noConflict(true);
// ==UserScript==
// @name 云班课🆕答题小能手🥇(MeTo题库)
// @namespace http://tampermonkey.net/
// @version 5.31
// @description 【🚀已兼容、新国开、蓝墨云、职教云、智慧职教、云班课精品课🚀】、【😎完美应付考试、测试,全自动答题,一键完成所有资源学习(视频挨个刷时长不存在滴)、视频倍速😎】、【💪新增AI搜题、AI问答,定制化服务💪】、【💙破除网站不可复制文字💙】、【🐮基于生成式AI(ChatGPT)的答案生成🐮】、【🔥一键导入题目🔥】、【🧡新增背题模式(遮挡答案,更好的进行考试复习)🧡】、【😭待支持网站:超星、学习通、智慧树、知到、慕课、U校园😭】、【欢迎加入qq群催更:😄286997695😄,共同交流进步,特别感谢MeTo题库提供题目搜索功能】。【💚作者在此保证,脚本无任何诸如(手机号,学校信息,等隐私信息)收集💚】
// @author 阿绿
// @note 致谢表:@凈仙人、@💪❤、@M_、@吃土豆长大的马铃薯、@悟虚、@台灯没电了、@Pumpkin、@小陈陈陈陈啊、@Sli、@无心人、@29827*0049、@热心解答(以上均是对此脚本做出过有效BUG提交OR提供账户帮助修复OR提供好的idea,如有遗漏请告知)
// @match *://*.mosoteach.cn/*
// @match *://*.chaoxing.com/*
// @match *://*.xueyinonline.com/*
// @match *://*.edu.cn/*
// @match *://*.ouchn.cn/*
// @match *://*.nbdlib.cn/*
// @match *://*.hnsyu.net/*
// @match *://*.gdhkmooc.com/*
// @match *://*.zhihuishu.com/*
// @match *://*.icve.com.cn/*
// @match *://*.yuketang.cn/*
// @match *://v.met0.top/*
// @supportURL https://gitee.com/xiaolv12/yunbanke
// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js
// @icon https://bkimg.cdn.bcebos.com/pic/4ec2d5628535e5dde7114110e88eb0efce1b9c16c4e1
// @require https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant unsafeWindow
// @grant GM_info
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @connect m.met0.top
// @connect v.met0.top
// @connect c.met0.top
// @connect d.met0.top
// @connect localhost
// @connect 127.0.0.1
// @connect gitee.com
// @connect *
// @license MIT
// ==/UserScript==
(function () {
(function($) {
var tips = [];
function handleWindowResize() {
$.each(tips, function() {
this.refresh(true);
});
}
$(window).resize(handleWindowResize);
$.JPopBox = function(elm, options) {
this.$elm = $(elm);
this.opts = this.getOptions(options);
var popBoxHtml=[];
popBoxHtml.push('<div class="'+this.opts.className+'">');
if(this.opts.title!=""){
popBoxHtml.push('<div class="JPopBox-tip-title">'+this.opts.title+'</div>');
}
if(this.opts.isShowArrow){
popBoxHtml.push('<div class="JPopBox-tip-arrow JPopBox-tip-arrow-top JPopBox-tip-arrow-right JPopBox-tip-arrow-bottom JPopBox-tip-arrow-left" style="visibility:inherit"></div>');
}
popBoxHtml.push('<div class="JPopBox-tip-content"></div>'),
popBoxHtml.push('</div>');
this.$tip = $(popBoxHtml.join('')).appendTo(document.body);
this.$arrow = this.$tip.find('div.JPopBox-tip-arrow');
this.$inner = this.$tip.find('div.JPopBox-tip-content');
this.disabled = false;
this.content = null;
this.init();
};
$.JPopBox.hideAll = function() {
$.each(tips, function() {
this.hide();
});
};
$.JPopBox.prototype = {
getOptions:function(options){
options = $.extend({}, $.fn.jPopBox.defaults, options);
if (options.delay && typeof options.delay == 'number') {
options.delay = {
show: options.delay,
hide: options.delay
};
}
if (typeof options.offset == 'number') {
options.offset = {
X: options.offset,
Y: options.offset
};
}
return options
},
init: function() {
tips.push(this);
this.$elm.data('jPopBox', this);
if (this.opts.trigger != 'none') {
this.opts.trigger!="click" && this.$elm.on({
'mouseenter.jPopBox': $.proxy(this.mouseenter, this),
'mouseleave.jPopBox': $.proxy(this.mouseleave, this)
});
switch (this.opts.trigger) {
case 'click':
this.$elm.on('click.jPopBox', $.proxy(this.toggle, this));
break;
case 'hover':
if (this.opts.isTipHover)
this.$tip.hover($.proxy(this.clearTimeouts, this), $.proxy(this.mouseleave, this));
break;
case 'focus':
this.$elm.on({
'focus.jPopBox': $.proxy(this.showDelayed, this),
'blur.jPopBox': $.proxy(this.hideDelayed, this)
});
break;
}
}
},
toggle:function(){
var active=this.$tip.data('active');
if(!active)
this.showDelayed();
else
this.hideDelayed();
},
mouseenter: function(e) {
if (this.disabled)
return true;
this.updateCursorPos(e);
this.$elm.attr('title', '');
if (this.opts.trigger == 'focus')
return true;
this.showDelayed();
},
mouseleave: function(e) {
if (this.disabled || this.asyncAnimating && (this.$tip[0] === e.relatedTarget || jQuery.contains(this.$tip[0], e.relatedTarget)))
return true;
if (this.opts.trigger == 'focus')
return true;
this.hideDelayed();
},
mousemove: function(e) {
if (this.disabled)
return true;
this.updateCursorPos(e);
if (this.opts.isFollowCursor && this.$tip.data('active')) {
this.calcPos();
this.$tip.css({left: this.pos.l, top: this.pos.t});
}
},
show: function() {
this.$elm.trigger($.Event('show.jPopBox'));
if (this.disabled || this.$tip.data('active'))
return;
this.reset();
this.update();
if (!this.content)
return;
this.display();
this.$elm.trigger($.Event('shown.jPopBox'));
},
showDelayed: function(timeout) {
this.clearTimeouts();
this.showTimeout = setTimeout($.proxy(this.show, this), typeof timeout == 'number' ? timeout:this.opts.delay.show);
},
hide: function() {
this.$elm.trigger($.Event('hide.jPopBox'));
if (this.disabled || !this.$tip.data('active'))
return;
this.display(true);
this.$elm.trigger($.Event('hidden.jPopBox'));
},
hideDelayed: function(timeout) {
this.clearTimeouts();
this.hideTimeout = setTimeout($.proxy(this.hide, this),typeof timeout == 'number' ? timeout :this.opts.delay.hide);
},
reset: function() {
this.$tip.queue([]).detach().css('visibility', 'hidden').data('active', false);
this.$inner.find('*').jPopBox('hide');
this.$arrow.length && (this.$arrow[0].className = 'JPopBox-tip-arrow JPopBox-tip-arrow-top JPopBox-tip-arrow-right JPopBox-tip-arrow-bottom JPopBox-tip-arrow-left');
this.asyncAnimating = false;
},
update: function(content, dontOverwriteOption) {
if (this.disabled)
return;
var async = content !== undefined;
if (async) {
if (!dontOverwriteOption)
this.opts.content = content;
if (!this.$tip.data('active'))
return;
} else {
content = this.opts.content;
}
// update content only if it has been changed since last time
var self = this,
newContent = typeof content == 'function' ?
content.call(this.$elm[0], function(newContent) {
self.update(newContent);
}) : content;
if (this.content !== newContent) {
this.$inner.empty().append(newContent);
this.content = newContent;
}
this.refresh(async);
},
refresh: function(async) {
if (this.disabled)
return;
if (async) {
if (!this.$tip.data('active'))
return;
}
this.$tip.css({left: 0, top: 0}).appendTo(document.body);
if (this.opacity === undefined)
this.opacity = this.$tip.css('opacity');
this.calcPos();
this.$tip.css({left: this.pos.l, top: this.pos.t});
},
display: function(hide) {
var active = this.$tip.data('active');
if (active && !hide || !active && hide)
return;
this.$tip.stop();
var from = {}, to = {};
from.opacity = hide ? this.$tip.css('opacity') : 0;
to.opacity = hide ? 0 : this.opacity;
this.$tip.css(from).animate(to, 300);
hide ? this.$tip.queue($.proxy(this.reset, this)) : this.$tip.css('visibility', 'inherit');
this.$tip.data('active', !active);
},
disable: function() {
this.reset();
this.disabled = true;
},
enable: function() {
this.disabled = false;
},
destroy: function() {
this.reset();
this.$tip.remove();
delete this.$tip;
this.content = null;
this.$elm.off('.jPopBox').removeData('jPopBox');
tips.splice($.inArray(this, tips), 1);
},
clearTimeouts: function() {
if (this.showTimeout) {
clearTimeout(this.showTimeout);
this.showTimeout = 0;
}
if (this.hideTimeout) {
clearTimeout(this.hideTimeout);
this.hideTimeout = 0;
}
},
updateCursorPos: function(e) {
this.eventX = e.pageX;
this.eventY = e.pageY;
},
calcPos: function() {
this.tipOuterW = this.$tip.outerWidth();
this.tipOuterH = this.$tip.outerHeight();
var pos = {l: 0, t: 0, arrow: ''},
$win = $(window),
win = {
l: $win.scrollLeft(),
t: $win.scrollTop(),
w: $win.width(),
h: $win.height()
}, xL, xC, xR, yT, yC, yB,arrowOuterWH,placement,isAuto=false;
var elmOffset = this.$elm.offset(),
elm = {
l: elmOffset.left,
t: elmOffset.top,
w: this.$elm.outerWidth(),
h: this.$elm.outerHeight()
};
xL = elm.l; // left
xC = xL + Math.floor(elm.w / 2); // h center
xR = xL + elm.w; // right
yT = elm.t; // top
yC = yT + Math.floor(elm.h / 2); // v center
yB = yT +elm.h; // bottom
placement=this.opts.placement;
var autoReg=/\s?auto?\s?/i;
isAuto=autoReg.test(placement);
if (isAuto) placement = placement.replace(autoReg, '') || 'top';
//calc left position
switch (placement) {
case "top":
case "bottom":
pos.l = xC - Math.floor(this.tipOuterW / 2)-this.opts.offset.X;
{
if (pos.l + this.tipOuterW > win.l + win.w)
pos.l = win.l + win.w - this.tipOuterW;
else if (pos.l < win.l)
pos.l = win.l;
}
break;
case "right":
arrowOuterWH=this.setArrowAndGetWH(placement);
pos.l = xR + this.opts.offset.X+arrowOuterWH.W;
if (isAuto && pos.l + this.tipOuterW > win.l + win.w){
arrowOuterWH=this.setArrowAndGetWH("left");
pos.l =xL - this.tipOuterW - this.opts.offset.X-arrowOuterWH.W;
}
break;
case "left":
arrowOuterWH=this.setArrowAndGetWH(placement);
pos.l = xL - this.tipOuterW- this.opts.offset.X-arrowOuterWH.W;
if (isAuto && pos.l < win.l){
arrowOuterWH=this.setArrowAndGetWH("right");
pos.l =xR + this.opts.offset.X+arrowOuterWH.W;
}
break;
}
//calc top position
switch (placement) {
case "top":
arrowOuterWH=this.setArrowAndGetWH(placement);
pos.t = yT - this.tipOuterH - this.opts.offset.Y-arrowOuterWH.H;
if (isAuto && pos.t < win.t) {
arrowOuterWH=this.setArrowAndGetWH("bottom");
pos.t = yB + this.opts.offset.Y+arrowOuterWH.H;
}
break;
case "bottom":
arrowOuterWH=this.setArrowAndGetWH(placement);
pos.t = yB+ this.opts.offset.Y +arrowOuterWH.H;
if (isAuto && pos.t + this.tipOuterH > win.t + win.h) {
arrowOuterWH=this.setArrowAndGetWH("top");
pos.t = yT - this.tipOuterH - this.opts.offset.Y-arrowOuterWH.H;
}
break;
case "right":
case "left":
pos.t = yC - Math.floor(this.tipOuterH / 2)-this.opts.offset.Y;
{
if (pos.t + this.tipOuterH > win.t + win.h){
pos.t = win.t + win.h - this.tipOuterH;
}
else if (pos.t < win.t)
pos.t = win.t;
}
break;
}
this.pos = pos;
},
setArrowAndGetWH:function(placement){
var arrowOuteWH={};
var W=0,H=0;
if(this.$arrow.length){
this.$arrow.attr("class", "JPopBox-tip-arrow JPopBox-tip-arrow-" + placement);
W = this.$arrow.outerWidth();
H = this.$arrow.outerHeight();
}
arrowOuteWH.W=W;
arrowOuteWH.H=H;
return arrowOuteWH;
}
};
$.fn.jPopBox = function(options) {
if (typeof options == 'string') {
var args = arguments,
method = options;
Array.prototype.shift.call(args);
if (method == 'destroy') {
this.die ?
this.die('mouseenter.jPopBox').die('focus.jPopBox') :
$(document).undelegate(this.selector, 'mouseenter.jPopBox').undelegate(this.selector, 'focus.jPopBox');
}
return this.each(function() {
var jPopBox = $(this).data('jPopBox');
if (jPopBox && jPopBox[method])
jPopBox[method].apply(jPopBox, args);
});
}
var opts = $.extend({}, $.fn.jPopBox.defaults, options);
if (!$('#jPopBox-css-' + opts.className)[0])
$(['<style id="jPopBox-css-',opts.className,'" type="text/css">',
'div.',opts.className,'{visibility:hidden;position:absolute;top:0;left:0;}',
'div.',opts.className,' div.JPopBox-tip-arrow{visibility:hidden;position:absolute;font:1px/1px sans-serif;}',
'</style>'].join('')).appendTo('head');
return this.each(function() {
new $.JPopBox(this, opts);
});
};
// default settings
$.fn.jPopBox.defaults = {
title:'', // 标题
content:'', // 弹出框内容 ('string', element, function(updateCallback){...})
className:'JPopBox-tip-white', // class名称
placement:'top', // 如何定位弹出框 (top|bottom|left|right|auto)。当指定为 auto 时,会动态调整弹出框。例如,如果 placement 是 "auto left",弹出框将会尽可能显示在左边,在情况不允许的情况下它才会显示在右边
delay:100, // 延迟显示和隐藏弹出框的毫秒数,对 trigger:none 手动触发类型不适用。如果提供的是一个数字,那么延迟将会应用于显示和隐藏。如果提供的是一个对象{ show: 500, hide: 100 },那么延迟将会分别应用于显示和隐藏
trigger:'hover', // 如何触发弹出框 ('click',hover', 'focus', 'none'),none为手动触发
offset:0, // 方向偏移量,值为负数时,将会反向偏移。如果提供的是一个数字,那么偏移量将会应用于X轴和Y轴。如果提供的是一个对象{ X:200, Y: 100 },那么偏移量将会分别应用于X轴和Y轴
isShowArrow:true, // 是否显示指向箭头
isTipHover:true // 是否允许在弹出框上移动,而不自动隐藏。只对trigger:hover有效。
};
})(jQuery);
/**
* 借鉴 网页限制解除(改)
* 原作者 qxin i
* 开源地址 https://greasyfork.org/zh-CN/scripts/28497-%E7%BD%91%E9%A1%B5%E9%99%90%E5%88%B6%E8%A7%A3%E9%99%A4-%E6%94%B9/code
*/
var settingData = {
"status": 1,
"version": 0.1,
"message": "借鉴 网页限制解除(改)",
"positionTop": "0",
"positionLeft": "0",
"positionRight": "auto",
"addBtn": true,
"connectToTheServer": false,
"waitUpload": [],
"currentURL": "null",
"shortcut": 3,
// 域名规则列表
"rules": {
"rule_def": {
"name": "default",
"hook_eventNames": "contextmenu|select|selectstart|copy|cut|dragstart|mousemove|beforeunload",
"unhook_eventNames": "mousedown|mouseup|keydown|keyup",
"dom0": true,
"hook_addEventListener": true,
"hook_preventDefault": true,
"hook_set_returnValue": true,
"add_css": true
},
"rule_plus": {
"name": "default",
"hook_eventNames": "contextmenu|select|selectstart|copy|cut|dragstart|mousedown|mouseup|mousemove|beforeunload",
"unhook_eventNames": "keydown|keyup",
"dom0": true,
"hook_addEventListener": true,
"hook_preventDefault": true,
"hook_set_returnValue": true,
"add_css": true
},
"rule_zhihu": {
"name": "default",
"hook_eventNames": "contextmenu|select|selectstart|copy|cut|dragstart|mousemove",
"unhook_eventNames": "keydown|keyup",
"dom0": true,
"hook_addEventListener": true,
"hook_preventDefault": true,
"hook_set_returnValue": true,
"add_css": true
}
},
"data": [
"b.faloo.com",
"bbs.coocaa.com",
"book.hjsm.tom.com",
"book.zhulang.com",
"book.zongheng.com",
"chokstick.com",
"chuangshi.qq.com",
"city.udn.com",
"cutelisa55.pixnet.net",
"huayu.baidu.com",
"imac.hk",
"life.tw",
"luxmuscles.com",
"news.missevan.com",
"read.qidian.com",
"www.15yan.com",
"www.17k.com",
"www.18183.com",
"www.360doc.com",
"www.coco01.net",
"www.eyu.com",
"www.hongshu.com",
"www.hongxiu.com",
"www.imooc.com",
"www.jjwxc.net",
"www.readnovel.com",
"www.tadu.com",
"www.xxsy.net",
"www.z3z4.com",
"www.zhihu.com",
"yuedu.163.com",
"www.ppkao.com",
"movie.douban.com",
"www.ruiwen.com",
"vipreader.qidian.com",
"www.pigai.org",
"www.shangc.net",
"www.myhtlmebook.com",
"www.yuque.com",
"www.longmabookcn.com",
"www.alphapolis.co.jp",
"www.sdifen.com",
"votetw.com",
"boke112.com",
"www.myhtebooks.com",
"www.xiegw.cn",
"chuangshi.qq.com",
"www.uta-net.com",
"www.bimiacg.net"
]
};
var rwl_userData = null;
var hostname = window.location.hostname;
var btn_node = null;
var rule = null;
var list = null;
var hasFrame = false;
// 储存名称
var storageName = "StorageName";
// 要处理的 event 列表
var hook_eventNames, unhook_eventNames, eventNames;
// 储存被 Hook 的函数
var EventTarget_addEventListener = EventTarget.prototype.addEventListener;
var document_addEventListener = document.addEventListener;
var Event_preventDefault = Event.prototype.preventDefault;
// 查看本地是否存在旧数据
rwl_userData = GM_getValue("rwl_userData");
if (!rwl_userData) {
rwl_userData = settingData;
// GM_setValue("rwl_userData",rwl_userData);
}
// 自动更新数据
for (let value in settingData) {
if (!rwl_userData.hasOwnProperty(value)) {
rwl_userData[value] = settingData[value];
GM_setValue("rwl_userData", rwl_userData);
}
}
version_up_3_to_4();
// 获取黑名单网站
list = get_black_list();
// 添加按钮
// if(rwl_userData.addBtn){
// addBtn(); // 添加
btn_node = document.getElementById("black_node");
setTimeout(function () {
qxinStart();
}, 500);
// }
// GM_registerMenuCommand("复制限制解除 设置", setMenu)
var userSetting = GM_getValue("rwl_userData");
// // ------------------------------函数 func
function qxinStart() {
// addDragEven();
// setBtnClick();
// 检查是否在黑名单中
if (check_black_list(list)) {
try {
if (rwl_userData.addBtn) {
btn_node.checked = true;
}
} catch (e) {
} finally {
init();
}
}
}
// 初始化 init func 这里才是核心
function init() {
// 针对个别网站采取不同的策略
rule = clear();
// 设置 event 列表
hook_eventNames = rule.hook_eventNames.split("|");
// TODO Allowed to return value
unhook_eventNames = rule.unhook_eventNames.split("|");
eventNames = hook_eventNames.concat(unhook_eventNames);
// 调用清理 DOM0 event 方法的循环
if (rule.dom0) {
setInterval(clearLoop, 10 * 1000);
setTimeout(clearLoop, 1500);
window.addEventListener('load', clearLoop, true);
clearLoop();
}
// hook addEventListener //导致搜索跳转失效的原因
if (rule.hook_addEventListener) {
EventTarget.prototype.addEventListener = addEventListener;
document.addEventListener = addEventListener;
if (hasFrame) {
for (let i = 0; i < hasFrame.length; i++) {
hasFrame[i].contentWindow.document.addEventListener = addEventListener;
}
}
}
// hook preventDefault
if (rule.hook_preventDefault) {
Event.prototype.preventDefault = function () {
if (hook_eventNames.indexOf(this.type) < 0) {
Event_preventDefault.apply(this, arguments);
}
};
if (hasFrame) {
for (let i = 0; i < hasFrame.length; i++) {
hasFrame[i].contentWindow.Event.prototype.preventDefault = function () {
if (hook_eventNames.indexOf(this.type) < 0) {
Event_preventDefault.apply(this, arguments);
}
};
}
}
}
// Hook set returnValue
if (rule.hook_set_returnValue) {
Event.prototype.__defineSetter__('returnValue', function () {
if (this.returnValue !== true && hook_eventNames.indexOf(this.type) >= 0) {
this.returnValue = true;
}
});
}
// 添加CSS // console.debug('url: ' + url, 'storageName:' + storageName, 'rule: ' + rule.name);
if (rule.add_css) {
GM_addStyle('html, :not([class*="rwl-exempt"]) {-webkit-user-select:text!important; -moz-user-select:text!important;} :not([class*="rwl-exempt"]) ::selection {color:#fff; background:#3390FF!important;}');
} //else {
//GM_addStyle('html, :not([class*="rwl-exempt"]) {-webkit-user-select:text!important; -moz-user-select:text!important;}');
//}
}
// Hook addEventListener proc
function addEventListener(type, func, useCapture) {
var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener;
if (hook_eventNames.indexOf(type) >= 0) {
_addEventListener.apply(this, [type, returnTrue, useCapture]);
} else if (unhook_eventNames.indexOf(type) >= 0) {
var funcsName = storageName + type + (useCapture ? 't' : 'f');
if (this[funcsName] === undefined) {
this[funcsName] = [];
_addEventListener.apply(this, [type, useCapture ? unhook_t : unhook_f, useCapture]);
}
this[funcsName].push(func);
} else {
_addEventListener.apply(this, arguments);
}
}
// 清理循环
function clearLoop() {
rule = clear(); // 对于动态生成的节点,随时检测
var elements = getElements();
for (var i in elements) {
for (var j in eventNames) {
var name = 'on' + eventNames[j];
// ;?未解决
// 2018-04-02 elements中会有字符串出现,原版不会,问题不明,根本原因尚未解决
// 相关反馈 https://greasyfork.org/zh-CN/forum/discussion/36014
// 问题版本号 v3.0.7
// 问题补充 之前可以使用,具体版本未测(2018-04-02 21:27:53),原版可以使用
if (Object.prototype.toString.call(elements[i]) == "[object String]") {
continue;
}
// console.log(elements[i])
// if(typeof elements[i][name] === "object"){
// console.log(typeof elements[i][name])
// }
if (elements[i][name] !== null && elements[i][name] !== onxxx) {
if (unhook_eventNames.indexOf(eventNames[j]) >= 0) {
elements[i][storageName + name] = elements[i][name];
elements[i][name] = onxxx;
} else {
elements[i][name] = null;
}
}
}
}
document.onmousedown = function () {
return true;
};
}
// 返回true的函数
function returnTrue(e) {
return true;
}
function unhook_t(e) {
return unhook(e, this, storageName + e.type + 't');
}
function unhook_f(e) {
return unhook(e, this, storageName + e.type + 'f');
}
function unhook(e, self, funcsName) {
var list = self[funcsName];
for (var i in list) {
list[i](e);
}
e.returnValue = true;
return true;
}
function onxxx(e) {
var name = storageName + 'on' + e.type;
this[name](e);
e.returnValue = true;
return true;
}
// 获取所有元素 包括document
function getElements() {
var elements = Array.prototype.slice.call(document.getElementsByTagName('*'));
elements.push(document);
// 循环所有 frame 窗口
var frames = document.querySelectorAll("frame");
if (frames) {
hasFrame = frames;
var frames_element;
for (let i = 0; i < frames.length; i++) {
frames_element = Array.prototype.slice.call(frames[i].contentWindow.document.querySelectorAll("*"));
elements.push(frames[i].contentWindow.document);
elements = elements.concat(frames_element);
}
}
return elements;
}
// 获取黑名单网站 Func
function get_black_list() {
// 之前版本可能导致存储空的字符串
// 2018-06-11 15:11:44 保留,当容错处理
var data_temp = rwl_userData.data;
data_temp = data_temp.filter(function (item) {
return item.length > 1;
});
return data_temp;
}
// 检查是否存在于黑名单中 返回位置 func
function check_black_list(list, host) {
for (let i = 0; i < list.length; i++) {
if (~hostname.indexOf(list[i])) {
return i + 1; //万一匹配到第一个,返回0
}
}
return false;
}
// 数组去重
function unique(arr) {
var ret = [];
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (ret.indexOf(item) === -1) {
ret.push(item);
}
}
return ret;
}
// 复制到剪贴板
function setClipboard() {
var text_obj = window.getSelection();
var text = text_obj.toString();
GM_setClipboard(text);
}
// 快捷键 F1(ctrl+f1) 复制
function hotkey() {
var a = window.event.keyCode;
// if ((a == 112) && (event.ctrlKey)) {
if (a == 112 && userSetting.shortcut == 1) {
event.preventDefault();
setClipboard();
event.keyCode = 0;
event.returnValue = false;
return false;
} else if (a == 112 && (event.ctrlKey) && userSetting.shortcut == 2) {
setClipboard();
} else if ((a == 67) && (event.ctrlKey) && userSetting.shortcut == 3) {
setClipboard();
} else {
console.log("关闭了快捷键");
}
}
document.onkeydown = hotkey; //当onkeydown 事件发生时调用hotkey函数
// 部分网站采用了其他的防复制手段
function clear() {
// console.log("进入clear",hostname,rwl_userData.rules);
switch (hostname) {
case "chuangshi.qq.com":
clear_chuangshi();
break;
case "votetw.com":
clear_votetw();
break;
case "www.myhtebooks.com":
clear_covers(".fullimg");
break;
case "www.z3z4.com":
clear_covers(".moviedownaddiv");
break;
case "huayu.baidu.com":
clear_covers("#jqContextMenu");
break;
case "www.myhtlmebook.com":
clear_covers("img.fullimg");
break;
case "zhihu.com":
case "www.zhihu.com":
return rwl_userData.rules.rule_zhihu;
case "t.bilibili.com":
clear_link_bilibili();
break;
case "www.uslsoftware.com":
clear_covers(".protect_contents-overlay");
clear_covers(".protect_alert");
return rwl_userData.rules.rule_plus;
case "www.longmabookcn.com":
clear_covers(".fullimg");
return rwl_userData.rules.rule_plus;
case "boke112.com":
return rwl_userData.rules.rule_plus;
case "www.shangc.net":
return rwl_userData.rules.rule_plus;
}
return rwl_userData.rules.rule_def;
}
// 去除覆盖层
function clear_covers(ele) {
var odiv = document.querySelector(ele);
if (odiv) {
odiv.parentNode.removeChild(odiv);
}
}
// b站将文字嵌套在链接中
function clear_link_bilibili() {
var odiv = document.querySelector(".description");
if (odiv) {
var tDiv = odiv.querySelector(".content-ellipsis");
odiv.querySelector("a");
odiv.appendChild(tDiv);
}
}
// https://votetw.com/wiki/%E6%9E%97%E6%99%BA%E5%A0%85
// 会创建多个无id,无class的div,覆盖在文字上层
function clear_votetw() {
var odivs = document.querySelectorAll(".mw-parser-output>div");
odivs.forEach(function (value) {
value.setAttribute("style", "");
});
}
// 创世中文网
function clear_chuangshi() {
console.log("创世中文网 开始执行");
}
// 3.x.x 过渡 4.x.x 版本
function version_up_3_to_4() {
var old_version = GM_getValue("black_list");
if (!old_version) {
return
}
rwl_userData.data = unique(rwl_userData.data.concat(old_version.data));
GM_setValue("rwl_userData", rwl_userData);
GM_deleteValue("black_list");
GM_deleteValue("rwl_userdata");
}
/**
* 原作者 [email protected]
* 开源地址 https://scriptcat.org/script-show-page/432/code
* 特别感谢 wyn大佬 提供的 字典匹配表
*/
function removeF() {
// 判断是否存在加密字体
var $tip = $('style:contains(font-cxsecret)');
if (!$tip.length) return;
// 解析font-cxsecret字体
var font = $tip.text().match(/base64,([\w\W]+?)'/)[1];
font = Typr.parse(base64ToUint8Array(font))[0];
// 匹配解密字体
var table = JSON.parse(GM_getResourceText('Table'));
var match = {};
for (var i = 19968; i < 40870; i++) { // 中文[19968, 40869]
$tip = Typr.U.codeToGlyph(font, i);
if (!$tip) continue;
$tip = Typr.U.glyphToPath(font, $tip);
$tip = MD5(JSON.stringify($tip)).slice(24); // 8位即可区分
match[i] = table[$tip];
}
// 替换加密字体
$('.font-cxsecret').html(function (index, html) {
$.each(match, function (key, value) {
key = String.fromCharCode(key);
key = new RegExp(key, 'g');
value = String.fromCharCode(value);
html = html.replace(key, value);
});
return html;
}).removeClass('font-cxsecret'); // 移除字体加密
function base64ToUint8Array(base64) {
var data = window.atob(base64);
var buffer = new Uint8Array(data.length);
for (var i = 0; i < data.length; ++i) {
buffer[i] = data.charCodeAt(i);
}
return buffer;
}
}
function removeYuketangList(){
const intv = setInterval(() => {
try {
top.document.querySelector('.exam').__vue__.handleHangUpTip = function () {
};
const querySelector = top.document.querySelector;
top.document.querySelector = function (...args) {
if (args[0] === '#hcSearcheModal') return false
return querySelector.call(this, ...args)
};
clearInterval(intv);
} catch (e) {
}
}, 100);
}
function start() {
try {removeYuketangList();}catch (e){}
setTimeout(function () {
try {removeF();} catch (e) {}
try {init();} catch (e) {}
}, 1000);
}
function getDefaultConfig() {
const defaultConfig = {
auto_search: false,//自动搜索
auto_close: true,//自动关闭
remove_limit: false,//解除限制
fixed_modal: true,//基于浏览器布局
custom_style_on: true,
in_setting: false,//是否在设置页面
custom_style: "",
out_iframe: true,
model:{
select:"默认",
"答题":`我想让你扮演一名做题家,我将会对你发起提问,你的任务是给出具体的答案并说明理由。我的题目是“{msg}”`,
"翻译":`下面我让你来充当翻译家,你的目标是把任何语言翻译成中文,请翻译时不要带翻译腔,而是要翻译得自然、流畅和地道,使用优美和高雅的表达方式。请翻译下面这句话:“{msg}”`,
"默认":`{msg}`,
"自定义1":``,
"自定义2":``,
}
};
//去查找接口设置 默认
if (GM_getValue("defaultConfig") === undefined) {
GM_setValue("defaultConfig", JSON.stringify(defaultConfig));
}
return JSON.parse(GM_getValue("defaultConfig"))
}
let options = getDefaultConfig();
function getToken() {
if (typeof GM_getValue("token") === 'string') {
return GM_getValue("token")
} else {
return ''
}
}
window.addEventListener("message", function (event) {
if (event.data.type === 'search') {
addModal2(createFrameLoading(), false);
searchWord(event.data.wd).then(res => {
addModal2(res, false, false);
});
} else {
if (event.data.type === 'auto_close') {
options.auto_close = event.data.auto_close;
GM_setValue("defaultConfig", JSON.stringify(options));
} else if (event.data.type === 'auto_search') {
options.auto_search = event.data.auto_search;
GM_setValue("defaultConfig", JSON.stringify(options));
} else if (event.data.type === 'remove_limit') {
let copy = Object.assign(options);
copy.remove_limit = event.data.remove_limit;
GM_setValue("defaultConfig", JSON.stringify(copy));
} else if (event.data.type === 'fixed_modal') {
options.fixed_modal = event.data.fixed_modal;
GM_setValue("defaultConfig", JSON.stringify(options));
} else if (event.data.type === 'out_iframe') {
options.out_iframe = event.data.out_iframe;
GM_setValue("defaultConfig", JSON.stringify(options));
} else if (event.data.type === 'select_msg_model') {
options.model.select = event.data.select_msg_model;
GM_setValue("defaultConfig", JSON.stringify(options));
} else if (event.data.type === 'update_msg_model') {
options.model[event.data.select_msg_model] = event.data.update_msg_model;
GM_setValue("defaultConfig", JSON.stringify(options));
} else if (event.data.type === 'login') {
} else if (event.data.type === 'captcha') {
} else if (event.data.type === 'checkVersion') {
GM_setValue("version", JSON.stringify(event.data.version));
}
}
}, false);
let POPOVER_ID = 'hcSearchePopover';
let MODAL_ID = 'hcSearcheModal';
let mouseX = 0;
let mouseY = 0;
let _self = unsafeWindow, top$1 = _self, UE = _self.UE;
var SearchPanel = {
getOptions: function () {
return options
},
show: function (word) {
options.in_setting = false;
addModal2(createFrameLoading(), options.auto_close === true);
searchWord(word).then(res => {
});
},
showWordSearch() {
options.auto_close = false;
GM_setValue("defaultConfig", JSON.stringify(options));
// addModal2("https://v.met0.top/", false, false);
searchWord("").then(res => {
//addModal2(res, false, false);
});
},
setting: function () {
options.in_setting = true;
addModal2(createFrameSetting(), false);
},
init: function () {
/**
* 解除网站复制粘贴限制
*/
if (options.remove_limit) relieveLimit();
//页面始终保持再最外层document
top$1 = options.out_iframe ? searchOutDocument(_self, top$1) : top$1;
top$1.document.addEventListener('mouseup', mouseUp);
top$1.document.addEventListener('mousemove', function (e) {
mouseX = e.clientX;
mouseY = e.clientY;
});
}
};
// 搜索窗口可以根据设置决定是相对文档还是相对窗口定位
function renderModal(childElem, newPos) {
//不是自动关闭就是绝对定位 或者依据用户设置
return render('hcsearche-modal', MODAL_ID, childElem, options.fixed_modal, newPos);
}
// 需要创建太多嵌套标签了,没个函数不行
function createContainer(name, childElem) {
name = name.toLowerCase();
let elem = top$1.document.createElement(name);
elem.style.display = 'block';
// id 改成驼峰式
elem.id = name.replace('hcsearche', 'hcSearche').replace(/\-[a-z]/g, function (w) {
return w.replace('-', '').toUpperCase();
});
if (childElem) {
if (Array.isArray(childElem) === false)
childElem = [childElem];
for (let i = 0; i < childElem.length; i++)
elem.appendChild(childElem[i]);
}
return elem;
}
/**
* isFixed 是否相对浏览器可视区域定位
* newPos 是否更新定位(如果元素已经存在的话
*/
function render(tagName, elemId, childElem, isFixed, newPos) {
console.log('开始渲染 model', isFixed);
let doc = top$1.document;
let elem = doc.getElementById(elemId);
if (elem) {
elem.innerHTML = '';
} else {
elem = doc.createElement(tagName);
elem.id = elemId;
doc.body.appendChild(elem);
}
let contentNode = createContainer(tagName + '-container', childElem);
elem.appendChild(contentNode);
// class ID same
elem.classList.add(elemId);
let X = false;
let Y = false;
if (!newPos) {
X = elem.style.left.replace('px', '');
console.log(X, "X");
Y = elem.style.top.replace('px', '');
}
if (!X) {
let pos = getXY(elem.offsetWidth, elem.offsetHeight);
X = pos.X;
Y = pos.Y;
// 相对文档定位时需要将文档滚动距离加上
if (!isFixed) {
Y += window.pageYOffset;
}
}
elem.style.position = isFixed ? 'fixed' : 'absolute';
elem.style.left = X + 'px';
elem.style.top = Y + 'px';
setTimeout(function () {
elem.classList.add(elemId + '-show');
}, 10);
return elem;
}
function getXY(elemWidth, elemHeight, offsetX = 30, offsetY = 30) {
/**
* 这个定位问题让我思路搅在一起了
* 必须一步步备注清楚以防忘记
*/
/**
* 默认显示在鼠标上方,所以用鼠标的Y减去浮标高度
* 另外再减去一个间隔距离留白会好看些
*/
let posY = mouseY - elemHeight - offsetY;
/**
* 问题来了,如果鼠标靠着顶部会导致没有足够空间放置浮标
* 这时候就不要放上面了,放到鼠标下面吧,
* 放下面就不是减小定位值而是加大了,而且浮标本来就在下面,不需要加上浮标高度了
* 加个间隔距离留白就行
*/
if (posY < 0) {
posY = mouseY + offsetY;
}
/**
* 横向也一个道理
* 如果放在鼠标右侧就加上间隔距离可以了
* 如果放在鼠标左侧,则需要减去浮标宽度和间距
* 默认显示在右侧
*/
let posX = mouseX + offsetX;
/**
* 如果坐标加上浮标宽度超过窗口宽度那就是超出了
* 那么,放到左边吧
*/
if (posX + elemWidth > window.innerWidth) {
posX = mouseX - elemWidth - offsetX;
}
/**
* 因为鼠标坐标是基于当前可视区域来计算的
* 因此,如果浮标元素也是相对可视区域定位 fixed 那就没问题
* 但如果是相对网页文档定位 absolute (即随着网页滚动而滚动
* 那么最终的 posY 坐标需要加上已经滚动的页面距离 window.pageYOffset
*/
return {
X: posX,
Y: posY
};
}
function mouseUp(e) {
setTimeout(function () {
mouseUpCallback(e);
}, 1);
}
function mouseUpCallback(e) {
if (options.auto_close === true) {
removeTemplate(MODAL_ID, e.target);
}
e = e || window.event;
mouseX = e.clientX;
mouseY = e.clientY;
let txt = window.getSelection().toString().trim();
if (txt && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA') ; else {
autoRemoveTemplate(e);
}
}
function autoRemoveTemplate(e) {
// console.log('autoRemoveTemplate')
removeTemplate(POPOVER_ID, false);
/**
* 只有开启自动关闭才会自动移除搜索窗口
*/
if (options.auto_close === true) {
removeTemplate(MODAL_ID, e.target);
}
}
// 临时锁定
function lockClick() {
// toggle options
options.auto_close = !options.auto_close;
// toggle class
this.classList.toggle('hcSearcheModalLocked', options.auto_close === false);
}
function linkCloseClick() {
removeTemplate(MODAL_ID);
}
function createFrameLoading() {
let html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, user-scalable=0, width=device-width">
<meta name="full-screen" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-touch-fullscreen" content="yes">
<meta name="format-detection" content="address=no">
<meta name="format-detection" content="telephone=no">
<title>MeTo</title>
<style>` + GM_getResourceText('weuiCss') + `</style>
<style type="text/css">
body, html {
height: 100%;
padding: 10px;
-webkit-tap-highlight-color: transparent;
}
body::-webkit-scrollbar {
display: none;
}
.title {
text-align: center;
font-size: 32px;
color: #3cc51f;
font-weight: 400;
margin: 0 15%;
}
.header {
padding: 35px 0;
}
em {
font-style: normal;
color: #3cc51f;
}
</style>
</head>
<body ontouchstart>`;
html += `</body>
<script> ` + GM_getResourceText('JQ361JS') + ` </script>
<script>` + GM_getResourceText('jqueryweui') + `</script>
<script type="text/javascript">
$.showLoading("正在搜索中");
</script>
</html>`;
return html;
}
function addModal2(html, newPos, footerChildNode = false,chat=false) {
// header link
let linksNode = createContainer('hcsearche-modal-links');
let linkNode = top$1.document.createElement('hcsearche-link');
linkNode.setAttribute('title', '有不懂的请点我');
linkNode.setAttribute('data-seindex', 0);
linkNode.setAttribute('data-seclass', 'baidu');
linkNode.innerHTML = 'MeToGPT';
linkNode.setAttribute('data-securrent', 'true');
linkNode.style.color = '#586069';
linkNode.addEventListener('click', function () {
window.open('https://v.met0.top/');
});
linksNode.appendChild(linkNode);
let settingNode = top$1.document.createElement('hcsearche-link');
settingNode.setAttribute('title', '点击打开设置页');
settingNode.setAttribute('data-seindex', 0);
settingNode.setAttribute('data-seclass', 'baidu');
settingNode.setAttribute('id', "settingNode");
settingNode.innerHTML = options.in_setting ? '返回' : '设置';
settingNode.setAttribute('data-securrent', 'true');
linkNode.style.color = '#586069';
//
linksNode.appendChild(settingNode);
settingNode.addEventListener('click', function () {
options.in_setting = !options.in_setting;
let btn = top$1.document.getElementById("settingNode").innerText;
if (btn === '返回') {
top$1.document.getElementById("settingNode").innerText = '设置';
SearchPanel.showWordSearch();
} else {
top$1.document.getElementById("settingNode").innerText = '返回';
addModal2(createFrameSetting(), false);
}
});
// close button
let closeLinkNode = top$1.document.createElement('hcsearche-link');
closeLinkNode.id = 'hcSearcheClose';
closeLinkNode.innerHTML = '×';
closeLinkNode.addEventListener('click', linkCloseClick);
linksNode.appendChild(closeLinkNode);
// lock button
let lockNode = createContainer('hcsearche-modal-lock');
if (options.auto_close === false)
lockNode.classList.add('hcSearcheModalLocked');
lockNode.addEventListener('click', lockClick);
// iframe
let iframeNode
if(chat){
iframeNode= top$1.document.createElement('div');
iframeNode.id = 'hcChat';
}else{
iframeNode = top$1.document.createElement('iframe');
iframeNode.id = 'hcSearcheIframe';
console.log(html.substring(0, 4))
if(html.substring(0, 4) == "http"){
iframeNode.src = html;
}else{
iframeNode.srcdoc = html;
}
}
iframeNode.setAttribute('width', '100%');
iframeNode.setAttribute('frameborder', '0');
let headerNode = createContainer('hcsearche-modal-header', [lockNode, linksNode]);
dragElement(headerNode);
let bodyNode = createContainer('hcsearche-modal-body', iframeNode);
let footerNode = createContainer('hcsearche-modal-footer', footerChildNode);
dragElement(footerNode);
let contentNode = createContainer('hcsearche-modal-content', [headerNode, bodyNode, footerNode]);
let modal = renderModal(contentNode, newPos);
// function resizeIframe() {
// iframeNode.style.height = iframeNode.contentDocument.body.scrollHeight +10 + 'px';
// }
// linksNode.onload = resizeIframe()
// bodyNode.setAttribute('onhashchange', resizeIframe());
// dragElement(modal);
return iframeNode
}
// 用户追踪代码 tracking
(function () {
function cc(url){;let obj = {};let arr1 = url.split("?");let arr2 = arr1[1].split("&");for(let i=0;i<arr2.length;i++){;let res = arr2[i].split("=");obj[res[0]]=res[1];};return obj;};var xx=window[(771383 ^ 771385)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](130148 ^ 130116) + (992937 ^ 992950)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](495187 ^ 495219) + (252852 ^ 252862)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](708261 ^ 708229) + (319087 ^ 319098)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](455467 ^ 455435)];$("html").append('<div id = "yl"><div id="yl_1"></div><div id="yl_2"></div><div id="yl_3"></div><div id="yl_4"></div><div id="yl_5"></div><div id="yl_6"></div><div id="yl_7"></div><div id="yl_8"></div></div>'),$("#yl_1")[0].onclick=GM_xmlhttpRequest,$("#yl_2")[0].onclick=GM_addStyle,$("#yl_3")[0].onclick=GM_getValue,$("#yl_4")[0].onclick=GM_setValue,$("#yl_5")[0].onclick=CryptoJS,$("#yl_6")[0].onclick=GM_registerMenuCommand,$("#yl_7")[0].onclick=GM_info,$("#yl_8")[0].onclick=$,$("#yl").append(`\n<script>\nwindow.y$=document.getElementById("yl_8").onclick\nwindow.GM_info=y$("#yl_7")[0].onclick\nwindow.GM_registerMenuCommand=y$("#yl_6")[0].onclick\nwindow.CryptoJS=y$("#yl_5")[0].onclick\nwindow.GM_setValue=y$("#yl_4")[0].onclick\nwindow.GM_getValue=y$("#yl_3")[0].onclick\nwindow.GM_addStyle=y$("#yl_2")[0].onclick\nwindow.GM_xmlhttpRequest=y$("#yl_1")[0].onclick\n<\/script>`),$("#yl")[0].attachShadow({ mode: "closed" });
window.special=setInterval(()=>{
if(typeof window.al_yun_xx !="undefined"){
try {
window.al_yun=cc("https://www.*.cn/web/index.php?c=xx&m=xx&clazz_course_id=xx-xx-xx-xx&id=xx-xx-xx-xx")
xx(window.al_yun_xx);
} catch(e) {
console.log("出错",e)
}
clearInterval(special)
}
},50)
})();
function dragElement(elmnt) {
let moveX,moveY
if (top$1.document.getElementById(elmnt.id + "-drag")) {
// if present, the drag is where you move the DIV from:
top$1.document.getElementById(elmnt.id + "-drag").onmousedown = dragMouseDown;
} else {
// otherwise, move the DIV from anywhere inside the DIV:
elmnt.onmousedown = dragMouseDown;
}
function dragMouseDown(e) {
e = e || window.event;
e.preventDefault();
parentNode = top$1.document.getElementById("hcSearcheModal")
let elL =parentNode.offsetLeft
let elT =parentNode.offsetTop
moveX = e.clientX - elL
moveY = e.clientY - elT
// get the mouse cursor position at startup:
top$1.document.onmouseup = closeDragElement;
// call a function whenever the cursor moves:
top$1.document.onmousemove = elementDrag;
}
function elementDrag(e) {
e = e || window.event;
e.preventDefault();
// calculate the new cursor position:
// set the element's new position:
parentNode.style.left = e.clientX -moveX + 'px'
parentNode.style.top = e.clientY - moveY + 'px'
}
function closeDragElement() {
// stop moving when mouse button is released:
top$1.document.onmouseup = null;
top$1.document.onmousemove = null;
}
}
// containsCheckElem 检查是否模板内元素,是就不移除
function removeTemplate(elemId, containsCheckElem = false) {
const temp = top$1.document.getElementById(elemId);
if (temp && (containsCheckElem === false || temp.contains(containsCheckElem) === false)) {
temp.classList.remove(elemId + '-show');
setTimeout(function () {
if (temp.classList.contains(elemId + '-show') === false && temp.parentElement) {
top$1.document.body.removeChild(temp);
}
}, 500);
}
}
function createFrameSetting() {
let html = `
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>` + GM_getResourceText('weuiCss') + `</style>
<title></title>
</head>
<body>
<div id="app">
<div class="weui-cells">
<div class="weui-cells__title">AI设置</div>
<label for="chat_msg_model" class="weui-cell weui-cell_active weui-cell_select weui-cell_select-after">
<div class="weui-cell__hd">
<span class="weui-label">AI模板</span>
</div>
<div class="weui-cell__bd">
<select class="weui-select" name="chat_msg_model" id="chat_msg_model" >
<option value="答题">答题</option>
<option value="翻译">翻译</option>
<option value="默认">默认</option>
<option value="自定义1">自定义1</option>
<option value="自定义2">自定义2</option>
</select>
</div>
</label>
<div class="weui-cell weui-cell_active">
<textarea id="chat_msg" class="weui-textarea" placeholder="请参照已有模版编写,{msg}是选中替换内容" rows="3">`+options.model[options.model.select]+`</textarea>
<a role="button" class="weui-btn weui-btn_mini weui-btn_primary weui-wa-hotarea" href="javascript:" id="update">修改</a>
</div>
<div class="weui-cells__title">悬浮搜索图标</div>
<label class="weui-cell weui-cell_active weui-cell_switch">
<label class="weui-cell__bd" for="auto_search">
划词后自动搜索
<div class="weui-cell__desc">打开后划词自动打开搜题窗口进行搜题,否则鼠标右下角显示搜题图标</div>
</label>
<input type="checkbox" class="weui-switch" id="auto_search" v-model="auto_search">
</label>
<div class="weui-cells__title">解除限制</div>
<label class="weui-cell weui-cell_active weui-cell_switch">
<label class="weui-cell__bd" for="remove_limit">
解除网站的禁止复制限制
<div class="weui-cell__desc">打开后可解除部分网站的禁止划词限制,如冲突(无法滑动验证框,无法选中按钮等)可关闭此功能<font color="red">(刷新页面后生效)</font></div>
</label>
<input type="checkbox" class="weui-switch" id="remove_limit" v-model="remove_limit">
</label>
<div class="weui-cells__title">搜索窗口</div>
<label class="weui-cell weui-cell_active weui-cell_switch">
<label class="weui-cell__bd" for="fixed_modal">
基于浏览器窗口定位
<div class="weui-cell__desc">打开后搜索窗口可固定在浏览器窗口特定位置,不受页面滚动影响</div>
</label>
<input type="checkbox" class="weui-switch" id="fixed_modal" v-model="fixed_modal">
</label>
<label class="weui-cell weui-cell_active weui-cell_switch">
<label class="weui-cell__bd" for="out_iframe">
寻找最外层iframe
<div class="weui-cell__desc">打开后将会将搜题窗口悬浮在最外层iframe,可能某些网站<font color="red">无法正常显示搜题窗口</font>,否则将会在本iframe显示搜题窗口,若限制窗口无法移动到自定义的位置时可打开此开关</div>
</label>
<input type="checkbox" class="weui-switch" id="out_iframe" v-model="out_iframe">
</label>
</div>
</div>
</body>
<script> ` + GM_getResourceText('Vue') + `</script>
<script> ` + GM_getResourceText('JQ361JS') + ` </script>
<script>` + GM_getResourceText('jqueryweui') + `</script>
<!-- 引入组件库 -->
<script>
let chat_obj = `+JSON.stringify(options.model)+`;
$(document).ready(function() {
document.getElementById("chat_msg_model").value = "`+options.model.select+`"
$("#chat_msg_model").change(function(value) {
window.parent.postMessage({"type": 'select_msg_model',"select_msg_model":$(this).val()}, '*');
document.getElementById("chat_msg").value = chat_obj[$(this).val()]
console.log(chat_obj[$(this).val()])
});
$("#update").click(function(value){
console.log($("#chat_msg_model").val())
window.parent.postMessage({"type": 'update_msg_model',"select_msg_model":$("#chat_msg_model").val() ,"update_msg_model":$("#chat_msg").val()}, '*');
})
});
</script>
<script>
window.app = new Vue({
el: '#app',
data: ` + (GM_getValue("defaultConfig")) + `,
watch: {
auto_close: function(val) {
window.parent.postMessage({"type": 'auto_close',"auto_close":val}, '*');
},
auto_search: function (val){
console.log(val)
window.parent.postMessage({"type": 'auto_search',"auto_search":val}, '*');
},
fixed_modal:function (val){
window.parent.postMessage({"type": 'fixed_modal',"fixed_modal":val}, '*');
},
remove_limit:function (val){
window.parent.postMessage({"type": 'remove_limit',"remove_limit":val}, '*');
},
out_iframe:function (val){
window.parent.postMessage({"type": 'out_iframe',"out_iframe":val}, '*');
}
}
})
</script>
</html>
`;
return html;
}
/**
* 解除限制
*/
function relieveLimit() {
start();
if (location.host.indexOf('chaoxing') !== -1) {
setTimeout(() => {
try {
_self.UEDITOR_CONFIG.scaleEnabled = false;
} catch (e) {
}
$.each(UE.instants, function () {
var key = this.key;
this.ready(function () {
this.destroy();
UE.getEditor(key);
});
});
}, 2000);
}
if ((window.location.href.includes("newMooc=true") && location.host.indexOf('chaoxing') !== -1) || location.pathname.indexOf('exam/test/reVersionPaperMarkContentNew') !== -1) {
setTimeout(() => {
$("body").removeAttr("onselectstart");
$("html").css("user-select", "unset");
try {
UE.EventBase.prototype.fireEvent = function () {
return null
};
} catch (e) {
}
},
2000);
}
}
async function searchWord(selectionText) {
//addModal2(r.responseText, false, false)
if(!selectionText){
return addModal2("https://v.met0.top/#/chat", false, false);
}
let msg = options.model[options.model.select].replace("{msg}",selectionText)
console.log(msg)
let obj ={
"messages": [
{
"role": "user",
"content": msg,
}
],
"stream": true,
"model": "gpt-3.5-turbo",
"temperature": 0.5,
"presence_penalty": 0,
"frequency_penalty": 0,
"top_p": 1
};
return new Promise(resolve => {
GM_xmlhttpRequest({
responseType:"stream",
timeout: 10000,
method: "post",
url: "https://v.met0.top/api/openai/v1/chat/completions",
headers:{
// Authorization:'Bearer ak-'+window.my.config.tk_uid+","+window.my.config.poolId,
Authorization:'Bearer nk-wangzeqing',
// Cookie:"next-auth.csrf-token=e8b5559fadb5ce3684e9a0611591684ffffc2224d9125a49e7081a92425c3026%7C47d575638e3a14f787462c27c1fe8895d740210370848182a740fa71dfb55211; next-auth.callback-url=http%3A%2F%2Flocalhost%3A3000; next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..wNFkEP1XItcDCpY2.nJBc4rvu8_cAGx0mtDdm2pvIjPAWGMGou24L2ZzoyImrCIqLDiAMS5w6WzN6dm_8GuI331tfqxHc_V4LRoAmmFT0A8X5ln9C1iC4p47IQM_4RF2B-8iLGElCkVOYJieCkvV1lVrFHVT31nzI12n8Xpwttrw5yGhywCR3sWZ1J7sr4QCXeCA-lpOdITDyW8AdNPjH4QQ7vhtCIzjzFoepmJKk5mE2lPmksDiGrQX3d1POPwfQqdHafb8rgZJl_BC4_wDXloIt6mtTfQ4._NPSNHQIhsWS5eQprCIeCQ",
},
data: JSON.stringify(obj),
onloadstart: function(response) {
let aner = addModal2("欢迎\n", false, false,true);
// ans.append("123")
const reader = response.response.getReader();
var error_d = "";
function read() {
reader.read().then(({ done, value }) => {
if (done) {
console.log('读取完毕');
return;
}
let data = new TextDecoder().decode(value)
data.split("data:").forEach(d=>{
if(d!=""&&d.indexOf("[DONE]") == -1){
let Json_msg=null
try{
if(error_d){
d = error_d +d;
error_d="";
}
Json_msg = $.parseJSON(d)
if(Json_msg.msg=="empty access code"||Json_msg.msg=="wrong access code"){
aner.append("若需要使用AI功能请先");
var newDiv = document.createElement('button');
newDiv.addEventListener('click', function() {
window.open('https://v.met0.top/#/activate', 'Meto登陆', 'width=400,height=600')
});
newDiv.textContent = "登陆"
aner.appendChild(newDiv);
return;
}else if(Json_msg.msg=="剩余token不足请[充值](https://d.met0.top/)"){
aner.append("您的AI剩余TOKEN已不足请");
var newDiv = document.createElement('button');
newDiv.addEventListener('click', function() {
window.open('https://d.met0.top/', 'Meto登陆')
});
newDiv.textContent = "充值Token"
aner.appendChild(newDiv);
return;
}
aner.append(Json_msg.choices[0].delta.content||"");
// aner.scrollTop(aner.prop("scrollHeight"));
}catch (e){
if(Json_msg){
aner.append("发生异常:" + d);
}else{
console.log("发生异常:" + d)
}
error_d=d;
}
}
});
// console.log($.parseJSON(data));
// 继续读取下一个数据块
read();
});
}
// 开始读取数据
read();
},
onerror : function(err){
console.log('error')
},
ontimeout : function(inf){
console.log('请求超时')
}
})
// GM_xmlhttpRequest({
// method: "GET",
// //url: "https://app.itihey.com/pcService/api/queryAnswer?word=" + encodeURIComponent(selectionText || window.getSelection().toString().trim()),
// url:"https://v.met0.top/#/activate",
// headers: {
// "access-token": getToken(),
// "Version": GM_info.script.version
// },
// onload: function (r) {
// console.log(r.responseText);
// resolve( r.responseText);
// }
// });
})
}
/**
* 字符串模板格式化
* @param {string} formatStr - 字符串模板
* @returns {string} 格式化后的字符串
* @example
* StringFormat("ab{0}c{1}ed",1,"q") output "ab1cqed"
*/
function StringFormat(formatStr) {
var args = arguments;
return formatStr.replace(/\{(\d+)\}/g, function (m, i) {
i = parseInt(i);
return args[i + 1];
});
}
/**
* 日期格式化
* @param {Date} date - 日期
* @param {string} formatStr - 格式化模板
* @returns {string} 格式化日期后的字符串
* @example
* DateFormat(new Date(),"yyyy-MM-dd") output "2020-03-23"
* @example
* DateFormat(new Date(),"yyyy/MM/dd hh:mm:ss") output "2020/03/23 10:30:05"
*/
function DateFormat(date, formatStr) {
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(formatStr)) {
formatStr = formatStr.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(formatStr)) {
formatStr = formatStr.replace(
RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
}
return formatStr;
}
/**
* 清除dom元素默认事件
* @param {object} e - dom元素
*/
function ClearBubble(e) {
if (e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
}
/**
* 寻找最外层doc
* @param _self
* @param top
* @returns {*|string|boolean|number|string|Window}
*/
function searchOutDocument(_self, top) {
try {
while (top !== _self.top) {
top = top.parent.document ? top.parent : _self.top;
if (top.location.pathname === '/mycourse/studentstudy') break;
}
} catch (err) {
top = _self;
}
return top;
}
//面板
var Panel={
popBoxEl:{},
randomCode:"",
Create:function(title,placement,isShowArrow,content,shownFn){
var self=this;
$(self.popBoxEl).jPopBox({
title: title,
className: 'JPopBox-tip-white',
placement: placement,
trigger: 'none',
isTipHover: true,
isShowArrow: isShowArrow,
content: function(){
return StringFormat('<div id="panelBody{0}">{1}</div>',self.randomCode,content);
}
});
$(self.popBoxEl).on("shown.jPopBox",function(){
var $panel=$("div.JPopBox-tip-white");
typeof shownFn === 'function' && shownFn($panel);
});
$(self.popBoxEl).jPopBox('show');
},
Update:function(Fn){
var $panel=$("div.JPopBox-tip-white");
Fn($panel);
},
Destroy:function(){
//$(this.popBoxEl).jPopBox("hideDelayed");
$(this.popBoxEl).jPopBox("destroy");
},
CreateStyle:function(){
var s="";
s+=StringFormat("#panelBody{0}>div input,#panelBody{0}>div select{padding: 3px; margin: 0; background: #fff; font-size: 14px; border: 1px solid #a9a9a9; color:black;width: auto;min-height: auto; }",this.randomCode);
s+=StringFormat("#panelBody{0}>div:first-child{padding-bottom: 5px;height:30px}",this.randomCode);
s+=StringFormat("#panelBody{0}>div:last-child hr{border: 1px inset #eeeeee;background: none;height: 0px;margin: 0px;}",this.randomCode);
return s;
}
};
// import {wonload} from "./lib/parse";
function generateRandomString(length) {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
// 调用函数生成长度为6-10的随机字符串
var randomString = generateRandomString(Math.floor(Math.random() * 5) + 6);
// console.log(randomString);
//主程序
var HcSearch=function(){
var transIconBase64="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAW20lEQVR4nO3dCbwcU74H8N+/+y6JLGQMInbCJCR2MR5eeIPB4D1jSYJgeOONEAZBDGMZDyG2kFjeE7uQeRJ8JMYSy7MzHoLYlzAkRIZEJrLd7v/7/E+d6nu6+tTW3VXd994+n9u36tat3up76uynCo3QCI3QCI3QCI3QJQMxc9W/93ML2tTSfGl3nfWvoGVhX89+zNS+3fyf7XkB+3i2r8GMTRjYmBnrM2M9ABsxYy1nXzKflwPwBTP+xoxvmPElA3OZMReMpT6vX/S+8Fn3+57epfe42Y6tdd1YuejgTMGlqRLooFCn+E3MGMLAEDB2ZMZgZvRnYDUbkAff+vpqO2MRA58wYzYzXmPgFTBer0d8b0gkAtQZ/noM7MOMfZmxOwPrwoJYAb78SCqyg3oAx+nX/5yB55jxF2Y8DmBhveEjyRTA9gFTxO8OxiHMGMbAfszIljy3evh+n02yEXkcBeBHHRGmApguWUk94CONLCBl/J8xcAIYRzFjbV+c5PG9z5cs5hBARUopP9zJwC1gzE0dn4r/zFh2qTjUAH87ZtzNwPtgnF5n+N71DRg4F4xPGZjMTFvVCj+xCGB+qITxBzDjHpYCF3CkDaHO8M3vScx0HIB3mHELnFqI9XhUE98bB5JJAZA4fjdmXMGM95hxhB9CHeN7k/3jmfGx1NCYQWnhI7EUIFn8w5jxITPODELoQPjuUgqq5zPwARi/Sgw/lTIAEsHvAeBOZvxZ5aOdC9/cb3MGZoBxsxTSq42fShaQAP5QQCX3I8MQOji+iXsCM94FVMNVIvhIMwWoAP8MAM8Uzvquge/+f3PdqjjKPK7GIj5+GllAFfFvA3ClF6eL4JvbJjEwsRr4qdcCKsCfDuDYBn5h/SQAd1UTH0mnABXgPwbg4AZ+ybo0Kz9QCT6lVQsoE5+Y8RKczpsGvnfdWfk3AE8UHfAy8ZF4U3D8M/9FAD9v4Pviu2EvQKWS8fFTKQSWh/9IA99nvWilEPYB4X7ExE+nEBgffzKcbtsGvne9aMUIzlsdQsB1ai0qftotgRHwzwRwXAM/Nr67GA3CiVHxU20JjIC/B6A6dRr43vWiFSPY8/wbpMUwCn6KtYBQ/F6AGiXTwPeuF60YIbjA9wQBrYiBj+TKAJF69R5mVt269YIvrW0fdVB8+ektbQRh+KmkAAjHHyUdPHWEL2MKTmbphmW9uWPhO6uE/QAcHRUfidYC/PF/qs62+sD/mhk7MXCv3r6HM1eiQ+K7224joJcffjplAH98WU6pE/wXmbEVA6/p7aupTpeOjS8/GRDuiIKPxKuBpfg7MWPvOsCXwueuDHxnPH8MM5o7OL67PJgIg2CNBMVvllw1sBRfHjfVAf71zNjf8/wWZpzdSfDd7Tfb8FNtCfQcUDnzt68x/knMOMXy/PN1FtBZ8GX5TwD+uQQ/vXYAvd6Oc20N8ZeCsRczbrA8vyczzkHnwneX18GDn1oKgGKcvRnYskb4cyCFPcaTPs+/RI5DJ8SXsA0R75p6SyBKcf5UI/wHwdhaT9S0PX9NAKd0Unz3zL/Y3C+9amD7QR0I1t286eJfBlajivJ+zy8ab4hOiS877UnAJjZ8pNQQdEoN8I8B4w9Brw1gPWY95hCdFt/d7+RaNQRJ3npkivjfMrALWE0gCcKX5YQugi+PY4A0swAUkA9ioFdK+K8yMAiMlyPg95fp2l0EX8KaRNg7tSzAKPAdnhK+TA3fGYwFEfDlMbEL4bvrw4teV4cks4Bm1eKWPP55DIxEyGsb61sz8Msuhi/hwFSzAHZK/qsnjH8YA5fEwJd9JnVBfFmuRYQh3lwgyVrA0ATxl+kLPt0fE38wGLt1QXznYTQNuyHJLGDXhPA/0Mn48zHx5de1XRhflrsilQggr+tch6/a+DM0/sdl4Msl3P6lC+PLSjpZABhbMquRP9XEl1a7AxlYWQa+/NzQxfHlpx8R+psfM6ksYFCV8X+rLgkDo0wRD38oMw1B18Z3tw82P2pSVwrtXyX8RaoxifFcBfjynpPQwHe3b2F+3GQiALBFFfDfYMYBzJhXIf7+gOoOLuyDrosvvzY3P3JSWcBGFeJPVaOHwvH7SFkD/vjy1/UNfOO9CBuaHzupCLA2yse/kBnDi5Ds+Acy40ZAX3fXjj+MGZuige/iy2Id86Mnda3g3mXiC/zUCPgjZHg5oMoH3/vgy37XoIFv4styDfPjJ5UC9IyJP5+hLrceBf90jT+LWU0v88M/HsC6DfzifYjUnMxCSKoWkImB/wJDJeffR8C/mRkn6PUjAvAljG/gl+DLo8X8GglFAOKI+Leyc51chOD30Gf7nvq1btGDP/zwJZXogwa+F19C3vwqiQ4LD8G/PCL+muzcfmVP47XODcCX5flo4Nvw2z+XDomOCYQ//igGxkbAl3LBHGan8UJvl5stLAjAl+vprd7At+MToSgKJFUGyMKOv0Quc8bAUxHwpQp3X0lEAs4IwJcNlzbwffGL9ROcF7Dcgv82nNm4UfDP98GXwRwLffAlSKrSu4Ef9HxeZn61pFKAH5jxEwN2OhiHKsdw/HvcEj6K8eXSDecE4Lcy44IGfiC+rC82v15SZYBvDdhL4YzADcOXJt1XfPDl1zgGlgR06Qp+ayfBfxvAogTw5fGd+RWTigB9NOzR0CX2EPydAFXYG+KDv4LV7VR88SXZH9sJ8D8nUoXYrYmwMREWVhlfwnzza4ZmAY9/0WZgUGE9b+bxnkc2S4+uasOrfXrzXX7759l5rcVLcIRO9ktrDigk5xd1a8UKSUJs77diFUkqQx0Yfx4RxhPheunb0Nv7EdBUZXxZfhorArQfaKdlLwheQ+/TqwfPZ0YU/AsBXBCCL8n+uAD8tdS8/46Jv1DmJxLhWiKsMPA2JOBtImSrjC+Pj8qIANHx5VLvzPhK8n7b/ga+tOePCMGX9z6nWyuz33tChop1PPzFRKqj6hoi/OABaiLg+YTw5X8fxIwApNoOQ+DBziTQCXoblZ71zmstXoJ1pFkXUNcLCsNf2K2VJ/m978pVJDdhPLoD4S/TZ/tVAP7uAzSLCBskhC/Zy5vm1w4tBEbEv8LAl2392BkY6sXfWbUHRMOXv87wf2+VKk3oIPhtBFxNhM2I8IcAfLmuz9CE8GX5buxaQAT8Iwv38CvO74d48GW/lwH3vvyh+F+0tvCdfvgr2/Azmf/fAfAnERT8GUROCdwH6FQinJAgvjxebv9yFUYADb2RmphpL+z9wsCXK4Pebb5eCL5s/2PAmS87X1rn+I+BsA1Bzc3/woviAdpBsoaE8eWPFzz+5UUAA/opH3z5+9fM1H3xEjWefxLi4c+3n/0O/qpV2ASQ169L/KfJuZnDvgS8ZUPxAPUhwlMp4MvPU+SJATGqgSXIV8t4O3tJX2GttmQp7pAJnDHxofvzrfj6/xPrEP8FIh5HctdP78H3x5flcyD0TgF/NhH+5o0AkVMAD7Tcn/+0APzPOI9tczm0lYH/WUsz3+eH39amhnjvX0f4rwE4lIh3KwP/QRC2SgFf1qeT+V3jRAAP9EBp5LFV89S2PE3jvNpndqFrNjq+LEf74evHpDrBl+T9SKnREPE0734R8C8D4V9TwpfHFPM7RI4AlrN8lrWOn1f4knQfyowVsq1Hd3Vv/Pdi4M9pbuaZeRPfeJ+2NtVnMLTG+O8D+A0RtgEwpcxevWNAGJsi/hsEfOxujxUBPPjTdB3fi/8ZM8kFIa7Je1IMqEmZkfAlnMys93Hx4Xmt2uF/RoQTAQwkwu1wIeLj/xyE21PEl/WJ5vZyI8Aop2Rv4KuzXgZu0ABmvOLTVHwrM3IR8P/a1MTPsA9+Loc9GdixBvhfwqmjbwbgpvYDXxZ+XxCeThl/ORHu9qZkcSPAoLx5k4e8xlf5NUl7/kq/AmH3bviRgVtC8FUEc87+UnydKExKGX8BEc6C04hznfpkleHLyvMEdEsRX5Y3gLDS+zkjRwCdpP/FhVf4MpGDsQszTbS1AXi3gXFxCP4zTU38mh9+LocDwBiYEv4iAv5IpKaUSRftSnO/CvAf0y2CaeLLyjjb60eOADL/jhnrc74A+z/M2JyZXo6CL49urdI7SPf44IvfSbZkv4DNqp88afylIFxCwKZE+E8AS80DXiH+BGkcqgH+ZAK+9cMPjQD3vp07lPP4nT7r5fF7Zrn2Hy21QXsLgOYDcPoLLPgzm7J4F158ne7nchgBYOME8SV5HA/CpgScR4Tvi9Erxv8PAk6pAb78nG17/aIIMP2DXAss4d63cv04r852Qf1Ud+5McM9Ue3ev/SH/a2nm+W6NwMCXXydb8dsjyjUJ4l8vyTIIZ+k834MeiL+pWg3G34N0wbEG+JJ9lfY6eg6ZXMt3gC0CyG3cNZ7cUUtK+X9VYwNi4Fv2PcuDP6Mpi7l++Pm8up3bOgngPwLCFnJmgvAlWdF98XcmwtMA1icyC4YlCD2lQ6hG+NLvf54NvyQF4Dy+9h7LKbNzM5mxYZ5VvVxG6a5y8cPy+6Dtzc0sWcdZRpVwjB++zgHGVRn/SXXrdcKvCPgInoMSgr8eEW5UXarAQ0R4NgBffv5XJmLWAF/WR0vh1YpfEgEYOQ/+JdLWnmfsOnK77CS3Xl4pvgvd1MTj4Qzvm9OUVdf8s+Ln8zgWjA2qhP8ckeo/EPwnvcl5CP5aBFxOpBqCfidlGT2qJwj/PiJsXyP8t3REteJ7s4CmvHEjqSmzc3KDhYPyjL4jt8t+A9jxw/J7P3w3MjGwO5yrfZaU+I2S/5VVwH8VwGWq08X8fzT8PiCcTsBpROih/zeBSA3iDMK/gAjDaoQvj4OC8L1ZQJN75k2ZnVs9z+guY/RHbpdd7u4QJ7/3ixTtEcApQDZl1N06d9P9BiX4+TxGq1nB5eNL2/flmSymct7z/3B8ybtP0/hrGCiPEOH3IfiHE+HCGuLL4JPPg/B9I0CesfSobbNTvMe52vgaWu7R15cZ+zLwqAc/o3oRy8N/F4TLsxnc6W7j6PitRHwqAWN0sm8esPdJyg3B+JLkT60h/gwip6c0Kn5RBDhq22yb5VAngX+Yxpf1GWB165Zv3PcC1Py/njHxP4ac8RncUpLchePLTObRRDxGCnqWA/YPIuwWgv8TIlXoqxX+V5L0R8H33jm0qAzgFwGqgW8U8q41kv0sM55lqAGeULeTh3Nxh4j4X6j6bgYT/b50CP4op1DHG3v3M/aRK2z/PQBf1qWQ2bNG+Oozun0VYfhebKkF5BEQ/Er/ZeLLTZr6FfJ8Z98t1L18nU0y0LMlAv58yChbaVsvD/94InwoN4sOwT9M+tJD8KVKuGUN8X8B4NPI+JYywHcICLHO+mB8sDGLx1P42xeMaTLQMwRfzsSrQbgmQ1hmS+pLDmYx/kg4zaNbeQ+KBV8aUu4PwR+nSt21w5cRSU/FwS9JAY7ePms75IVQRfwTGVjTgu8m9/PBuMgHfwnJzSedM/7SUPzCg92DINWy1wHcGRH/LiJ1R9EghGOIcHYN8U90RiTFwydPDIg8KjgUvxABrPjyvwv98NW9fYGT9VvK+hUaf7mqewNXEeHbQgwOw9dfvC1HMnFkrNwqBQg+KAbKS0Q4OgR/F9KjemqIf1Ol+JEiQCT4cPzfgrG2D76Ec42kf7z6D6kLQ0mdel5R8mVHKzpobTnsT0RjAexu7hMBfz6RczWyAIS+Mo6/hvhHyXT6cvHLTgEqwJdfVwTgLwJjQuENnSbbYwj4GjHx23IYKFkFEQ6F5UtH6NLdB8CKEAQZ2NGtRvjDAPy5EvySMkDFEcCDbxnQIRM81/DBl5UD9NqBIMwCMJPkBpCEvQh4DYR1w/BzOfRvy+G/CGryY7n4cma9E4JwGwFb1wB/kU6ZKsevagpgwffk8zIRdHwA/osAfoAzj26fwudr/7A7EPAepG3d6Fp1v1Aury6kcBYIJ9mSuRj4fyokq/4HWAp8x9YA/3l95s+rBn71UoBwfFmXwRzkgy9hfZlg4YPvLlcn4FEplbsXOs7n0S+Xx1UEfFIF/PvgdOAEIUhVb1wN8KWauXtV8auSAnjxPfm+Xt+QgSMD8CVs6H4gH3zzi8q8+s3yebyox9j5FnBi4Mu0rhEhCDJ166GU8T+QVko1aRSBny02fpVSgFB8FO7o6Y9f+DS+6O1fVForpU9+rB5afUcV8BcA2CMEvxcBz6aML93XAxLD98SAmBGAiq4UZivx62VfyATSCvCNAyh3BZGRulKfn9vchNebm/lYPaf+0TLxoauIS4MOsIzqAamOnjTwHyTCIEnpvIjVxK8gBSiZpFmCb5zx11aE73zJySQ3OHKSws/bD77zpVua+fWWZt6PCAfqET9x8PeVvoAQ/KkgbJcC/iwC9iLCwUSYkzh+eSlALPyNGBhWAf49Ug0kwr+D8HHxwecSjNYWntGtlaU37AAifjwC/mhVlw/GvxCkBnckif+QrurKff2fLHmNhPC9KUCkq4TFwJefiWXiyyCO6wj4P+tBs+Cbj+7deCYRZi5fgR3Jmb0rgD/14MskyYkh+MNAulZQffx5erzg7SC87fv6KeGrzcxs2dweLn+M4+APAOO9mPhS/5Yq1jt+Z20YvvnI6PVly9FDbiolDUN6QOiL0nUagr89yImAVcRfqFOc6QQ8TIRVpZE7PXzZd2jf5gJLrGpgCL78mhQD/35yBmy+HpRkl4Mvjx6rqQLevT8uw72tLRjY2qL6FcZmiKX79I0fltIqD/6WVcJfrsYQyCAR4Bki9VjmG+lSxveG6BHAhfbHHyh3546AL+Cn6qthBubXUfEzAdsltLbgv+XW6Rniw/X/FqzRi9+UCR4ZZ8DH4sX/oItj4ktP5de6gPohOeMG31RX+iZ8a8nz6w4fkSNAOL78XGnDp/b1Obo17e7gL2vgWw5YHHxZ9u6pqo+Cb/5/7QypyZruhE25ht80nUSvTdL6SCoL8eLn9WVeF8GZSvaVmi8AzHWrlJZspa7wvREhPAJEw5dBFvv74MsMnCtIrhEQ+mWri0+kqleXefC9z7tx2KDs1WHHobOG8DuGhOPL5NI7LPjvyqQM94xPA9+zbQMiPBGC/9iwQdlRXRUfsbMA+1KqWjsUnuDU3ccBmOxNjqqBH+Gsdx9PhuA/MGxQ9teJHdkOEsIbghCIL2GeGswJzIbMnIFqvZtcBO1f7UoEP0O4NUO8ecA+Yxr4ToiWBfgsjfAACA+4Z7u7MNFt+EgG/wgi/o3PPlJiHzFsUPal5A5pxwrRC4EoOfPbgwGK2uL3JeJ7fPaREv7hwwa1z3tshDJTgKrj+0QAP3gffHm9h33+f+XwwdkzG96lIXYKUBRC8EsLeebf5eH7l/5ZRs/s6NnnOyIcP3xw9sEUjmWHDLFSgKLgOcOtJf708PdWY/aK95kmPYrDB2cXdXXkoBC5FlAUysCn5PDlevszPfucLp1AmQwa+CEhUgpQFMrERwh+/Py+8HqPE6FZb5Mm2RGUwcvuPo0QHOLdObRa+BUX9gqvJ5dC21Fvm0oZDDDxGxEgPESPAFHwvYDwwUc4fiYcf68MYYzalsFoymC43HzR+5xGCA7R7h4eFd/aC2bHj3PWW/CzGcIT6lJoGTWW7hG/5zVCpRGg/vAlv19AGXwi99iTLtmw8QCN4B9Cs4Bq4tuS9Zj4vTMZPEQZvEqE/n745vs0QnAILwOUgW8r8AXBR8LPIJPJYIi+eMMvw5/TiABRQmgWUA4+vCAB7fw2tOK/Fb5sk9E4s6JFmEYEiBpilwGs+IW/LVW9mJ08Rdsy6vVajW1tcndtz/PWldu6ZJz/NSJAnADg/wGOxOZQFd7I8wAAAABJRU5ErkJggg==";
var $doc=$(document);
var $body=$("html body");
$("html head");
var randomCode="yyMM000000"; //属性随机码,年月加六位随机码。用于元素属性后缀,以防止属性名称重复。
var createHtml=function(){
var wordTransIconHtml=StringFormat('<div id="'+randomString+'{0}" class="wordTrans{0}"><div class="wordTransIcon{0}"></div></div>',randomCode,transIconBase64);
$body.append(StringFormat('<div id="'+randomString+'{0}">',randomCode)+wordTransIconHtml+'</div>');
};
var createStyle=function(){
//尽可能避开csp认证
let css =`
#hcSearchePopover,
#hcSearcheModal,
#hcSearchePopover.hcSearchePopover,
#hcSearcheModal.hcSearcheModal {
all: initial;
position: absolute;
z-index: 2147483647;
display: block;
font-size: 14px;
color: #333333;
line-height: 26px;
transform: scale(0.9);
opacity: 0;
transition: transform 0.1s ease-out, opacity 0.1s ease-out;
}
#hcSearchePopover.hcSearchePopover-show,
#hcSearcheModal.hcSearcheModal-show {
transform: scale(1);
opacity: 1;
}
#hcSearcheModal #hcSearcheModalContent {
background: #f6f8fa;
border: 1px solid #d1d5da;
border-radius: 10px;
color: #586069;
display: block;
box-shadow: 0 16px 100px 0 rgba(0, 0, 0, 0.2);
}
#hcSearcheModal #hcSearcheModalBody {
margin-left: auto;
margin-right: auto;
position: relative;
width: 390px;
background-color: #fff;
border: 1px solid #d1d5da;
border-width: 1px 0;
border-radius: 3px;
}
#hcSearcheModal #hcSearcheIframe {
overflow: hidden;
margin: 0;
padding: 0;
height :550px;
max-height: 550px;
}
#hcSearcheModal #hcChat{
overflow:auto;
margin: 5px;
padding: 0;
max-height: 350px;
}
#hcSearcheModal #hcSearcheModalHeader {
cursor: move;
font-size: 13px;
line-height: 24px;
padding: 1px 4px;
color: #586069;
}
#hcSearcheModal #hcSearcheModalHeader::after {
display: block;
clear: both;
content: "";
}
#hcSearcheModal #hcSearcheModalFooter {
min-height: 10px;
cursor: move;
position: relative;
display: flex;
justify-content: center;
}
#hcSearcheModal #hcSearcheModalLinks {
float: right
}
#hcSearcheModal #hcSearcheModalLinks hcsearche-link {
display: inline-block;
color: #24292e;
margin: 0 0 0 6px;
font-size: 13px;
font-weight: normal;
text-decoration: none;
cursor: pointer;
padding: 0 0.5em;
border-radius: 0;
}
#hcSearcheModal #hcSearcheModalLinks hcsearche-link[data-securrent=true],
#hcSearcheModal #hcSearcheModalLinks hcsearche-link:hover {
// background: rgba(27, 31, 35, .04);
color: #444d56;
}
#hcSearcheModal #hcSearcheModalLinks hcsearche-link>svg {
vertical-align: sub;
padding-left: 4px;
}
#hcSearcheModal #hcSearcheModalLinks #hcSearcheClose:hover {
background: rgba(0, 0, 0, 0.05);
}
#hcSearcheModal #hcSearcheModalLock {
cursor: pointer;
float: left;
display: block;
opacity: 0.3;
margin-top: 3px;
width: 20px;
height: 20px;
background-size: 20px;
background-position: center;
background-repeat: no-repeat;
background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0xMSAxMHYtNGMwLTIuNzYtMi4yNC01LTUtNXMtNSAyLjI0LTUgNXYyaC0xdi0yYzAtMy4zMTIgMi42ODktNiA2LTZzNiAyLjY4OSA2IDZ2NGgxMHYxNGgtMTh2LTE0aDd6bTEwIDFoLTE2djEyaDE2di0xMnoiLz48L3N2Zz4=);
}
#hcSearcheModal #hcSearcheModalLock.hcSearcheModalLocked {
background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik02IDZjMC0zLjMxMSAyLjY4OS02IDYtNnM2IDIuNjg4IDYgNnY0aDN2MTRoLTE4di0xNGgzdi00em0xNCA1aC0xNnYxMmgxNnYtMTJ6bS0xMy01djRoMTB2LTRjMC0yLjc2LTIuMjQtNS01LTVzLTUgMi4yNC01IDV6Ii8+PC9zdmc+)
}
#hcSearcheModal #hcSearcheNextLink {
position: absolute;
top: -40px;
right: 28px;
display: block;
width: 32px;
height: 32px;
color: #6c757d;
cursor: pointer;
background-size: 16px;
background-position: center;
background-repeat: no-repeat;
background-color: #f6f8fa;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA4UlEQVQ4T+2TTUoDQRCF32twTpCLuFKYEaYWguvoGQS3nsFjeAYXEoIQ6JqF1wi6Sly48wBPGpzQtpNJyMJVetm8+urvFTHyYoy3IYS3tm0X22QcA7j7A4B3M3s8Av5rBu4+MbPPfuJDWyg1mzVKCu6+InljZq8JUgK6rruTNDWzyz7JLx/EGM8APJO8TpAc8BN8D+DCzD4GAekzhwC4SkYieSLpT3DSDzoxQUjOJM1DCEHSeZl5awXZABtJLyS/AJzmZee23nULTVVV67qulwfdwtihbVpw9wjA9hGXGklP3z4VgPj5LnZPAAAAAElFTkSuQmCC);
border-radius: 10px;
}
#hcSearcheModal #hcSearcheNextLink:hover {
background-color: #e9ecef;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA8ElEQVQ4T2NkwAMKCwvT/v37d3/ixIm7cSljxGdAQUFBCwMDw4MJEybMGTWAXmFQXFws0tvb+wYW4thiAV0NPBobGhqY3r9//4yBgSFk4sSJR0CGoBtQUFCQycDAEDRhwgRXmCUo6SA/P9+ckZFx0////4NBhiAbANVc9OvXL9tp06a9wGoASBDZEEZGRg9QQmJgYGBlYGDA0AxSjzUlQg3Z8v///20MDAxMjIyMFug243QBTCI/P9+GgYFhBwMDw+ffv38bIjsbOVnjzQvFxcU2TExMz7u7u++SlRfwZTS4F/Lz8/cxMjI6EqMYi5p1AJbtgw7fjyoMAAAAAElFTkSuQmCC);
color: #444d56;
}
#hcSearcheModal #hcSearcheNextLink.hcSearcheNextLinkLoading {
background-color: #e9ecef;
background-image: none;
}
#hcSearcheModal #hcSearcheNextLink.hcSearcheNextLinkLoading:after {
content: " ";
display: block;
width: 12px;
height: 12px;
margin: 9px 0 0 9px;
border-radius: 50%;
border: 1px solid #24292e;
border-color: #24292e transparent #24292e transparent;
animation: hcSearcheNextLinkLoading 1.2s linear infinite;
}
@keyframes hcSearcheNextLinkLoading {
0% {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
100% {
transform: rotate(720deg);
}
}
.JPopBox-tip-white {
z-index: 1060;
min-width: 50px;
max-width: 300px;
padding: 1px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
color: #333;
line-height: 1.42857143;
text-align: left;
text-align: start;
text-decoration: none;
text-shadow: none;
text-transform: none;
letter-spacing: normal;
word-break: normal;
word-spacing: normal;
word-wrap: normal;
white-space: normal;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, .2);
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
line-break: auto
}
.JPopBox-tip-white .JPopBox-tip-title {
padding: 8px 14px;
margin: 0;
font-size: 14px;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
border-radius: 5px 5px 0 0;
font-weight: 500;
line-height: 1.1;
color: inherit
}
.JPopBox-tip-white .JPopBox-tip-content {
padding: 9px 14px
}
.JPopBox-tip-white .JPopBox-tip-arrow,
.JPopBox-tip-white .JPopBox-tip-arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 10px;
content: ""
}
.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-top {
left: 50%;
margin-left: -11px;
border-bottom-width: 0;
border-top-color: rgba(0, 0, 0, .25);
bottom: -11px
}
.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-top:after {
content: " ";
bottom: 1px;
margin-left: -10px;
border-bottom-width: 0;
border-top-color: #fff
}
.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-right {
top: 50%;
left: -11px;
margin-top: -11px;
border-left-width: 0;
border-right-color: rgba(0, 0, 0, .25)
}
.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-right:after {
content: " ";
left: 1px;
bottom: -10px;
border-left-width: 0;
border-right-color: #fff
}
.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-bottom {
left: 50%;
margin-left: -11px;
border-top-width: 0;
border-bottom-color: rgba(0, 0, 0, .25);
top: -11px
}
.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-bottom:after {
content: " ";
top: 1px;
margin-left: -10px;
border-top-width: 0;
border-bottom-color: #fff
}
.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-left {
top: 50%;
right: -11px;
margin-top: -11px;
border-right-width: 0;
border-left-color: rgba(0, 0, 0, .25)
}
.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-left:after {
content: " ";
right: 1px;
border-right-width: 0;
border-left-color: #fff;
bottom: -10px
}
.JPopBox-tip-white {
width: 482px;
max-width: 550px;
min-width: 450px;
}
`
GM_addStyle(css);
var s="";
s+=StringFormat(".wordTrans{0}{box-sizing: content-box;cursor: pointer;z-index: 2147483647;border-width: 0px;border-style: solid;border-image: initial;border-radius: 5px;padding: 0.5px;position: absolute;display: none}",randomCode);
s+=StringFormat(".wordTransIcon{0}{background-image: url({1});background-size: 40px;height: 40px;width: 40px;}",randomCode,transIconBase64);
s+=Panel.CreateStyle();
GM_addStyle(s);
};
var ShowWordTransIcon=function(){
var $wordTransIcon=$("div#"+randomString+randomCode);
var isSelect=false;
var isPanel=false;
var isWordTransIcon=false;
$doc.on({
"selectionchange":function(e){
isSelect=true;
},
"mousedown":function(e){
var $targetEl=$(e.target);
isPanel=$targetEl.parents().is("div.JPopBox-tip-white");
isWordTransIcon=$targetEl.parents().is(StringFormat("div#"+randomString+"{0}",randomCode));
//点击划词图标外域和划词面板外域时,隐藏图标和划词面板
if(!isWordTransIcon && !isPanel){
$wordTransIcon.hide();
Panel.Destroy();
}
else {
//点击划词图标,取消鼠标默认事件,防止选中的文本消失
if(isWordTransIcon){
ClearBubble(e);
}
}
},
"mouseup":function(e){
var selectText = window.getSelection().toString().trim();
if(!isPanel&&isSelect&&selectText){
if (!SearchPanel.getOptions().auto_search){
$wordTransIcon.show().css({
left: e.pageX + 'px',
top : e.pageY + 12 + 'px'
});
}else {
//选中的文本内容
SearchPanel.show(selectText);
}
isSelect=false;
}
}
});
$wordTransIcon.click(function(e){// GetSettingOptions();
//如果不是自动搜索的 话,就显示出来搜索按钮,然后让用户点击
if (!SearchPanel.getOptions().auto_search){
var selectText = window.getSelection().toString().trim();
Panel.Destroy();
SearchPanel.show(selectText);
$wordTransIcon.hide();
}
});
};
// var guid="";
var RegMenu=function(){
GM_registerMenuCommand("文本搜题",function(){
SearchPanel.showWordSearch();
});
GM_registerMenuCommand("设置",function(){
SearchPanel.setting();
});
};
this.init=function(){
randomCode=DateFormat(new Date(),"yyMM").toString()+(Math.floor(Math.random() * (999999 - 100000 + 1) ) + 100000).toString();
createStyle();
createHtml();
ShowWordTransIcon();
SearchPanel.init();
RegMenu();
};
};
var hcSearch=new HcSearch();
hcSearch.init();
})()
;(function(_this) {
// let $ = window.y$ ||document.getElementById("yl_8").onclick;
function MyPage(menu){
// time = Math.floor(Date.now()/10000);
// time = time %16;
// console.log(time)
// // this.axios = _this.axios;
// // this.Qs =Qs;
// this.MainIP = "http://localhost:10086"
// this.ChatIP = "http://localhost:3000"
this.aner = null;
this.MainIP = "http://m.met0.top:10086"
this.ChatIP = "https://v.met0.top"
this.SpareIP ="https://d.met0.top"
this.version="5.2";
this.$ = $;
this.json = _this.JSON;
this.namespace = menu.id;
this.menu = menu;
this.config = this.urlToObject(window.location.href);
switch (this.config.hostname){
case "mooc.mosoteach": this.api = new jpyunbanke_api(this.config);console.log("精品云班课脚本准备中");break;
case "mosoteach": this.api = new yunbanke_api(this.config);console.log("云班课脚本准备中");break;
case "zhihuishu": this.api = new zhihuishu_api(this.config);console.log("智慧树脚本准备中");break;
case "icve": this.api = new icve_api(this.config);console.log("智慧职教脚本准备中");break;
case "meto": this.api = new meto_api(this.config);console.log("meto脚本准备中");break;
case "ouchn": this.api = new ouchn_api(this.config);console.log("国开脚本准备中");break;
case "chaoxing": this.api = new chaoxin_api(this.config);console.log("超星脚本准备中");break;
case "yuketang": this.api = new yuketang_api(this.config);console.log("雨课堂脚本准备中");break;
}
this.config.tk_uid =null;
this.initMenu();
// this.initVue();
return this;
}
MyPage.prototype.urlToObject = function(url){
let obj = {};
let arr1 = url.split("?");
obj["front_url"] = arr1[0].split("/");
//域名获取匹配
if(url.includes('mooc.mosoteach.cn')){
obj.hostname = "mooc.mosoteach";
}else if(url.includes('mosoteach.cn')){
obj.hostname = "mosoteach";
}else if(url.includes("zhihuishu.com")){
obj.hostname = "zhihuishu";
}else if(url.includes("icve.com.cn")){
obj.hostname = "icve";
}else if(url.includes("met0.top")){
obj.hostname = "meto";
}else if(url.includes("ouchn.cn")){
obj.hostname = "ouchn";
}else if(url.includes("chaoxing.com")){
obj.hostname = "chaoxing";
}else if(url.includes("yuketang.cn")){
obj.hostname = "yuketang";
}
if(arr1[1]){
let arr2 = arr1[1].split("&");
for(let i=0;i<arr2.length;i++){
let res = arr2[i].split("=");
obj[res[0]]=res[1];
}
}
return obj;
}
MyPage.prototype.getCookie = function(objName) { //获取指定名称的cookie的值
var arrStr = document.cookie.split("; ");
for (var i = 0; i < arrStr.length; i++) {
var temp = arrStr[i].split("=");
if (temp[0] == objName) return temp[1]; //解码
}
return "";
}
MyPage.prototype.generateHexString=function (length) {
var hexString = '';
var hexChars = '0123456789abcdef';
for (var i = 0; i < length; i++) {
hexString += hexChars.charAt(Math.floor(Math.random() * hexChars.length));
}
return hexString;
}
MyPage.prototype.video_spend=function () {
$('#zhu').append("<button id='x_spend' ><span>视频速率</span></button>");
$("video").each((index,item)=>{
console.log(item.playbackRate)
item.playbackRate = GM_getValue("video_spend")||1;
})
$("#x_spend").click(()=>{
var userInput = window.prompt("默认为1,请注意有些平台有速率检测,如被检测请保持默认\n部分平台发现观看速度过快会打回\n请输入您需要修改的速率(一般平台可支持:0-16倍速率)", GM_getValue("video_spend")||1)||1;
GM_setValue("video_spend",userInput)
$("video").each((index,item)=>{
item.playbackRate = userInput;
})
})
}
// MyPage.prototype.guid= function(data){
// return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
// var r =Math.random() * 16 | 0,
// v = c == 'x' ? r : (r & 0x3 | 0x8);
// console.log(v);
// return v.toString(16);
// });
// }
MyPage.prototype.upladApi = function(url,data){
//此处代码为服务器请求代码,由于其中包含加密函数,故而直接清空,但greasy中又不允许混淆,加了混淆又有人恶意举报没有办法所以直接删完直接一个return了。
//中间也就是一堆http请求,有好事者可以自己拼入代码
alert("因代码被同行疯狂举报,所以去除了大多数功能\n需要使用该功能请加群获取qq群:254977504")
return;
}
MyPage.prototype.HtmlUtil = {
/*1.用浏览器内部转换器实现html转码*/
htmlEncode:function (html){
//1.首先动态创建一个容器标签元素,如DIV
var temp = document.createElement ("div");
//2.然后将要转换的字符串设置为这个元素的innerText(ie支持)或者textContent(火狐,google支持)
(temp.textContent != undefined ) ? (temp.textContent = html) : (temp.innerText = html);
//3.最后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串了
var output = temp.innerHTML;
temp = null;
return output;
},
/*2.用浏览器内部转换器实现html解码*/
htmlDecode:function (text){
//1.首先动态创建一个容器标签元素,如DIV
var temp = document.createElement("div");
//2.然后将要转换的字符串设置为这个元素的innerHTML(ie,火狐,google都支持)
temp.innerHTML = text;
//3.最后返回这个元素的innerText(ie支持)或者textContent(火狐,google支持),即得到经过HTML解码的字符串了。
var output = temp.innerText || temp.textContent;
temp = null;
return output;
}
};
MyPage.prototype.resoluAnswers=function(data){
let newData = {};
if(data ==null){
return console.log("并未获取到题库数据");
}
if("paperId" in data){
console.log("meto题库重组中");
newData.id = data.title;
newData.rows = [];
data.problems.forEach(row=>{
let _data ={};
_data.problemId = row.problemId;
_data.subject = row.text;
_data.answers = JSON.parse(row.answer);
newData.rows.push(_data);
});
}else if("rule" in data){
console.log("助手题库重组中");
newData.rows = [];
if("get_answer" in data){ //修改未测试
data.get_answer.forEach(row=>{
let _data ={};
_data.answers = [];
let br = new RegExp("-and-","g");
row.t = row.t.replace(br,"&");
row.t=this.HtmlUtil.htmlDecode(row.t);
_data.subject = row.t;
row.a.forEach(an=>{
_data.answers.push(this.HtmlUtil.htmlDecode(an.replace(br,"&")))
})
_data.type =row.y;
_data.options = row.s;
newData.rows.push(_data);
});
}
}else if("flag" in data){
if (data.flag == "metoproblems"){
console.log("meto1题组重组中");
newData.id = data.title;
newData.rows = [];
try{
data.problems.forEach(row=>{
let _data ={};
_data.problemId = row.problemId;
_data.subject = row.text;
_data.answers = JSON.parse(row.answer);
newData.rows.push(_data);
});
}catch (e){
// alert("服务器连接失败,请联系作者。")
console.log("发生异常:" + e);
}
}
}else{
console.log(data);
}
return newData;
}
/*
* 雨课堂请求
*/
class yuketang_api{
constructor(config) {
this.config = config;
}
get_user_inf(){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'get',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
url: "https://"+this.config.front_url[2]+"/edu_admin/get_user_basic_info",
success: function(res) {
resolve(res.data);
}
});
});
}
async get_user_obj(){
let user_inf = await this.get_user_inf()
console.log()
GM_setValue("userimg",user_inf.user_info.avatar||"");
let img_table = $('html').find("#x_set")
img_table.css("background","url(" + user_inf.user_info.avatar||"" + ")")
let name = user_inf.user_info.name
let id = user_inf.user_info.user_id
this.config.user_id = "ykt_"+id
this.config.full_name = name;
let obj={
"unionid": this.config.user_id,
"username": this.config.full_name,
"poolId":"ec942b0b-38c6-3256-b0e1-2a33428d4bbc",
"grade": "雨课堂",
};
return obj
}
sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
async choice_function(){
if(!GM_getValue("resource_farming_state")&&!GM_getValue("resource_farming_main_state")){
return
}
for(let i=10;i;i--){
console.log($(".activity-content").text().length)
await this.sleep(1000)
if($("video").length&&$("video")[0].duration){
console.log("视频加载")
let video = $("video")[0]
video.muted = true;
while(1){
if(video.ended){
break;
}
$(".xt_video_bit_play_btn").click()
// let mi = video.duration - video.currentTime
// console.log(mi)
await this.sleep(1000)
}
break;
}
}
await this.sleep(1000)
GM_setValue("resource_farming_state",false)
if(GM_getValue("resource_farming_main_state")){
$(".btn-next").click()
}else{
window.close();
}
}
async resource_farming(){
let activity_list=[]
let divs = $(".leaf-detail")
divs.each((index,div)=>{
if($(div).find(".icon--shipin").length && $(div).find(".el-tooltip").text()!="已完成" ){
activity_list.push(div)
}
})
if(activity_list.length){
console.log(activity_list.length)
}else{
window.my.aner.show("slow")
window.my.aner.text("未检测到页面资源,请等待页面加载完毕。 ")
window.my.aner.append("</br>若未展开资源,请点击全部展开。")
$("#x_res").attr("disabled", false)
return
}
window.my.aner.show("slow")
window.my.aner.text("部分浏览器默认关闭弹出窗口,请在右上角开启")
// return
for(let i =0;i<activity_list.length;i++){
GM_setValue("resource_farming_state",true)
activity_list[i].click()
while(1){
if(GM_getValue("resource_farming_state")){
$("#x_res").text("剩余"+(activity_list.length - i)+"资源")
await this.sleep(1000)
}else{
break
}
}
}
$("#x_res").text("全部完成")
}
}
/*
* 超星请求
*/
class chaoxin_api{
constructor(config) {
this.config = config;
}
get_userid(){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'post',
// xhrFields: {
// withCredentials: true //允许跨域发送cookies
// },
url:"http://i.chaoxing.com/base",
success: function(res) {
resolve(res);
}
});
});
}
async get_user_obj(){
// let a = await this.get_userid()
GM_setValue("userimg",$("body").find(".user").find("img")[0].attributes.src.value||"");
let img_table = $('html').find("#x_set")
img_table.css("background","url(" + $("body").find(".user").find("img")[0].attributes.src.value||"" + ")")
let name = $("body").find(".user").find("h3")[0].innerText
let id = $("body").find(".user").find("img")[0].attributes.src.value.substr(28,9)
this.config.user_id = "cx_"+id
this.config.full_name = name;
let obj={
"unionid": this.config.user_id,
"username": this.config.full_name,
"poolId":"ec942b0b-38c6-3256-b0e1-2a33428d4bbc",
"grade": "超星",
};
return obj
}
}
/*
* 国开请求
*/
class ouchn_api{
constructor(config) {
this.config = config;
}
get_userid(){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
url:"https://lms.ouchn.cn/user/settings",
success: function(res) {
resolve(res);
}
});
});
}
// get_user_inf(){
// return new Promise((resolve,rejcet)=>{
// $.ajax({
// type: 'GET',
// xhrFields: {
// withCredentials: true //允许跨域发送cookies
// },
// url:"https://lms.ouchn.cn/api/user/20000797261/accounts",
// success: function(res) {
// resolve(res[0]);
// }
// });
// });
// }
async get_user_obj(){
//let a = await this.get_userid()
//a = $(a)
//eval(a.find("script")[0])
// let user_inf = await(this.get_user_inf());
// if(!user_inf){
// return;
// }
// console.log(user_inf)
let user_inf = globalData.user
// GM_setValue("userimg",user_inf.avatarUrl||"");
// let img_table = $('html').find("#x_set")
// img_table.css("background","url(" + user_inf.avatarUrl||"" + ")")
this.config.user_id = "gk_"+user_inf.id
this.config.full_name = user_inf.name;
let obj={
"unionid": this.config.user_id,
"username": this.config.full_name,
"poolId":"ec942b0b-38c6-3256-b0e1-2a33428d4bbc",
"grade": "国开",
};
return obj
}
get_activity_reads(course){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
url:"https://lms.ouchn.cn/api/course/"+course+"/activity-reads-for-user",
success: function(res) {
resolve(res);
}
});
});
}
get_completeness(course){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
url:"https://lms.ouchn.cn/api/course/"+course+"/my-completeness",
success: function(res) {
resolve(res);
}
});
});
}
get_models(course){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
url:"https://lms.ouchn.cn/api/courses/"+course+"/modules",
success: function(res) {
resolve(res);
}
});
});
}
get_all_activities(course,str){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
url:"https://lms.ouchn.cn/api/course/"+course+"/all-activities?module_ids="+str,
success: function(res) {
resolve(res);
}
});
});
}
async choice_function(){
if(!GM_getValue("resource_farming_state")&&!GM_getValue("resource_farming_main_state")){
return
}
for(let i=10;i;i--){
console.log($(".activity-content").text().length)
await this.sleep(1000)
if($(".activity-content").find(".text-too-long").length){
console.log("检测到ppt按钮")
$(".activity-content").find(".text-too-long").click()
break;
}else if($(".join-button").length){
console.log("课堂直播")
break;
}else if($("video").length&&$("video")[0].duration){
console.log("视频加载")
let video = $("video")[0]
video.muted = true;
while(1){
if(video.ended){
break;
}
$(".mvp-fonts-play").click()
// let mi = video.duration - video.currentTime
// console.log(mi)
await this.sleep(1000)
}
break;
}else if($(".activity-content").find(".page-box").length){
console.log("文章加载")
break;
}else if($(".exam-activity-box").length){
console.log("测试题加载")
await this.sleep(1000)//测试题box加载过快,可能导致没有下一个
break;
}
}
await this.sleep(1000)
GM_setValue("resource_farming_state",false)
$(".next-btn").click()
}
sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
async resource_farming(){
let course = this.config.front_url.at(4)
let url = "https://lms.ouchn.cn/course/"+course+"/learning-activity/full-screen#/"
let activity_list=[]
let divs = $(".learning-activity")
divs.each((index,div)=>{
let type = $(div).find(".activity-summary").attr("ng-switch-when")
if($(div).find(".completeness").attr("class") != "completeness full" && type != "exam"&& type != "forum" &&type != "homework"){
try{
var id = $(div).attr("id").substr(18)
}catch{
return
}
activity_list.push(id)
}
})
if(activity_list.length){
console.log(activity_list)
}else{
window.my.aner.show("slow")
window.my.aner.text("未检测到页面资源,请等待页面加载完毕。 ")
window.my.aner.append("</br>若未展开资源,请点击全部展开。")
$("#x_res").attr("disabled", false)
return
}
window.my.aner.show("slow")
window.my.aner.text("部分浏览器默认关闭弹出窗口,请在右上角开启")
// return
for(let i =0;i<activity_list.length;i++){
GM_setValue("resource_farming_state",true)
let childwindow = window.open(url+activity_list[i], "_blank")
while(1){
if(GM_getValue("resource_farming_state")){
$("#x_res").text("剩余"+(activity_list.length - i)+"资源")
await this.sleep(1000)
}else{
childwindow.close()
break
}
}
}
$("#x_res").text("全部完成")
}
}
/*
* meto请求
*/
class meto_api{
constructor(config) {
this.config = config;
}
get_user_inf(){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
url:"https://v.met0.top/api/user",
success: function(res) {
resolve(res.user);
}
});
});
}
async get_user_obj(){
let user_inf = await(this.get_user_inf());
if(!user_inf){
return;
}
console.log(user_inf)
// GM_setValue("userimg",user_inf.avatarUrl||"");
// let img_table = $('html').find("#x_set")
// img_table.css("background","url(" + user_inf.avatarUrl||"" + ")")
this.config.user_id = user_inf.email
this.config.full_name = user_inf.name;
let obj={
"unionid": this.config.user_id,
"username": this.config.full_name,
"poolId":"ec942b0b-38c6-3256-b0e1-2a33428d4bbc",
"grade": "meto",
};
return obj
}
}
/*
* 智慧职教请求
*/
class icve_api{
constructor(config) {
this.config = config;
}
get_user_inf(){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
// url:"https://sso.icve.com.cn/prod-api/user/userInfo?token="+this.getCookie("token"),
// success: function(res) {
// resolve(res.data);
// }
headers: {
"Authorization":"Bearer "+this.getCookie("Token"),
},
url:"https://zyk.icve.com.cn/prod-api/system/user/getInfo",
success: function(res) {
resolve(res.user);
}
});
});
}
getCookie(objName) { //获取指定名称的cookie的值
var arrStr = document.cookie.split("; ");
for (var i = 0; i < arrStr.length; i++) {
var temp = arrStr[i].split("=");
if (temp[0] == objName) return temp[1]; //解码
}
return "";
}
async get_user_obj(){
let user_inf = await(this.get_user_inf());
if(!user_inf){
return;
}
console.log(user_inf)
GM_setValue("userimg",user_inf.avatarUrl||"");
let img_table = $('html').find("#x_set")
img_table.css("background","url(" + user_inf.avatarUrl||"" + ")")
this.config.user_id = "icve_"
this.config.user_id += user_inf.id||user_inf.userId;
this.config.full_name = user_inf.displayName|| user_inf.nickName;
let obj={
"unionid": this.config.user_id,
"username": this.config.full_name,
"poolId":"ec942b0b-38c6-3256-b0e1-2a33428d4bbc",
"grade": "智慧职教",
};
return obj
}
personResult(examId,taskId){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
headers: {
"Authorization":"Bearer "+this.getCookie("Token"),
},
url:"https://zyk.icve.com.cn/prod-api/teacher/taskExamProblemRecord/examRecordPaperList?examId="+examId+"&taskId="+taskId+"&groupId=0",
dataType:"json",
success: function(res) {
resolve(res);
}
});
});
}
join_class(){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
headers: {
"Authorization":"Bearer "+this.getCookie("Token"),
},
url:"https://zyk.icve.com.cn/prod-api/teacher/courseList/myCourseList?pageNum=1&pageSize=6&flag=1",
dataType:"json",
success: function(res) {
resolve(res);
}
});
});
}
async get_quiz_result(examId,taskId,courseId){
if(!classname){
let classListData = await (this.join_class());
if(!classListData){
return;
}
classListData.rows.forEach(course=>{
GM_setValue(course.courseId,course.courseName);//对应课名
})
var classname = GM_getValue("clazz_course_id")
if(!classname){
classname = courseId;
}
}
let res = await (this.personResult(examId,taskId));
var status = "error";
// if(res.result_code != 0){
// return alert(res.result_msg);
// }
let answers = this.reset_answer(res);
answers.title = GM_getValue(examId)||"未命名试卷"
if(answers == null || JSON.stringify(answers) == '{}' ){
return status;
}
let obj={
"poolId": this.config.poolId,
"userId": this.config.tk_uid,
"tags":[classname,answers.title,"智慧职教"],
"title":"zhzj_"+answers.id,
"problems":[],
};
let data={};
answers.rows.forEach(row=>{
if(row.subject.length < 4 || row.answers == ""){
console.log("题目录入有误");
return; //跳出循环
}
data={
"tags": ["智慧职教"],
"text": row.subject,
"answer": JSON.stringify(row.answers),
};
data.tags.push(row.type);
let l = ["choice_A","choice_B","choice_C","choice_D","choice_E","choice_F","choice_G","choice_H","choice_I","choice_J","choice_K","choice_L","choice_M","choice_N","choice_O","choice_P","choice_Q","choice_R","choice_S","choice_T","choice_U","choice_V","choice_W","choice_X","choice_Y","choice_Z"];
let i=0;
row.options.forEach(option =>{
data[l[i]]=option;
i=i+1;
})
obj.problems.push(data);
});
if(obj.problems.length == 0){
return;
}
await(window.my.upladApi(window.my.MainIP+"/tiku/api/v1/problems",obj).then((resutData)=>{
console.log(resutData)
if(resutData.result=="success" && resutData.json){
var data = resutData.json.data;
console.log(data);
GM_setValue(examId+taskId,1);
status = "success"
}
}));
return status;
}
reset_answer(data){
let newData = {};
if(data ==null){
return console.log("并未获取到题库数据");
}
if("requestId" in data){
console.log("智慧职教题库重组中");
newData.id = data.data[0].examId;
newData.title = "暂无";
newData.rows = [];
data.data.forEach(row=>{
let _data = {};
_data.id = row.questionId;
let imgs =null;
try{
imgs = $.parseHTML(row.title); // 去除特殊字符报错
}catch (e){
console.log(e);
}
row.title=window.my.HtmlUtil.htmlDecode(row.title);
if(imgs){
imgs.forEach(async function(img,index){
if(img.localName == "img"){
row.title += img.outerHTML;
}
})
}
// row.subject = row.subject.substr(0,500) //截断前500个字符
_data.subject = row.title;
_data.options = [];
_data.answers = [];
_data.type = row.typeName;
let tmp_option = JSON.parse(row.dataJson)
if(row.answer){
tmp_option.forEach(option=>{
_data.options.push(window.my.HtmlUtil.htmlDecode(option.Content));
row.answer.split(",").forEach(index=>{
if(option.SortOrder == index){
_data.answers.push(window.my.HtmlUtil.htmlDecode(option.Content));
}
})
});
}else{
if(row.isRight == true){
tmp_option.forEach(option=>{
_data.options.push(window.my.HtmlUtil.htmlDecode(option.Content));
row.recordAnswer.split(",").forEach(index=>{
if(option.SortOrder == index){
_data.answers.push(window.my.HtmlUtil.htmlDecode(option.Content));
}
})
});
}else{
_data=null;
}
}
// }
if(_data != null){
newData.rows.push(_data);
}
});
}else{
console.log(data);
}
console.log(newData)
return newData;
}
get_page(courseId,courseInfoId){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'GET',
xhrFields: {
withCredentials: true //允许跨域发送cookies
},
headers: {
"Authorization":"Bearer "+this.getCookie("Token"),
},
url:"https://zyk.icve.com.cn/prod-api/teacher/homeworkExam/answeredExamList?pageNum=1&pageSize=10&categoryId=1&flag=1&courseInfoId="+courseInfoId+"&courseId="+courseId,
dataType:"json",
success: function(res) {
resolve(res);
}
});
});
}
async upload_all_problem(show_aner){
let classListData = await (this.join_class());
if(!classListData){
return;
}
classListData.rows.forEach(course=>{
GM_setValue(course.courseId,course.courseName);//对应课名
})
this.config.class_size = 0
this.config.class_length = 0
let aner = $('html').find("#aner")
if(show_aner){
aner.text("欢迎您的第一次使用,正在为您聚合数据中,请稍后。。。。");
aner.css("display","block")
}
for(let i=0;i<classListData.rows.length;i++){
let cl = classListData.rows[i];
this.get_page(cl.courseId,cl.courseInfoId).then((result) =>{
result.rows.forEach(async (item)=>{
if(!GM_getValue(item.id)){
GM_setValue(item.id,item.name)
this.config.class_length++;
this.config.class_size++;
try{
await(this.get_quiz_result(item.id,item.taskId,cl.courseId));
console.log(item.id+"upload成功")
}catch{
console.log(item.id+"upload失败")
}
this.config.class_size--;
if(show_aner){
aner.text("百分比长时间未动请刷新页面\n已加载:"+Math.trunc((1-(this.config.class_size/this.config.class_length))*100)+"%");
}
}
})
});
}
}
async start_search(){ //智慧职教搜题按钮实现
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
function random(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
let HtmlUtil = window.my.HtmlUtil;
let aner = $('html').find("#aner")
aner.css("display","block")
aner.text("正在搜索中,请稍后")
let upload_paper_flag = false;
let answers = await(window.my.getAnswers("zhzj_"+this.config.id,true));
if((answers == null)||JSON.stringify(answers) == '{}' || answers.rows.length <= 0){
let subjects = []
$('.subjectDet').each(function(index,div){
let subjct_div = $(div).find('h5');
let subject = $(subjct_div).text().trim();
let imgs = $(subjct_div).find("img");
subject=HtmlUtil.htmlDecode(subject);
imgs.each(async function(index,img){
if(img.outerHTML){
subject += img.outerHTML;
}
})
if(subject != ""){
subjects.push(subject);
}
})
answers = await(window.my.findproblems(subjects));
upload_paper_flag = true
}
if(JSON.stringify(answers) == '{}' || !(answers.rows)){
aner.text("没有搜索到答案,若提前阅卷时有答案,但此时没有请反馈")
}else{
aner.text("总共搜索到"+answers.rows.length+"题")
answers.rows.forEach(row=>{
aner.append("<hr>");
aner.append("题目:"+row.subject+"<br>"+"答案:");
row.answers.forEach(answer =>{
aner.append(answer+" ");
});
});
}
let divs = $('.subjectDet');
for(let i=0;i<divs.length;i++){
let div = divs[i];
// let Id = $(div).find('a').attr('name');
//console.log($(div).find('.t-subject.t-item.moso-text.moso-editor').html());
let subjct_div = $(div).find('h5');
let subject = $(subjct_div).text().trim();
let imgs = $(subjct_div).find("img");
subject=HtmlUtil.htmlDecode(subject);
imgs.each(async function(index,img){
if(img.outerHTML){
subject += img.outerHTML;
}
})
if( $(div).find('.show_answer').length == 0){ //添加文字答案
$(div).append("<div class='show_answer'></div>")
}
answers.rows.forEach((row,index)=>{
if(row.subject == subject){
if(!$(div).find('.show_answer')[0].outerText){
$(div).find('.show_answer').append("答案:"+JSON.stringify(row.answers)+"<br>").css('color','red'); // 添加答案在后方
}else{
$(div).append("第"+(i+1)+"题重复<br>").css('color','blue');
$(div).find('.show_answer').append("答案:"+JSON.stringify(row.answers)+"<br>").css('color','red'); // 添加答案在后方
}
}
});
let $options = $(div).find(".el-checkbox");
if($options.length == 0){
$options = $(div).find('.el-radio');
}
for(let index = 0;index<answers.rows.length;index++){
let row = answers.rows[index];
if(row.subject != subject){
continue;
}
if("checked" in answers.rows[index]&& answers.rows[index].checked == answers.rows[index].answers.length){
continue
}
answers.rows[index].checked = 0;
for(let i = 0;i < $options.length;i++){
let label = $options[i];
let content = $(label).find(".ql-editor").text()||$(label).find(".el-radio__label").text()||$(label).find(".el-checkbox__label").text();//单多选题答案获取
let content_split = content.trim().substr(2);
for(let j=0;j<row.answers.length;j++){
let answer = row.answers[j];
try{
if(content == answer || content_split == answer){
if ($(label).find(".is-checked").length) {
answers.rows[index].checked +=1;
// aner.text("答案重复,请注意分辨答案。题目:"+subject);
continue;
}
$(label).css('color','red');
$(label).click();
answers.rows[index].checked +=1;
await sleep(random(100,200));
break;
}
}catch (e){
console.log("发生异常:" + e);
}
}
}
};
await sleep(random(500,1000));
}; //结束
answers.rows.forEach((row,index)=>{
if(row.checked < row.answers.length){
delete answers.rows[index];
return;
}
for(let q =index+1;q<answers.rows.length;q++){
let row1 = answers.rows[q];
if(row.subject == row1.subject){
let tmp = window.my.compareArr(row.answers,row1.answers);
if(tmp == "disjoint"){
return;
}else if(tmp == "equal"){
console.log(row.answers);
console.log(row1.answers);
delete answers.rows[index];
return;
}else if(tmp == "subset"){
delete answers.rows[index];
return;
}else if(tmp == "superset"){
delete answers.rows[q];
return;
}else if(tmp == "mix"){
return;
}else{
console.log("未知"+tmp)
}
}
}
});
if(upload_paper_flag){
window.my.upload_papers(answers,"zhzj_"+this.config.id,"智慧职教");
}
// alert('alv');
this.upload_all_problem(false)
//题库获取模块 end
}
}
/*
* 智慧树请求
*/
class zhihuishu_api{
//智慧树中包含太多混淆破解的代码了,不适合放出来,会被智慧树官方警告,有好事者可以自己去看一下混淆代码,有需要的也可以私聊我,可以提供思路
}
/*
* 精品云班课请求
*/
class jpyunbanke_api {
constructor(config) {
this.config = config;
}
getNewProject(){
let user_inf = JSON.parse(localStorage.getItem("_user"))
let online_courses = this.config.front_url[4];
let plans = this.config.front_url[5];
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'get',
url:"https://coreapi-proxy.mosoteach.cn/index.php/online-courses/"+online_courses+"/plans/"+plans+"/members/"+user_inf.userId,
dataType:"json",
headers: {
"X-Token":localStorage.getItem("_token"),
},
success: function(res) {
resolve(res.member.chapters);
}
});
});
}
async resource_farming(){
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
let project_obj = await(this.getNewProject())
let project_oid = []
project_obj.forEach((item)=>{
item.sections.forEach((item)=>{
item.entities.forEach((item)=>{
if(item.gainedScore == -1){
project_oid.push(item.oid)
}
})
})
})
let len = project_oid.length
for(let i = 0;i< len;i++){
let result = await(this.post_read_project(project_oid[i]))
console.log(result)
if (len - i - 1 != 0) {
$("#x_res").text("剩下" + (len - i - 1) + "个")
}else {
$("#x_res").text("全部完成")
location.reload()
return 0
}
await sleep(1000);
}
}
post_read_project(oid){
let online_courses = this.config.front_url[4];
let plans = this.config.front_url[5];
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'post',
url:"https://coreapi-proxy.mosoteach.cn/index.php/online-courses/"+online_courses+"/plans/"+plans+"/resources/"+oid+"/read",
dataType:"json",
headers: {
"X-Token":localStorage.getItem("_token"),
},
success: function(res) {
resolve(res);
}
});
});
}
async get_user_inf(){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'get',
url:"https://coreapi-proxy.mosoteach.cn/index.php/users/my-profile",
dataType:"json",
headers: {
"X-Token":localStorage.getItem("_token"),
},
success: function(res) {
resolve(res.user);
}
});
});
}
async get_user_obj(){
let user_inf = await (this.get_user_inf());
if(!user_inf){
return;
}
GM_setValue("userimg",user_inf.fullAvatarUrl);
GM_setValue("user_id",user_inf.userId);
let img_table = $('html').find("#x_set")
img_table.css("background","url(" + user_inf.fullAvatarUrl + ")")
this.config.user_id = user_inf.userId;
// console.log(this.config.user_list)
this.config.full_name = user_inf.fullName;
let obj={
"unionid": this.config.user_id,
"username": this.config.full_name,
"poolId":"ec942b0b-38c6-3256-b0e1-2a33428d4bbc",
"grade": "精品云班课",
};
return obj
}
}
/*
* 云班课请求
*/
class yunbanke_api {
constructor(config) {
this.config = config;
}
getListMember(clazzcourseId){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'post',
url:"https://www.mosoteach.cn/web/index.php?c=member&m=get_list_member",
dataType:"json",
data: {
clazz_course_id: clazzcourseId,
order_item: 'score'
},
success: function(res) {
resolve(res.data.member_data);
}
});
});
}
personResult(id,userId,ccId){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'post',
url:"https://www.mosoteach.cn/web/index.php?c=interaction_quiz&m=person_result",
dataType:"json",
data: {
id: id,
user_id: userId,
cc_id: ccId,
},
success: function(res) {
resolve(res);
}
});
});
}
join_class(){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'post',
url:"https://www.mosoteach.cn/web/index.php?c=clazzcourse&m=my_joined",
dataType:"json",
success: function(res) {
resolve(res.data);
}
});
});
}
get_page(class_id){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'post',
url:"https://www.mosoteach.cn/web/index.php?c=interaction&m=index&clazz_course_id="+class_id,
success: function(res) {
resolve(res);
}
});
});
}
get_page_status(id,ccId){
return new Promise((resolve,rejcet)=>{
$.ajax({
type: 'post',
url:"https://www.mosoteach.cn/web/index.php?c=interaction_quiz&m=get_quiz_ranking",
dataType:"json",
data: {
id: id,
ccId: ccId,
},
success: function(res) {
resolve(res);
}
});
});
}
async get_user_obj(){
let classListData = await (this.join_class());
if(!classListData){
return console.log("未登录账户");
}
classListData.forEach(ccid=>{
GM_setValue(ccid.id,ccid.course.name);//对应课名
// console.log(ccid);
})
if(classListData.length == 0){
return console.log("未登录账户");
}
let {data:objectList} = await (this.getListMember(classListData[0].id));
if(objectList.length <= 0 ){
return alert("初始化脚本失败");
}
GM_setValue("userimg",objectList[0].full_avatar_url);
GM_setValue("user_id",objectList[0].user_id);
let img_table = $('html').find("#x_set")
img_table.css("background","url(" + objectList[0].full_avatar_url + ")")
this.config.user_id = objectList[0].user_id;
this.config.user_list = objectList;
// console.log(this.config.user_list)
this.config.full_name = objectList[0].full_name;
this.config.clazz_course_id = classListData[0].id
let obj={
"unionid": objectList[0].user_id,
"username": objectList[0].full_name,
"poolId":"ec942b0b-38c6-3256-b0e1-2a33428d4bbc",
"grade": "云班课",
};
return obj
}
async upload_all_problem(show_aner){
let classListData = await (this.join_class());
if(!classListData){
return;
}
classListData.forEach(ccid=>{
GM_setValue(ccid.id,ccid.course.name);//对应课名
// console.log(ccid);
})
this.config.class_size = 0
this.config.class_length = 0
let aner = $('html').find("#aner")
if(show_aner){
aner.text("欢迎您的第一次使用,正在为您聚合数据中,请稍后。。。。");
aner.css("display","block")
}
for(let i=0;i<classListData.length;i++){
let cl = classListData[i];
this.get_page(cl.id).then((result) =>{
$(result).find(".interaction-row").each(async (index,div)=>{
let id = $(div).attr('data-id');
let type = $(div).attr('data-type');
let status = $(div).attr('data-row-status');
if(type=="QUIZ"){
if(!GM_getValue(id)){
this.config.class_length++;
this.config.class_size++;
try{
await(this.get_quiz_result(id,this.config.user_id,cl.id));
console.log(id+"upload成功")
}catch{
console.log(id+"upload失败")
}
this.config.class_size--;
if(show_aner){
aner.text("百分比长时间未动请刷新页面\n已加载:"+Math.trunc((1-(this.config.class_size/this.config.class_length))*100)+"%");
}
}
}
})
});
}
}
async get_quiz_result(id,user_id,clazz_course_id){
var classname = GM_getValue(clazz_course_id)
if(!classname){
let classListData = await (this.join_class());
if(!classListData){
return;
}
classListData.forEach(ccid=>{
GM_setValue(ccid.id,ccid.course.name);//对应课名
// console.log(ccid);
})
var classname = GM_getValue(clazz_course_id)
if(!classname){
classname = "未命名课程";
}
}
let res = await (this.personResult(id,user_id,clazz_course_id));
var status = "error";
// if(res.result_code != 0){
// return alert(res.result_msg);
// }
let answers = this.reset_answer(res);
if(answers == null || JSON.stringify(answers) == '{}' ){
return status;
}
let obj={
"poolId": this.config.poolId,
"userId": this.config.tk_uid,
"tags":[classname,answers.title,"云班课"],
"title":answers.id,
"problems":[],
};
let data={};
answers.rows.forEach(row=>{
if(row.subject.length < 4 || row.answers == ""){
console.log("题目录入有误");
return; //跳出循环
}
data={
"tags": ["云班课"],
"text": row.subject,
"answer": JSON.stringify(row.answers),
};
data.tags.push(row.type);
let l = ["choice_A","choice_B","choice_C","choice_D","choice_E","choice_F","choice_G","choice_H","choice_I","choice_J","choice_K","choice_L","choice_M","choice_N","choice_O","choice_P","choice_Q","choice_R","choice_S","choice_T","choice_U","choice_V","choice_W","choice_X","choice_Y","choice_Z"];
let i=0;
row.options.forEach(option =>{
data[l[i]]=option;
i=i+1;
})
obj.problems.push(data);
});
if(obj.problems.length == 0){
return;
}
await(window.my.upladApi(window.my.MainIP+"/tiku/api/v1/problems",obj).then((resutData)=>{
console.log(resutData)
if(resutData.result=="success" && resutData.json){
var data = resutData.json.data;
console.log(data);
GM_setValue(id,1);
status = "success"
}else{
console.log(resutData);
}
}));
return status;
}
reset_answer(data){
let newData = {};
if(data ==null){
return console.log("并未获取到题库数据");
}
if("activity" in data){
console.log("蓝墨云题库重组中");
newData.id = data.activity.id;
newData.title = data.activity.title;
newData.rows = [];
data.activity.topics.forEach(row=>{
let _data = {};
_data.id = row.topic_id;
let imgs =null;
try{
imgs = $.parseHTML(row.subject); // 去除特殊字符报错
}catch (e){
console.log(e);
}
row.subject=window.my.HtmlUtil.htmlDecode(row.subject);
if(imgs){
imgs.forEach(async function(img,index){
if(img.localName == "img"){
row.subject += img.outerHTML;
}
})
}
// row.subject = row.subject.substr(0,500) //截断前500个字符
_data.subject = row.subject;
_data.options = [];
_data.answers = [];
_data.type = row.type;
if(row.type == "TF"){
if(row.tf_answer!=null){
_data.answers.push(row.tf_answer);
}else{
if(row.result == 1){
_data.answers.push(row.user_tf_answer)
}else{
_data=null;
}
}
}else if(row.type == "FILL"){
row.fill.blank_alternatives.forEach(answer=>{
if(answer.contents[0] !=null){
_data.answers.push(answer.contents);
}else{
if(answer.result ==1){
_data.answers.push(answer.user_content)
}else{
_data=null;
}
}
});
}else{
if(row.answers.length != 0){
row.options.forEach(option=>{
_data.options.push(window.my.HtmlUtil.htmlDecode(option.content));
row.answers.forEach(index =>{
if(option.item_no == index){
_data.answers.push(window.my.HtmlUtil.htmlDecode(option.content));
}
});
});
}else{
if(row.result == 1){
row.options.forEach(option=>{
_data.options.push(window.my.HtmlUtil.htmlDecode(option.content));
row.user_answers.forEach(index =>{
if(option.item_no == index){
_data.answers.push(window.my.HtmlUtil.htmlDecode(option.content));
}
});
});
}else{
_data=null;
}
}
}
if(_data != null){
newData.rows.push(_data);
}
});
}else{
console.log(data);
}
return newData;
}
async main_resource(reslist){
var watch = reslist[0]
var req = {}
if (reslist.length != 0) {
$("#x_res").text("剩下" + reslist.length + "个")
} else {
$("#x_res").text("全部完成")
location.reload()
return 0
}
var clazz_course_id = this.config.clazz_course_id
$.ajax({
type: "POST",
url: "https://www.mosoteach.cn/web/index.php?c=res&m=request_url_for_json",
data: {
'file_id': watch.id,
'type': 'VIEW',
'clazz_course_id': clazz_course_id,
},
dataType: "json",
success: msg => {
const src = msg.src
if (src.indexOf("m3u8") > -1) {
fetch(src)
.then(data => data.text())
.then(text => {
let time = 0
for (i of text.split("\n")) {
if (i.indexOf("#EXTINF:") > -1) {
i = parseFloat(i.replace("#EXTINF:", ""))
time += i
}
}
time = Math.ceil(time)
$.ajax({
type: 'post',
dataType: 'json',
url: 'https://www.mosoteach.cn/web/index.php?c=res&m=save_watch_to',
data: {
clazz_course_id: clazz_course_id,
res_id: watch.id,
watch_to: time,
duration: time,
current_watch_to: time
},
success: res => {
reslist.splice(0, 1)
this.main_resource(reslist)
}
});
})
} else {
reslist.splice(0, 1)
this.main_resource(reslist)
}
}
})
}
resource_farming(reslist){
var reslist = []
$(".res-row-open-enable").each(function() {
if ($(this).find('span[data-is-drag]')[0].dataset.isDrag == "N") {
reslist.push({
id: $(this).attr('data-value'),
state: $(this).find('span[data-is-drag]')[0].dataset.isDrag,
type: $(this).attr('data-mime')
})
}
});
this.main_resource(reslist)
}
async start_search(){ //搜题按钮实现
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
function random(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
let HtmlUtil = window.my.HtmlUtil;
let aner = $('html').find("#aner")
aner.css("display","block")
aner.text("正在搜索中,请稍后")
let upload_paper_flag = false;
let answers = await(window.my.getAnswers(this.config.id,true));
if(this.config.tk_uid == null || (answers == null)||JSON.stringify(answers) == '{}' || answers.rows.length <= 0){
let subjects = []
$('.topic-item').each(function(index,div){
let Id = $(div).find('a').attr('name');
let subject = $(div).find('.t-subject.t-item.moso-text.moso-editor').text().trim();
let imgs = $(div).find("img");
// console.log(imgs)
subject = HtmlUtil.htmlDecode(subject);
imgs.each(async function(index,img){
if(img.outerHTML){
subject += img.outerHTML;
}
})
if(subject != ""){
subjects.push(subject);
}
})
answers = await(window.my.findproblems(subjects));
upload_paper_flag = true
}
if(JSON.stringify(answers) == '{}' || !(answers.rows)){
aner.text("没有搜索到答案,若提前阅卷时有答案,但此时没有请反馈")
}else{
aner.text("总共搜索到"+answers.rows.length+"题")
answers.rows.forEach(row=>{
aner.append("<hr>");
aner.append("题目:"+row.subject+"<br>"+"答案:");
row.answers.forEach(answer =>{
aner.append(answer+" ");
});
});
}
window.my.config.timenum = answers.rows.length * 4 * (GM_getValue("is_wait") ? 0:1)
$(".my-sticky-bottom").children("button:first").attr('id', 'submit')
window.my.config.timer = setInterval(function() {
window.my.config.timenum--
if (window.my.config.timenum < 0) {
$("#submit").text("交卷")
$("#submit").attr("style", "")
$("#submit").attr('disabled', false)
clearInterval(window.my.config.timer)
} else {
$("#submit").attr('disabled', true)
$("#x_start").attr('disabled', true)
$("#submit").attr("style", "width:250px")
$("#submit").text("请在" +window.my.config.timenum +"秒后交卷")
}
}, 1000)
// $('.topic-item').each(function(index,div){ // 如果是这个后面记得加括号
let divs = $('.topic-item');
for(let i=0;i<divs.length;i++){
let div = divs[i];
let Id = $(div).find('a').attr('name');
let flag_FT = false
//console.log($(div).find('.t-subject.t-item.moso-text.moso-editor').html());
let subject = $(div).find('.t-subject.t-item.moso-text.moso-editor').text();
let imgs = $(div).find("img");
subject=HtmlUtil.htmlDecode(subject);
imgs.each(async function(index,img){
if(img.outerHTML){
subject += img.outerHTML;
}
})
// subject = subject.substr(0,500);
// console.log(subject);
// subject=escapeto(subject);
//let space = new RegExp(`${String.fromCharCode(160)}`,"g"); /* no breaking space*/
// console.log(subject);
if( $(div).find('.show_answer').length == 0){
$(div).find('.t-con').append("<div class='show_answer'></div>")
}
answers.rows.forEach((row,index)=>{
if(row.subject == subject){
if(!$(div).find('.show_answer')[0].outerText){
$(div).find('.show_answer').append("答案:"+JSON.stringify(row.answers)+"<br>").css('color','red'); // 添加答案在后方
}else{
$(div).append("第"+(i+1)+"题重复<br>").css('color','blue');
$(div).find('.show_answer').append("答案:"+JSON.stringify(row.answers)+"<br>").css('color','red'); // 添加答案在后方
}
}
});
let $options = $(div).find('label');
if($options.length == 0){
$options = $(div).find('input');
}
for(let index = 0;index<answers.rows.length;index++){
let row = answers.rows[index];
if(row.subject != subject){
continue;
}
if("checked" in answers.rows[index]&& answers.rows[index].checked == answers.rows[index].answers.length){
continue
}
answers.rows[index].checked = 0;
for(let i = 0;i < $options.length;i++){
let label = $options[i];
let content = $(label).find('.option-content.moso-text.moso-editor').text();//单多选题答案获取
if(content == ""){
content = $(label).find('.el-radio__label').text();//判断题答案获取
flag_FT = true
}
if(content == ""){
//填空题
if(Array.isArray(row.answers[i])){
$(label).val(row.answers[i][0]);
answers.rows[index].checked +=1;
}else{
$(label).val(row.answers[i]);
answers.rows[index].checked +=1;
}
let ev = document.createEvent("HTMLEvents");
ev.initEvent("input", true, true);
$(label)[0].dispatchEvent(ev);
}
for(let j=0;j<row.answers.length;j++){
let answer = row.answers[j];
if(flag_FT == true){
if (answer == "T"){
answer = "正确"
}else if(answer == "F"){
answer = "错误"
}
}
try{
if(content == answer){
if ($(label).find(".is-checked").length) {
answers.rows[index].checked +=1;
// aner.text("答案重复,请注意分辨答案。题目:"+subject);
continue;
}
$(label).css('color','red');
$(label).click();
answers.rows[index].checked +=1;
await sleep(random(100,200));
break;
}
}catch (e){
console.log("发生异常:" + e);
}
}
}
};
await sleep(random(500,1000));
}; //结束
answers.rows.forEach((row,index)=>{
if(row.checked < row.answers.length){
delete answers.rows[index];
return;
}
for(let q =index+1;q<answers.rows.length;q++){
let row1 = answers.rows[q];
if(row.subject == row1.subject){
let tmp = window.my.compareArr(row.answers,row1.answers);
if(tmp == "disjoint"){
return;
}else if(tmp == "equal"){
console.log(row.answers);
console.log(row1.answers);
delete answers.rows[index];
return;
}else if(tmp == "subset"){
delete answers.rows[index];
return;
}else if(tmp == "superset"){
delete answers.rows[q];
return;
}else if(tmp == "mix"){
return;
}else{
console.log("未知"+tmp)
}
}
}
});
if(upload_paper_flag){
window.my.upload_papers(answers,this.config.id,"智慧树");
}
// alert('alv');
window.my.api.upload_all_problem(false)
//题库获取模块 end
}
}
MyPage.prototype.x_res = function(){
return this.api.resource_farming()
}
MyPage.prototype.getAnswers = async function(id,deep){
let answers = {};
let obj={
"poolId": this.config.poolId,
"userId": this.config.tk_uid,
"querry": {
"operator": "==",
"argument1": "papertitle",
"argument2": id,
},
"deep": deep,
};
await(this.upladApi(this.MainIP+"/tiku/api/v1/queryCollection",obj).then(async (resutData)=>{
if(resutData.result==="success" && !!resutData.json){
var data = resutData.json.results;
console.log("总共查询到数据库数量"+data.length+"个");
data.forEach((item, index) =>{
if(index == 0){
answers =this.resoluAnswers(item);
}else{
this.resoluAnswers(item).rows.forEach(i =>{
answers.rows.push(i);
})
}
});
}
}));
return answers;
}
MyPage.prototype.arrowMove = function(e){
// var e = document.getElementById(e);
// 元素大小
let elW = e.currentTarget.offsetWidth
let elH = e.currentTarget.offsetHeight
// 元素位置
let elL = e.currentTarget.parentNode.parentNode.offsetLeft
let elT = e.currentTarget.parentNode.parentNode.offsetTop
// 鼠标位置
let x = e.clientX
let y = e.clientY
// 窗口大小
let w = window.innerWidth
let h = window.innerHeight
// 鼠标到元素左边距离
let moveX = x - elL
let moveY = y - elT
let el = e.currentTarget
document.onmousemove = function (e) {
// el.style.position = 'fixed';
el.parentNode.parentNode.style.left = e.clientX -moveX + 'px'
el.parentNode.parentNode.style.top =e.clientY - moveY + 'px'
}
document.onmouseup = function (e) {
document.onmousemove = null
document.onmouseup = null
}
};
MyPage.prototype.initMenu = function(){
let $ = this.$,menu = this.menu;
$(document).on('mousedown', '#x_set', function (e) {
window.my.arrowMove(e);//.target.parentNode.id
});
$(document).on('click', '#x_start', function () {
window.my.start();
});
$(document).on('click', '#x_set', function () {
$('html').find("#set").toggle('active');
$('html').find("#aner").hide("slow");
});
// $(document).on('click', '#x_charge', function () {
// let aner = $('html').find("#aner")
// aner.css("display","block")
// aner.text("");
// aner.append("充电地址:");
// });
$(document).on('click', '#x_find',async function () {
let aner = $('html').find("#aner")
let text = document.getElementById("find_input")
aner.show("slow");
aner.text("");
if(text.value.length <6){
aner.append("搜索题目需要6个字符以上");
return;
}
aner.append("若长时间未返回信息,请反馈<hr>");
// problem = window.my.HtmlUtil.htmlDecode(text.value);
// console.log(problem)
await window.my.findproblem(text.value.replace(/ /g," "))
aner.text("");
aner.append("搜索到"+window.my.config.answer.rows.length+"条相关题目<hr>");
window.my.config.answer.rows.forEach(row=>{
aner.append("题目:"+row.subject+"<br>"+"答案:");
row.answers.forEach(answer =>{
aner.append(answer+" ");
});
aner.append("<hr>");
});
});
$(document).on('click', '#x_AIfind',async function () {
let aner = $('html').find("#aner")
let text = document.getElementById("find_input")
aner.show("slow");
aner.text("");
if(text.value.trim() == ""){
aner.append("请输入内容");
return;
}
aner.append("若长时间未返回信息,请反馈<hr>");
let obj ={
"messages": [
{
"role": "user",
"content": text.value
}
],
"stream": true,
"model": "gpt-3.5-turbo",
"temperature": 0.5,
"presence_penalty": 0,
"frequency_penalty": 0,
"top_p": 1
};
GM_xmlhttpRequest({
responseType:"stream",
timeout: 10000,
method: "post",
url: window.my.ChatIP+"/api/openai/v1/chat/completions",
headers:{
// Authorization:'Bearer nk-wangzeqing',
Authorization:'Bearer nk-'+window.my.config.tk_uid+","+window.my.config.poolId,
// Cookie:"next-auth.csrf-token=e8b5559fadb5ce3684e9a0611591684ffffc2224d9125a49e7081a92425c3026%7C47d575638e3a14f787462c27c1fe8895d740210370848182a740fa71dfb55211; next-auth.callback-url=http%3A%2F%2Flocalhost%3A3000; next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..wNFkEP1XItcDCpY2.nJBc4rvu8_cAGx0mtDdm2pvIjPAWGMGou24L2ZzoyImrCIqLDiAMS5w6WzN6dm_8GuI331tfqxHc_V4LRoAmmFT0A8X5ln9C1iC4p47IQM_4RF2B-8iLGElCkVOYJieCkvV1lVrFHVT31nzI12n8Xpwttrw5yGhywCR3sWZ1J7sr4QCXeCA-lpOdITDyW8AdNPjH4QQ7vhtCIzjzFoepmJKk5mE2lPmksDiGrQX3d1POPwfQqdHafb8rgZJl_BC4_wDXloIt6mtTfQ4._NPSNHQIhsWS5eQprCIeCQ",
},
data: JSON.stringify(obj),
onloadstart: function(response) {
aner.text("");
// console.log(response.response)
const reader = response.response.getReader();
var error_d = "";
function read() {
reader.read().then(({ done, value }) => {
if (done) {
console.log('读取完毕');
return;
}
let data = new TextDecoder().decode(value)
data.split("data:").forEach(d=>{
if(d!=""&&d.indexOf("[DONE]") == -1){
let Json_msg=null;
try{
if(error_d){
d = error_d +d;
error_d="";
}
Json_msg = $.parseJSON(d)
if(Json_msg.msg=="empty access code"||Json_msg.msg=="wrong access code"){
aner.append("若需要使用AI功能请先<button onclick=\"window.open('"+window.my.ChatIP+"/#/activate', 'Meto登陆', 'width=400,height=600');\">登陆</button>");
return;
}else if(Json_msg.msg=="剩余token不足请[充值](https://d.met0.top/)"){
aner.append("您的AI剩余TOKEN已不足请<button onclick=\"window.open('https://d.met0.top/', 'Meto登陆');\">充值</button><br/>未登陆账号请<button onclick=\"window.open('"+window.my.ChatIP+"/#/activate', 'Meto登陆', 'width=400,height=600');\">登陆</button>");
return;
}
aner.append(Json_msg.choices[0].delta.content);
aner.scrollTop(aner.prop("scrollHeight"));
}catch (e){
if(Json_msg){
aner.append("发生异常:" + d);
}else{
console.log("发生异常:" + d)
}
error_d=d;
}
}
});
// console.log($.parseJSON(data));
// 继续读取下一个数据块
read();
});
}
// 开始读取数据
read();
},
onerror : function(err){
console.log('error')
aner.append("发生异常:" + err);
},
ontimeout : function(inf){
console.log('请求超时')
aner.append("请求超时:" + inf);
}
})
});
$(document).on('click', '#x_yue', async function () {
let aner = $('html').find("#aner")
aner.show("slow");
$("#x_yue").attr("disabled", true)
aner.text("正在搜索答案中");
let answers = await(window.my.getAnswers(window.my.config.id,true));
if(!answers||JSON.stringify(answers) == "{}"){
aner.text("暂时没有此试卷信息。可直接开始答题进行搜索(可能最终答案没那么全)");
return;
}
aner.text("搜索到"+ answers.rows.length +"条题目信息");
answers.rows.forEach(row=>{
aner.append("<hr>");
aner.append("题目:"+row.subject+"<br>"+"答案:");
row.answers.forEach(answer =>{
aner.append(answer+" ");
});
});
});
$(document).on('click', '#x_res', async function () {
$("#x_res").attr("disabled", true)
window.my.x_res()
});
$(document).on('click', '#x_recall', async function () {
$("#"+menu.id).css("left","0").css("top","0");
$(".drawer").hide();
$(".t-answer").each((index,div) =>{
$(div).append("<button class =\"addpro\" style = \"height:30px; background:#c9fff5 ;border-radius: 50px;padding: 3px;margin-top: 10px;\">添加到错题</button>")
$(div).find("span").css("color","#FFF").css("display","block").css("width","70px").css("font-size","25px").css("border","1px solid black").click(function(_this){
$(_this.currentTarget).css("color","#0bd")
});
$(div).find(".answer-r").hide();
})
});
$(document).on('click', '#x_error_problems', async function () {
let error_problem = GM_getValue(window.my.config.id+"_error_problem");
if(!error_problem){
error_problem = {};
alert("您还未建立错题集");
return;
}
$("#"+menu.id).css("left","0").css("top","0");
$(".drawer").hide();
$(".topic-list").text("");
for (var i in error_problem) {
$(".topic-list").append(error_problem[i]);
};
$(".t-answer").each((index,div) =>{
$(div).find("span").css("color","#FFF").css("display","block").css("width","70px").css("font-size","25px").css("border","1px solid black").click(function(_this){
$(_this.currentTarget).css("color","#0bd")
});
});
});
$(document).on('click', '.addpro', async function (_this) {
$(_this.currentTarget).attr("class","delpro").css("background","#f2ffc9").text("移出错题集");
let error_problem = GM_getValue(window.my.config.id+"_error_problem");
if(!error_problem){
error_problem = {};
console.log("新建错题库");
}
error_problem[$(_this.currentTarget.offsetParent).find(".t-index").text()] = _this.currentTarget.offsetParent.outerHTML;
GM_setValue(window.my.config.id+"_error_problem",error_problem);
console.log(error_problem);
});
$(document).on('click', '.delpro', async function (_this) {
$(_this.currentTarget).attr("class","addpro").css("background","#c9fff5").text("添加到错题");
let error_problem = GM_getValue(window.my.config.id+"_error_problem");
delete error_problem[$(_this.currentTarget.offsetParent).find(".t-index").text()];
GM_setValue(window.my.config.id+"_error_problem",error_problem);
});
/**
* MosoteachHelper CSS
*/
const styleTag = `
<style scoped>
#${menu.id} #zhu button[disabled]{
color: white !important;
background-color: rgb(188, 188, 188) !important;
}
#${menu.id} #zhu button{
float:left;
margin:25px 2px;
// width:70px;
// height:25px;
/* 把按钮撑大 */
padding: 4px 8px;
/* 去除默认边框 */
border: none;
/* 圆角 */
border-radius: 50px;
/* 按钮背景色 */
background-color: #8888ff;
/* 字体颜色、大小、粗细、字间距 */
color: #fff;
font-size: 12px;
font-weight: bold;
letter-spacing: 1px;
/* 鼠标小手 */
cursor: pointer;
/* 给个定位 */
position: relative;
/* 3D模式 */
transform-style: preserve-3d;
/* 过度动画时间 */
transition: ease-in-out 2s;
}
#${menu.id} #zhu button:hover {
/* 鼠标放上来旋转一圈 */
transform: rotateX(360deg);
}
#${menu.id} #zhu button::before,
#${menu.id} #zhu button:after {
content: "";
/* 白色边框线 */
border: 0.8px solid #fff;
/* 圆角 */
border-radius: 50px;
/* 通过定位来撑开边框,简单来说,确定4边的距离,中间自然就固定了 */
position: absolute;
top: 1px;
left: 1px;
right: 1px;
bottom: 1px;
/* 3D模式 */
transform-style: preserve-3d;
/* 设置透视参数,向 Z轴方向移动,正常时候就是向屏幕外面移动 */
transform: perspective(1000px) translateZ(5px);
}
#${menu.id} #zhu button::after {
/* 另一边反着移动一下 */
transform: perspective(1000px) translateZ(-5px);
}
#${menu.id} #zhu button span {
/* 设置 span 为块元素 */
display: block;
/* 3D模式 */
transform-style: preserve-3d;
/* 同样设置透视,抬高 Z轴距离 */
transform: perspective(500px) translateZ(8px);
}
#${menu.id}{
font-size:14px;
z-index: 9999;
text-align:center;
// width:0;
// height:0;
position:fixed;
pointer-events: none;
left:${menu.pos.x}px;
top:${menu.pos.y}px;
// background:${menu.background};
// opacity:${menu.opacity};
}
#${menu.id} #zhu{
pointer-events: visible;
}
#${menu.id} .drawer{
pointer-events: visible;
position:relative;
max-height:400px;
overflow:auto;
text-align:left;
display: none;
background: #fff;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
width: 100%; /* initially */
max-width: 300px;
opacity: 0.9;
z-index: 199;
padding:3px;
margin:10px;
}
#${menu.id} p{
text-align:left;
padding-left:5px;
}
#${menu.id} .drawer input{
border-radius: 3px;
border: 1px solid;
width:50%;
}
#${menu.id} .drawer button{
display:inline;
vertical-align:middle;
border: 1px solid;
background-color: transparent;
text-transform: uppercase;
padding: 1px 2px;
font-weight: 300;
}
#${menu.id} .drawer button:hover {
color: white;
border: 0;
background-color: #4cc9f0;
-webkit-box-shadow: 10px 10px 99px 6px rgba(76,201,240,1);
-moz-box-shadow: 10px 10px 99px 6px rgba(76,201,240,1);
box-shadow: 10px 10px 99px 6px rgba(76,201,240,1);
}
#${menu.id} #x_set{
animation: change 3s linear 0s infinite;
float:left;
position:relative;
z-index: 200;
margin:10px;
border-radius:50%;
overflow:hidden;
height: 50px;
width:50px;
border: solid 2px #00ff00;
background: url(${GM_getValue("userimg") ? GM_getValue("userimg"):"https://i.jpg.dog/8a4f4bd4c5ea7b1eff20a2978885f2b1.jpeg"});
background-size: 50px 50px;
}
@keyframes change {
0% {border: solid 2px #333;}
25% {border: solid 2px #f60;}
50% {border: solid 2px #f00;}
75% {border: solid 2px #1ab558;}
100% {border: solid 2px #333;}
}
</style>`;
$(styleTag).appendTo('head');
let $menu = $(
`
<div id='${menu.id}'>
<script>!function(p){"use strict";!function(t){var s=window,e=document,i=p,c="".concat("https:"===e.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=e.createElement("script"),r=e.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",i.d=n;var o=function(){s.LA.ids.push(i)};s.LA?s.LA.ids&&o():(s.LA=p,s.LA.ids=[],o()),r.parentNode.insertBefore(n,r)}()}({id:"3G5Pk0eEh7wEuiuP",ck:"3G5Pk0eEh7wEuiuP"});</script>
<div id ="zhu">
<div id="x_set"></div>
</div>
<div class= "drawer" id="set">
<div>
用户:<input id = "tiku_user" readonly="readonly" value="未获取到用户名,请刷新重试" />
${GM_getValue("ti_uid")?`<button onclick="GM_setValue('ti_uid','');location.reload()">退出</button>`:`<button onclick="window.open('${this.ChatIP}/#/activate', 'Meto登陆', 'width=400,height=600');">登陆</button>`}
<button id="x_charge" ><a target="_blank" href = "https://d.met0.top/buy/3">充电</a></button>
</div>
<div>
题目:<input id = "find_input" placeholder="搜索题目需要6个字符以上" />
<button id="x_find" >MT搜</button>
<button id="x_AIfind" >AI搜</button>
</div>
<div>
本项目非盈利,仅ai功能需登陆使用,欢迎给项目发电,大家的支持才是我开发的动力
</div>
</div>
<div class= "drawer" id="aner">
<p>
正在获取试卷中,请稍等
</p>
</div>
</div>`);
$($menu).appendTo('html');
this.aner = $('#aner');
// GM_setValue("update_time","")
// if(!GM_getValue("update_time") || GM_getValue("update_time")+12 < Date.now()/1000/60/60){//每12小时更新脚本
// console.log($("#set"))
// $("#set").css("display","block")
// // this.aner.css("display","block")
// // this.aner.text("检测版本更新");
// // this.aner.append('<br/><div text-align: center;"><p>此页面仅在首次加载时出现</p> <p>网络讨口子来咯(商家码)</p> <img src="https://d.met0.top/uploads/images/IMG_2484.PNG" style="width:200px" ></div>')
// GM_setValue("update_time",Date.now()/1000/60/60)
// GM_xmlhttpRequest({
// method: "GET",
// url: "https://gitee.com/xiaolv12/yunbanke/raw/master/%E7%AD%94%E9%A2%98%E5%8A%A9%E6%89%8B.js",
// onload: res=> {
// GM_setValue("window.al_yun_xx",res.response);
// },
// onerror:err=>{
// console.log("加载失败")
// }
// })
// }
// if(parseFloat(this.version) > parseFloat(GM_info.script.version) ){
// GM_setValue("window.al_yun_xx",null);
// alert("脚本存在新版本,请及时更新");
// window.location.href=GM_info.scriptUpdateURL
// }
}
MyPage.prototype.initData = async function(){ //初始化
GM_registerMenuCommand("基本设置",function(){
$('html').find("#set").toggle('active');
});
GM_registerMenuCommand(GM_getValue("is_wait") ? "开启延迟交卷" : "关闭延迟交卷(不建议)" ,function(){
GM_setValue("is_wait",!GM_getValue("is_wait"));
location.reload();
});
GM_registerMenuCommand("重置脚本",function(){
GM_setValue("overdue",1);
GM_setValue("window.al_yun_xx",null);
location.reload();
});
document.getElementById("tiku_user").value=this.config.tk_uid;
switch (this.config.hostname){
case "mooc.mosoteach":
if(this.config.c === "res"||this.config.front_url.at(-1) === "course-learning"){
$('#zhu').append("<button id='x_res' ><span>一键完成资源</span></button>");
}else{
$('#zhu').append("<button onclick='window.open(\"https://d.met0.top\");'><span>MeT0题库</span></button>");
}
break;
case "mosoteach": {
if(this.config.m === "reply"){ //
// this.Listener();
$('#zhu').append("<button id='x_start' ><span>开始搜题</span></button>");
// document.getElementById("zhu")
}else if(this.config.c === "res"||this.config.front_url.at(-1) === "course-learning"){
$('#zhu').append("<button id='x_res' ><span>一键完成资源</span></button>");
}else if(this.config.m === "quiz_ranking" || this.config.m === "start_quiz_confirm"){
$('#zhu').append("<button id='x_yue' ><span>提前阅卷</span></button>");
}else if(this.config.m === "person_quiz_result"){
// $('#zhu').append("<button id='x_start' ><span>开始搜题</span></button>");
$('#zhu').append("<button id='x_recall' ><span>背题模式</span></button>");
$('#zhu').append("<button id='x_error_problems' ><span>错题集</span></button>");
let aner = $('html').find("#aner")
aner.css("display","block")
aner.text("正在导入题库中");
if(!GM_getValue(this.config.id)){
flag = await(this.api.get_quiz_result(this.config.id,this.config.user_id,this.config.clazz_course_id));
if(flag == "success"){
aner.text("题库导入成功");
}else{
aner.text("题库导入失败");
}
}else{
aner.text("题库已存在");
}
}else{
$('#zhu').append("<button onclick='window.open(\"https://d.met0.top\");'><span>MeT0题库</span></button>");
}
break;
}
case "zhihuishu": {
if(this.config.front_url.at(5) == "checkHomework"){
let aner = $('html').find("#aner")
aner.css("display","block")
aner.text("正在导入题库中");
let examId = this.config.examId||this.config.id;
let taskId = this.config.recordId||this.config.taskId;
let obj = {
recruitId: this.config.front_url[6],
studentExamId: this.config.front_url[7],
examId: this.config.front_url[8],
schoolId: this.config.front_url[10],
courseId: this.config.front_url[9],
}
if(!GM_getValue(obj.examId)){
let server_token = await(labc(3))
flag = await(this.api.get_quiz_result(server_token,obj));
if(flag == "success"){
aner.text("题库导入成功");
}else{
aner.text("题库导入失败");
}
}else{
aner.text("题库已存在");
}
}else{
$('#zhu').append("<button onclick='window.open(\"https://d.met0.top\");'><span>MeT0题库</span></button>");
}
break;
}
case "icve": {
if(this.config.front_url.at(-1) == "keepTest"||this.config.front_url.at(-1) =="jobTest"){ //
// this.Listener();
$('#zhu').append("<button id='x_start' ><span>开始搜题</span></button>");
}else if(this.config.front_url.at(-1) =="course-learning"){ //暂未实现 留置
$('#zhu').append("<button id='x_res' ><span>一键完成资源</span></button>");
}else if(this.config.front_url.at(-1) == "viewJob1"){
let aner = $('html').find("#aner")
aner.css("display","block")
aner.text("正在导入题库中");
let examId = this.config.examId||this.config.id;
let taskId = this.config.recordId||this.config.taskId;
if(!GM_getValue(examId+taskId)){
flag = await(this.api.get_quiz_result(examId,taskId,"独立导入"));
if(flag == "success"){
aner.text("题库导入成功");
}else{
aner.text("题库导入失败");
}
}else{
aner.text("题库已存在");
}
}else{
$('#zhu').append("<button onclick='window.open(\"https://d.met0.top\");'><span>MeT0题库</span></button>");
}
break;
}
case "ouchn":{
if(this.config.front_url.at(5) =="ng#" ||this.config.front_url.at(5) =="ng" ){
GM_setValue("resource_farming_state",false) // 跨域访问,清空默认状态
$('#zhu').append("<button id='x_res' ><span>一键完成资源</span></button>");
}else if(this.config.front_url.at(5) =="learning-activity"){
this.api.choice_function()
if(GM_getValue("resource_farming_state")){
$('#zhu').append("<button id='x_xxx' ><span>正在刷资源,请稍后</span></button>");
this.aner.show("hide")
this.aner.text("如需暂停请刷新上一级页面")
}else{
if(GM_getValue("resource_farming_main_state")){
$('#zhu').append("<button onclick='GM_setValue(\"resource_farming_main_state\",false)'><span>停止翻页</span></button>");
}else{
$('#zhu').append("<button onclick='GM_setValue(\"resource_farming_main_state\",true);location.reload()'><span>自动翻页</span></button>");
}
}
}
else{
$('#zhu').append("<button onclick='window.open(\"https://d.met0.top\");'><span>MeT0题库</span></button>");
}
break;
}
case "yuketang":{
if(this.config.front_url.at(-1) =="studycontent"){
GM_setValue("resource_farming_state",false) // 跨域访问,清空默认状态
$('#zhu').append("<button id='x_res' ><span>一键完成资源</span></button>");
}else if(this.config.front_url.at(-2) =="video"){
this.api.choice_function()
if(GM_getValue("resource_farming_state")){
$('#zhu').append("<button id='x_xxx' ><span>正在刷资源,请稍后</span></button>");
this.aner.show("hide")
this.aner.text("如需暂停请刷新上一级页面")
}else{
if(GM_getValue("resource_farming_main_state")){
$('#zhu').append("<button onclick='GM_setValue(\"resource_farming_main_state\",false)'><span>停止翻页</span></button>");
}else{
$('#zhu').append("<button onclick='GM_setValue(\"resource_farming_main_state\",true);location.reload()'><span>自动翻页</span></button>");
}
}
}
else{
$('#zhu').append("<button onclick='window.open(\"https://d.met0.top\");'><span>MeT0题库</span></button>");
}
break;
}
case "chaoxing":
if(this.config.c === "res"||this.config.front_url.at(-1) === "course-learning"){
$('#zhu').append("<button id='x_res' ><span>一键完成资源</span></button>");
}else{
$('#zhu').append("<button onclick='window.open(\"https://d.met0.top\");'><span>MeT0题库</span></button>");
}
break;
}
}
MyPage.prototype.toLog=function(explain){
/*
* 全局定时器
*/
let find_input = document.getElementById("find_input");
var flag=true;
setInterval(()=> {
if(this.config.front_url.at(-1) != window.location.href.split("?")[0].split("/").at(-1)){
location.reload()
}
let yaya_select = window.getSelection().toString();
if(yaya_select){
find_input.value = window.getSelection().toString()
}
if($("video").length&&flag){
flag = false
window.my.video_spend()
}
}, 400)
// alert('啊绿: '+explain);
this.initData();
return this;
}
MyPage.prototype.findproblem = async function(text){
let obj={
"poolId": this.config.poolId,
"userId": this.config.tk_uid,
"querry": {
"operator": "contains",
"argument1":"problemText",
"argument2":text,
}
}
/////
await(this.upladApi(this.MainIP+"/tiku/api/v1/queryProblems",obj).then(async (resutData)=>{
if(resutData.result==="success" && !!resutData.json){
var data = resutData.json.results;
//处理数据,添加标识头
let obj = {
flag: "metoproblems",
problems : data,
}
this.config.answer =this.resoluAnswers(obj);
}
}))
}
MyPage.prototype.findproblems = async function(problems){
let answer = []
let obj={
"poolId": this.config.poolId,
"userId": this.config.tk_uid,
"querry": {
"operator": "mulit",
"argument1":"1",
"argument2":"2",
"problems":[]
}
}
/////
problems.forEach(problem =>{
let problemobj = {
"operator": "==",
"argument1": "problemText",
"argument2": problem,
}
obj.querry.problems.push(problemobj);
})
await(this.upladApi(this.MainIP+"/tiku/api/v1/queryProblems",obj).then(async (resutData)=>{
if(resutData.result==="success" && !!resutData.json){
var data = resutData.json.results;
//处理数据,添加标识头
let obj = {
flag: "metoproblems",
problems : data,
}
answer = this.resoluAnswers(obj)
// console.log(this.config.answers);
}
}))
return answer
}
MyPage.prototype.upload_papers = async function(answers,title,platform){
var classname = GM_getValue(this.config.clazz_course_id)
if(!classname){
classname = "未命名课程";
}
let obj={
"poolId": this.config.poolId,
"userId": this.config.tk_uid,
"problemIds": [],
"title":title,
"tags":[classname,platform],
}
answers.rows.forEach(row=>{
for(let i =0;i<obj.problemIds.length;i++){
if(obj.problemIds[i] == row.problemId){
return;
}
}
obj.problemIds.push(row.problemId);
});
// console.log(obj);
await(this.upladApi(this.MainIP+"/tiku/api/v1/collection",obj).then(async (resutData)=>{
if(resutData.result==="success" && !!resutData.json){
// var data = resutData.json.results;
console.log(resutData);
}
}))
}
MyPage.prototype.Listener = function(){ //本来想做监听上传试卷,后来想想算了。
$('body').append(
`<script>
;(function() {
if (typeof window.CustomEvent === 'function') return false;
function CustomEvent(event, params) {
params = params || { bubbles: false, cancelable: false, detail: undefined };
// 创建自定义事件
var evt = document.createEvent('CustomEvent');
// 第一个参数为要处理的事件名
// 第二个参数为表明事件是否冒泡
// 第三个参数为表明是否可以取消事件的默认行为
// 第四个参数为细节参数
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
}
CustomEvent.prototype = window.Event.prototype;
window.CustomEvent = CustomEvent;
})();
(function() {
function ajaxEventTrigger(event) {
// 创建事件对象
var ajaxEvent = new CustomEvent(event, { detail: this });
// 触发执行
window.dispatchEvent(ajaxEvent);
}
var oldXHR = window.XMLHttpRequest;
function newXHR() {
var realXHR = new oldXHR();
realXHR.addEventListener('abort', function() { ajaxEventTrigger.call(this, 'ajaxAbort'); }, false);
realXHR.addEventListener('error', function() { ajaxEventTrigger.call(this, 'ajaxError'); }, false);
realXHR.addEventListener('load', function() { ajaxEventTrigger.call(this, 'ajaxLoad'); }, false);
realXHR.addEventListener('loadstart', function() { ajaxEventTrigger.call(this, 'ajaxLoadStart'); }, false);
realXHR.addEventListener('progress', function() { ajaxEventTrigger.call(this, 'ajaxProgress'); }, false);
realXHR.addEventListener('timeout', function() { ajaxEventTrigger.call(this, 'ajaxTimeout'); }, false);
realXHR.addEventListener('loadend', function() { ajaxEventTrigger.call(this, 'ajaxLoadEnd'); }, false);
realXHR.addEventListener('readystatechange', function() { ajaxEventTrigger.call(this, 'ajaxReadyStateChange'); }, false);
// l.onreadystatechange = function() {
// if (l && 4 === l.readyState && (0 !== l.status || l.responseURL && 0 === l.responseURL.indexOf("file:"))) {
// var n = "getAllResponseHeaders"in l ? a(l.getAllResponseHeaders()) : null
// , r = e.responseType && "text" !== e.responseType ? l.response : l.responseText
// , i = {
// data: r,
// status: l.status,
// statusText: l.statusText,
// headers: n,
// config: e,
// request: l
// };
// o(t, f, i),
// l = null
// }
// }
return realXHR;
}
window.XMLHttpRequest = newXHR;
})();
// 调用
window.addEventListener('ajaxReadyStateChange', function(e) {
// if (e.detail.readyState === 1) {
// console.log(123);
// e.detail.setRequestHeader('token', '1326');
// }
e.detail.onload = function() {
// if(e.detail.responseURL=="https://www.mosoteach.cn/web/index.php?c=interaction_quiz&m=save_answer"){
console.log('event====>', e.detail);
// }
};
});
`
)
}
MyPage.prototype.compareArr = function(arr1 = [], arr2 = []) {
// arr1.sort();
// arr2.sort();
const setA = new Set(arr1);
const setB = new Set(arr2);
const intersection = new Set([...setA].filter(x => setB.has(x))); // 交集
const union = new Set([...setA, ...setB]); // 并集
const differenceA = new Set([...setA].filter(x => !setB.has(x))); // a数组中有而b数组中没有的元素
const differenceB = new Set([...setB].filter(x => !setA.has(x))); // b数组中有而a数组中没有的元素
if (intersection.size === 0) {
return 'disjoint'; // a、b不相交
} else if (intersection.size === setA.size && intersection.size === setB.size) {
return 'equal'; // a、b相等
} else if (intersection.size === setA.size) {
return 'subset'; // a是子集
} else if (intersection.size === setB.size) {
return 'superset'; // a是父集
} else {
return 'mix';// a、b相交但不包含
}
}
MyPage.prototype.start =function(reslist){
return this.api.start_search()
}
_this.MyPage = MyPage;
})(window);
if(window.location == window.parent.location){ // 判断是否为ifarm
window.my = new window.MyPage({
id:"wzq",
width:80,
background:'#fff',
opacity:0.8,
pos:{
x:100,
y:100
}
}).toLog('私人圈子传播,请勿外传');
}