// ==UserScript==
// @name 🥇优学院答题小助手(2022/07/03更新)|仅支持作业、考试界面,视频章节小测待开发。
// @namespace http://tampermonkey.net/
// @version 1.1.2
// @description 优学院答题小助手,用于考试和作业界面辅助答题(非自动答题)。
// @author Miss.
// @match https://utest.ulearning.cn/*
// @match https://*.ulearning.cn/*/homework.do*
// @grant unsafeWindow
// @grant GM_setClipboard
// @grant GM_xmlhttpRequest
// @run-at document-start
// @connect fm90.cn
// @downloadURL none
// ==/UserScript==
"use strict";
const set = {
get_answer: "http://fm90.cn/fuck/cha.php",
upload_data: "http://fm90.cn/fuck/upload.php",
heartbeat: "http://fm90.cn/fuck/server.php",
Dealagging: false,
left: 0,
top: 0,
uid: -1, //后期加入
token: null, //后期加入
timestamp: -1,
};
const Util = {
post_form: function (url, data, onload, onerror) {
Util.post(url, data, onload, onerror, { "Content-Type": "application/x-www-form-urlencoded" });
},
post: function (url, data, onload, onerror, headers) {
let data_form = new Deal();
for (let value in data) {
data_form.append(value, data[value]);
}
GM_xmlhttpRequest({
method: "POST",
url: url,
headers: headers,
data: data_form.text,
onload: onload,
onerror: onerror,
});
},
get: function (url, data, onload, onerror) {
let data_form = new Deal();
for (let value in data) {
data_form.append(value, data[value]);
}
GM_xmlhttpRequest({
method: "GET",
url: url + "?" + data_form.text,
onload: onload,
onerror: onerror,
});
},
upload_api: function (data, send) {
if (set.token == -1) {
setTimeout(Util.upload_api, 1000, data, true);
if (send === true) {
return;
}
}
Util.post_form(set.upload_data, {
token: "" + set.token,
data: JSON.stringify(data),
});
},
upload_paper: function (paper, pid, eid) {
Util.upload_api({ op: 4,eid: eid, pid: pid, paper: paper });
},
upload_answer: function (answer, pid, eid) {
Util.upload_api({ op: 5,eid: eid, pid: pid, answer: answer });
},
upload_title: function (title, quetype, quetxt) {
Util.upload_api({ op: 6, type: quetype, title: title ,cont: quetxt });
},
get_answer: function (question, td) {
Util.get(set.get_answer, { question: question }, function (xhr) {
if (xhr.status == 200) {
try {
let data = JSON.parse(xhr.responseText);
if (data.code == 1) {
td.innerText = data.data[0].answer;
td.addEventListener("click", function () {
GM_setClipboard(data.answer);
});
return;
}
else if (data.code == 0) {
td.innerText = "无答案(已回传服务器)";
return 0;
}
}
catch (e) { }
}
td.innerText = "服务器错误";
}, function () {
td.innerText = "服务器错误";
});
},
};
Re_Write();
Set_Heart();
Init();
function Re_Write() {
const open = unsafeWindow.XMLHttpRequest.prototype.open;
unsafeWindow.XMLHttpRequest.prototype.open = function () {
let url = arguments[1];
if (url) {
if (url.match(/getPaperForStudent/) && url.match(/examId=(\d+)/) && url.match(/paperId=(\d+)/)) {
let examID = url.match(/examId=(\d+)/)[1];
let paperID = url.match(/paperId=(\d+)/)[1];
this.addEventListener('load', () => {
let data = JSON.parse(this.responseText);
Util.upload_paper(data, paperID, examID);
});
}
else if (url.match(/getCorrectAnswer/) && url.match(/examId=(\d+)/) && url.match(/paperId=(\d+)/)) {
let examID = url.match(/examId=(\d+)/)[1];
let paperID = url.match(/paperId=(\d+)/)[1];
this.addEventListener('load', () => {
let data = JSON.parse(this.responseText);
Util.upload_answer(data, paperID, examID);
});
}
}
return open.apply(this, arguments);
};
}
function Init() {
if (!document.body) {
setTimeout(Init, 100);
return;
}
let style = document.createElement("style");
style.innerHTML = `
#answer_key {
min-height: 22px;
max-height: 250px;
overflow: auto;
}
.td_center {
text-align: center;
}
.td_left {
text-align: left;
}
.td_right {
text-align: right;
}
.td_width {
width: 125px;
}`;
let div = document.createElement("div");
let pageurl = window.location.href.split("?")[0];
if(pageurl=="https://utest.ulearning.cn/"){
div.setAttribute("style", "background-color: #4fc8db; position: fixed; top: 54px; right: 300px; width: 270px; opacity: 0.75; border-style: dotted; border-width: 3px;");
}
else{
div.setAttribute("style", "background-color: #4fc8db; position: fixed; top: 54px; left: 50px; width: 270px; opacity: 0.75; border-style: dotted; border-width: 3px;");
}
div.innerHTML = `
Ulearning 查题
|
|
服务器状态:
|
获取中..
|
`;
document.body.appendChild(style);
document.body.appendChild(div);
Bind();
div.addEventListener("mousedown", function (e) {
set.Dealagging = true;
let mer = div.getBoundingClientRect();
set.left = e.clientX - mer.left;
set.top = e.clientY - mer.top;
});
div.addEventListener("mouseup", function () {
set.Dealagging = false;
});
div.addEventListener("mousemove", function (e) {
if (set.Dealagging) {
let x = e.clientX - set.left;
let y = e.clientY - set.top;
div.style.left = x + "px";
div.style.top = y + "px";
}
});
}
function Bind() {
let get_answer = document.querySelector("#get_answer");
get_answer && (function () {
get_answer.addEventListener("click", Get_Answer, false);
})();
let hide_show = document.querySelector("#hide_show");
hide_show && (function () {
hide_show.addEventListener("click", function () {
let answer_key = document.querySelector("#answer_key");
answer_key && (function () {
answer_key.getAttribute("style") === "display: block;" && (function () {
answer_key.setAttribute("style", "display: none;");
return true;
})() || (function () {
answer_key.setAttribute("style", "display: block;");
})();
})();
}, false);
})();
}
function Set_Heart() {
setInterval(Heart, 20000);
}
function Heart() {
let server_status = document.querySelector("#server_status");
if (server_status) {
set.timestamp = new Date().getTime();
Util.get(set.heartbeat, { token: "" + set.token, timestamp: "" + set.timestamp }, function (xhr) {
try {
let xhr_json = JSON.parse(xhr.responseText);
if (xhr_json.code == 1) {
server_status.innerText = "正常";
return;
}
}
catch (e) { }
server_status.innerText = "异常";
}, function () {
server_status.innerText = "异常";
});
}
}
function Clear_Table() {
let answer_table = document.querySelector("#answer_table");
answer_table && (function () {
while (answer_table.rows.length > 1) {
answer_table.deleteRow(1);
}
})();
}
function Get_Answer() {
Clear_Table();
let question_area = document.querySelectorAll(".question-area");
question_area && (function(){
question_area.forEach(function (item) {
item.childNodes.forEach(function (div) {
if (div.className.indexOf("next-part") != -1) {
return;
}
switch (div.className) {
case "question-item":
way1(div);
break;
default:
way2(div);
}
});
});
})();
let question_wrap = document.querySelectorAll("#questionWrap");
question_area && (function(){
question_wrap.forEach(function (item) {
item.childNodes.forEach(function (div){
switch (div.className) {
case "multiple-choices":
case "judge":
case "fill":
case "match":
case "sort":
way3(div);
break;
case "blankFill":
case "cloze":
default:
way2(div);
}
});
});
})();
}
function way3(div) {
let index = div.querySelector(".position-rltv").firstChild.innerText;
let title = div.querySelector(".position-rltv").lastChild;
let title_text = title && title.innerText || "";
let answer_table = document.querySelector("#answer_table");
answer_table && (function () {
let tr = answer_table.insertRow();
let t = tr.insertCell();
t.innerText = "【" + index.split(".")[0] + "】" + title_text;
t.addEventListener("click", function () {
GM_setClipboard(this.innerText);
}, false);
t = tr.insertCell();
Util.get_answer(title_text, t);
})();
}
function way2(div) {
// 英语答题类 待提供测试账号开发
// 英语答题类 待提供测试账号开发
// 英语答题类 待提供测试账号开发
}
function way1(div) {
let qid = div.firstChild.__vue__.question.questionid;
if (!qid) {
return;
}
let index = div.firstChild.__vue__.question.index;
let title = div.firstChild.__vue__.question.title;
let quetype = div.firstChild.__vue__.question.type;
let quetxt = "";
let cho = div.firstChild.__vue__.question.choices;
if(quetype==1||quetype==2){
cho.forEach(function(item){quetxt+=item.text+"||";})
quetxt = re_text(quetxt);
}
let answer_table = document.querySelector("#answer_table");
answer_table && (function () {
let tr = answer_table.insertRow();
let t = tr.insertCell();
t.innerText = "【" + index + "】" + title;
t.addEventListener("click", function () {
GM_setClipboard(this.innerText);
}, false);
t = tr.insertCell();
let getcode = Util.get_answer(title, t);
if(getcode==0){
Util.upload_title(title, quetype, quetxt);
}
})();
}
function re_text(text) {
text = text.replace(/<\/?.+?\/?>/g,'');
text = text.replace(/\t/g, "");
text = text.replace(/\n/g, "");
text = text.replace(/\r/g, "");
text = text.replace(/&.*?;/g, "");
return $.trim(text.substr(0,text.length-2));
}
function sleep(d){
for(var t = Date.now();Date.now() - t <= d;);
}
class Deal {
constructor() {
this.text = "";
this.data = [];
}
append(k, v) {
this.data.push(encodeURIComponent(k) + "=" + encodeURIComponent(v));
this.text = this.data.join("&").replace(/%20/g, "+");
}
}