Greasy Fork is available in English.
学企来砍一刀
当前为
// ==UserScript==
// @name 遇见八三的心动瞬间
// @namespace
// @version 1.2
// @description 学企来砍一刀
// @author 我纯f5捏
// @match https://www.cscec83.cn/user/login*
// @match http://120.27.194.253/*
// @match https://learn.cscec83.cn/*
// @exclude https://www.cscec83.cn/dashboard/analysis*
// @compatible edge
// @license
// @icon https://s11.ax1x.com/2023/12/30/piOtPX9.jpg
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @require https://cdn.jsdelivr.net/npm/tesseract.js@5/dist/tesseract.min.js
// @require https://update.greasyfork.icu/scripts/447483/1071404/Boxjs.js
// @require https://update.greasyfork.icu/scripts/482886/1300084/ZJEngineerBank.js
// @require https://update.greasyfork.icu/scripts/482872/1299971/%E4%B8%AD%E5%BB%BA%E5%AD%A6%E4%BC%81%E6%9D%A5%E5%85%A8%E9%A2%98%E5%BA%93part1.js
// @require https://update.greasyfork.icu/scripts/482873/1299972/%E4%B8%AD%E5%BB%BA%E5%AD%A6%E4%BC%81%E6%9D%A5%E5%85%A8%E9%A2%98%E5%BA%93part2.js
// @require https://update.greasyfork.icu/scripts/482874/1299974/%E4%B8%AD%E5%BB%BA%E5%AD%A6%E4%BC%81%E6%9D%A5%E5%85%A8%E9%A2%98%E5%BA%93part3.js
// @require https://update.greasyfork.icu/scripts/482875/1299975/%E4%B8%AD%E5%BB%BA%E5%AD%A6%E4%BC%81%E6%9D%A5%E5%85%A8%E9%A2%98%E5%BA%93part4.js
// @require https://update.greasyfork.icu/scripts/482876/1299976/%E4%B8%AD%E5%BB%BA%E5%AD%A6%E4%BC%81%E6%9D%A5%E5%85%A8%E9%A2%98%E5%BA%93part5.js
// @require https://update.greasyfork.icu/scripts/482877/1299978/%E4%B8%AD%E5%BB%BA%E5%AD%A6%E4%BC%81%E6%9D%A5%E5%85%A8%E9%A2%98%E5%BA%93part6.js
// @require https://update.greasyfork.icu/scripts/483542/1304640/gk%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%B8%80%E8%A6%A7.js
// ==/UserScript==
/*
***********************************************************
以上参数为脚本必须读取的脚本元属性值,请勿随意改动
以下参数修改请参见语雀功能文档或者代码注释定制化修改
***********************************************************
*/
(function () {
'use strict';
var oldStudyAdminRevise = true; // 控制学企来首页修改, true 为刷新; false 为不刷;
var cscecAdminCount = true; // 控制主页刷新次数, true 为刷新; false 为不刷新;
var rootFontSize = 46.6667; // 页面如果大小显示异常, 可尝试修改, 请勿随意变动此数值;
var clickNextPage = true; // 旧版学企来部门中心默认进入第二页, false 则不翻页;
var answerTimeGap = 400; // 一键做题操作间隔, 太快页面来不及响应, 太慢影响使用, 单位:ms;
var loginCheck = 500; // 输入验证码后登录的间隔, 太快无法响应, 太慢影响使用, 单位:ms;
var monitorGap = 400; // 控制url监控间隔, 太快会影响性能, 太慢影响使用, 单位:ms;
/*
***********************************************************
以下参数为功能必须的参数初始化或功能预留,请勿随意改动
***********************************************************
*/
try {
var AllQA = AllQA1.concat(AllQA2, AllQA3, AllQA4, AllQA5, AllQA6);
console.log("全题库共 " + AllQA.length + " 道题目");
} catch (error) {
console.log("全题库合并失败");
}
var rightArr = ["正确", "对", "✓", "√", "A", "a", "是"];
var wrongArr = ["错误", "错", "×", "x", "B", "b", "否"];
var questionAnswerTexts = ""; // 防止答案混淆,目前考试无答案混淆,只做预防
var questionAnswerText = "";
var clickMyPractice = true;
var questionTypeText = "";
var isDraggable = false;
var titleMsgAlert = "";
var innerMsgAlert = "";
var currentUser = "";
var userRemind = "";
var currentUrl = "";
var a = "";
var b = "";
var C = "";
var d = "";
var oldPracticeData = [];
var practiceData = [];
var savedData = [];
overrideOpen();
setMouseImg();
setTipsImg();
webPageWatchUrl(urlOperate);
window.onload = function () {
addDiv();
changeByClick();
var tipsCard = document.getElementById("tipsCard");
tipsCard.addEventListener('mouseover', displayTipsImg);
tipsCard.addEventListener('mouseout', vanishTipsImg);
tipsCard.addEventListener('mousemove', displayTipsImg);
document.addEventListener('mousemove', mouseImgMove);
document.querySelectorAll(".getQAOption")[0].addEventListener('click', getabAndToast);
document.querySelectorAll(".option2")[0].addEventListener('click', function () {
if (getab()) {
switch (verifyUrl()) {
case 1:
answerQuestion();
break;
case 2:
answerOldQuestion();
break;
default:
getabAndToast();
break;
}
} else {
}
});
// 一键答题
document.querySelectorAll(".option3")[0].addEventListener('click', function () {
if (getab()) { autoAnswerQuestion(); } else { getabAndToast(); }
});
document.querySelectorAll(".option7")[0].addEventListener('click', fillVerificationCode);
}
function answerOldQuestion() {
var titleName = document.querySelector(".title");
if (titleName) {
if (titleName.innerText === "每日一练" || titleName.innerText === "闯关练习") {
var elements = document.getElementsByClassName("issus-item-title-text");
try { var trimmedText = trimText(elements[0].innerText); } catch (error) { }
let questionAnswerBankIndex = AllQA.findIndex(function (item) {
return trimText(item.question) == trimmedText;
});
if (questionAnswerBankIndex !== -1 && getab()) {
let questionType = getType(questionAnswerBankIndex);
if (questionType.includes("单选")) {
let answerSpans = Array.prototype.slice.call(document.querySelectorAll(".issus-item-answer-radio-label"));
let answerArray = convertToNumbers(convertAnswerToArray(questionAnswerBankIndex));
answerSpans[answerArray[0] - 1].click();
} else if (questionType.includes("判断")) {
var judgeStr = getAnswer(questionAnswerBankIndex).match(/(正确)|(错误)|[对错✓√×xABab]/g);
try {
let judgeStrClick = 'input[class="el-radio__original"][value=' + judgeStr + ']';
document.querySelector(judgeStrClick).click();
} catch (error) {
if (rightArr.includes(judgeStr[0])) {
for (let i = 0; i < rightArr.length; i++) {
try {
var judgeStrClick = 'input[class="el-radio__original"][value=' + rightArr[i] + ']';
document.querySelector(judgeStrClick).click();
break;
} catch (error) { }
}
}
if (wrongArr.includes(judgeStr[0])) {
for (let i = 0; i < wrongArr.length; i++) {
try {
var judgeStrClick = 'input[class="el-radio__original"][value=' + wrongArr[i] + ']';
document.querySelector(judgeStrClick).click();
break;
} catch (error) { }
}
}
}
} else if (questionType.includes("多选")) {
let answerSpans = Array.prototype.slice.call(document.querySelectorAll('span.el-checkbox__input'));
let arr = convertToNumbers(convertAnswerToArray(questionAnswerBankIndex));
for (var i = 0; i < arr.length; i++) {
// 因为页面异步动画影响,直接点击会无法处理
(function (i) {
requestAnimationFrame(function () {
answerSpans[arr[i] - 1].click();
});
})(i);
}
}
} else {
toast("未找到答案", "题库无此题,请及时记录维护题库或 Ctrl+S 保存页面", 2e3);
}
try {
let parentElement = document.querySelector('div[class="btn-content"]');
let element = parentElement.querySelector('.el-button.fr.el-button--primary.el-button--mini');
if (element === undefined || element === null) {
clickSpanContainingText('结束练习');
} else {
element.click();
}
} catch (error) {
console.log("尝试确定失败");
}
} else if (titleName.innerText === "成绩结果") {
if (document.querySelector(".upper-limit-tips") && document.querySelector(".upper-limit-tips").innerText.includes("积分已达到上限")) {
// 返回
setTimeout(function () {
document.querySelector(".back").childNodes[0].click();
}, 100);
toast("完成", "此练习分数已满,请选择下一项练习。", 2e3);
} else {
// 再来一组
document.querySelector(".back").childNodes[2].click();
toast("未完成", "此练习分数未满,请继续答题。", 2e3);
}
} else {
toast("此页面未配置本功能", "不在指定界面;请进入指定界面或关闭此脚本!", 2e3);
}
} else {
toast("此页面未配置本功能", "不在指定界面;请进入指定界面或关闭此脚本!", 2e3);
}
}
function verifyUrl() {
if (window.location.href.includes('https://learn.cscec83.cn/')) {
return 1;
} else if (window.location.href.includes('http://120.27.194.253/')) {
return 2;
} else {
return false;
}
}
function getAnswer(questionAnswerBankIndex) {
return AllQA[questionAnswerBankIndex].answer; // 通过传入问题的索引来获取答案
}
function getType(questionAnswerBankIndex) {
return AllQA[questionAnswerBankIndex].type;
}
function getQuestion(questionAnswerBankIndex) {
return AllQA[questionAnswerBankIndex].question;
}
function convertAnswerToArray(questionAnswerBankIndex) {
let answerArray = getAnswer(questionAnswerBankIndex).match(/[A-Za-z]/g).map(function (val) {
return val.toLowerCase();
});
return answerArray;
}
// 数组中字母转换为数字
function convertToNumbers(arr) {
return arr.map(function (letter) {
var num = letter.charCodeAt(0) - 'a'.charCodeAt(0) + 1;
return num;
});
}
// 点击页面具有某个文本的span
function clickSpanContainingText(text) {
var spans = document.getElementsByTagName('span');
for (var i = 0; i < spans.length; i++) {
if (spans[i].textContent === text) {
spans[i].click();
break;
}
}
}
function reviseRem() {
var root = document.documentElement;
var currentSize = parseFloat(window.getComputedStyle(root).fontSize);
if (currentSize !== rootFontSize) {
// root.style.fontSize = `${currentSize * 4}px`;
root.style.fontSize = rootFontSize + "px"
}
}
function webPageWatchUrl(watchCallback) {
watchCallback();
var currentUrl = window.location.href;
setInterval(function () {
if (currentUrl !== window.location.href) {
currentUrl = window.location.href;
watchCallback(currentUrl);
}
}, monitorGap);
}
function urlOperate(url) {
reviseRem();
currentUrl = window.location.href;
if (currentUrl.includes('https://www.cscec83.cn/dashboard/analysis') && cscecAdminCount) {
location.reload();
cscecAdminCount = false;
};
if ((currentUrl === ('http://120.27.194.253/') || currentUrl === ('http://120.27.194.253/index')) && oldStudyAdminRevise) {
try {
let targetElement = document.querySelectorAll(".nav_item")[0];
targetElement.innerText = "科技质量";
targetElement.style.color = 'red';
targetElement.style.fontWeight = 'bold';
targetElement.parentNode.setAttribute("href", "/org/pgdJgz");
oldStudyAdminRevise = false;
} catch (error) {
console.log("old学企来首页科技质量修改失败");
}
}
if (currentUrl == 'http://120.27.194.253/org') {
setApartmentCSS();
if (clickNextPage) {
// 进入第二页
try {
document.querySelector("#app > div > div.content > div.pagination.el-pagination.is-background > button.btn-next").click();
clickNextPage = false;
} catch (error) {
console.log("自动点击'我的'失败");
};
};
let departmentElement = document.querySelectorAll(".mechanism_item > .mechanism_item_title");
for (let i = 0; i < departmentElement.length; i++) {
let targetElement = departmentElement[i];
if (targetElement.innerText == '科技质量部') {
targetElement.style.color = 'red';
targetElement.style.fontWeight = 'bold';
};
};
};
if (currentUrl.match(new RegExp('http://120.27.194.253/org/[a-zA-Z]{6}$')) !== null) {
try {
if (clickMyPractice) {
document.querySelector("#tab-my").click();
document.querySelector(".goods_type_list").childNodes[1].click();
clickMyPractice = false;
}
} catch (error) { clickMyPractice = false; };
}
};
function fillVerificationCode() {
if (window.location.href.includes('https://www.cscec83.cn/user/login')) {
var imgSrc = document.querySelectorAll("img")[4].src;
var image = new Image();
image.src = imgSrc;
const { createWorker } = Tesseract;
(async () => {
const worker = await createWorker('eng');
const { data: { text } } = await worker.recognize(image);
var inputElement = document.getElementById("inputCode");
inputElement.value = text;
// 创建并触发 input 事件
var event = new Event('input', {
bubbles: true,
cancelable: true,
});
inputElement.dispatchEvent(event);
})();
setTimeout(function () {
document.querySelector(".login-button").click();
}, loginCheck);
} else {
toast("此页面未配置本功能", "填写验证码", 2e3);
return false;
}
}
// 移动
function handleMouseDown(event) {
isDraggable = true;
var handleMoveDiv = document.getElementById("mainDiv");
var offsetX = event.clientX - handleMoveDiv.getBoundingClientRect().left;
var offsetY = event.clientY - handleMoveDiv.getBoundingClientRect().top;
// 阻止默认行为和冒泡
event.preventDefault();
event.stopPropagation();
document.addEventListener('mousemove', handleWindowMouseMove);
document.addEventListener('mouseup', handleWindowMouseUp);
function handleWindowMouseMove(event) {
if (isDraggable) {
requestAnimationFrame(() => {
handleMoveDiv.style.left = event.clientX - offsetX + 'px';
handleMoveDiv.style.top = event.clientY - offsetY + 'px';
window.getSelection().empty();
});
}
}
function handleWindowMouseUp() {
isDraggable = false;
document.removeEventListener('mousemove', handleWindowMouseMove);
document.removeEventListener('mouseup', handleWindowMouseUp);
}
}
// 给所有的可选按钮增加点击事件
function changeByClick() {
document.getElementById('movedCard').addEventListener('mousedown', handleMouseDown);
// 给所有的图片增加点击事件(除了含有speedChoose类的)
let images = document.querySelectorAll('.clickable-image');
images.forEach(image => {
// 检查图片是否包含speedChoose类,如果不包含则添加点击事件
if (!image.classList.contains('speedChoose')) {
image.addEventListener('click', function () {
this.classList.toggle('clicked');
});
}
});
// 按钮点击互斥
var speedChooses = document.querySelectorAll('.speedChoose');
speedChooses.forEach(function (box) {
box.addEventListener('click', function () {
// 如果当前按钮已经是点击状态,则取消点击状态,否则激活点击状态
if (box.classList.contains('clicked')) {
box.classList.remove('clicked');
} else {
// 点击任何一个box时,移除所有box的clicked类
speedChooses.forEach(function (otherBox) {
otherBox.classList.remove('clicked');
});
box.classList.add('clicked');
}
});
});
}
function overrideOpen() {
var open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function () {
var self = this;
this.addEventListener('load', function () {
var data = self.responseText;
var isProfileData = (data.includes('userName') && data.includes('nickName') && data.includes('postGroup'));
var isPracticeData = data.includes('testPaperTopics');
var isOldPracticeData = data.includes('loginName') && data.includes('nickname') && data.includes('userNo');
if (isProfileData || isPracticeData || isOldPracticeData) {
if (isProfileData) {
var profileData = profileData || [];
if (!Array.isArray(profileData)) {
profileData = [];
}
profileData = JSON.parse(data);
handleProfileData(profileData);
}
if (isPracticeData) {
practiceData = practiceData || [];
if (!Array.isArray(practiceData)) {
practiceData = [];
}
practiceData.push(JSON.parse(data));
handlePracticeData(practiceData);
}
if (isOldPracticeData) {
oldPracticeData = oldPracticeData || [];
if (!Array.isArray(oldPracticeData)) {
oldPracticeData = [];
}
oldPracticeData.push(JSON.parse(data));
handleOldPracticeData(oldPracticeData);
}
}
});
open.apply(this, arguments);
};
}
function handlePracticeData(practiceData) {
return new Promise(function (resolve) {
var targetArray = practiceData.find(function (response) {
return response.msg === "操作成功" && response.code === 200 && response.data.testPaperTopics;
});
if (targetArray) {
let formattedData = outputPracticeTopics(targetArray.data);
savedData = formattedData.slice();
} else {
console.log('脚本未找到符合条件的题库信息');
}
practiceData.length = 0;
resolve();
});
}
function handleProfileData(profileData) {
return new Promise(function (resolve) {
var targetArray = Object.values(profileData).find(function (response) {
return typeof response === 'object' && response !== null;
});
if (targetArray) {
let result = {
userName: targetArray.userName,
nickName: targetArray.nickName,
};
let formattedData = outputProfileDataTopics(JSON.stringify(result));
currentUser = formattedData;
titleMsgAlert = currentUser.userName + " " + currentUser.nickName;
} else {
console.log("脚本未找到符合条件的个人信息");
}
targetArray = [];
resolve();
});
}
function handleOldPracticeData(oldPracticeData) {
return new Promise(function (resolve) {
var targetArray = oldPracticeData.find(function (response) {
return response.code === 200 && response !== null;
});
if (targetArray) {
let result = {
"userName": targetArray.data.loginName,
"nickName": targetArray.data.nickname,
};
currentUser = result;
titleMsgAlert = result.userName + " " + result.nickName;
} else {
console.log("脚本未找到符合条件的个人信息");
}
targetArray = [];
resolve();
});
}
function answerQuestion() {
var isQuestionFound = savedData.some((questionObject) => {
return trimText(questionObject.question) == trimText(document.querySelectorAll(".el-card__body")[1].childNodes[2].innerText);
});
if (isQuestionFound && getab()) {
var answerList = [];
let questionNumber = getQANumber();
for (let i = 0; i < savedData.length; i++) {
let answerArray = savedData[i].TrueAnswer.split(',');
let numericArray = answerArray.map(function (letter) {
// 多减 1 个 1, 后面处理点击次序时方便
return letter.charCodeAt(0) - 65;
});
answerList.push(numericArray);
}
try {
if (answerList[questionNumber - 1].length == 1) {
var targetAnswerElement = document.querySelectorAll(".el-radio-group")[0].childNodes[answerList[questionNumber - 1][0]];
if (targetAnswerElement && !targetAnswerElement.classList.contains('is-checked')) {
targetAnswerElement.click();
console.log("题号 " + questionNumber + " 点选: " + String.fromCharCode((answerList[questionNumber - 1][0] + 1) + 64));
} else {
console.log("用户选择过");
}
} else if (answerList[questionNumber - 1].length > 1) {
for (let i = 0; i < answerList[questionNumber - 1].length; i++) {
(function (i) {
requestAnimationFrame(function () {
var targetAnswerElement = document.querySelectorAll(".el-checkbox-group")[0].childNodes[answerList[questionNumber - 1][i]];
if (targetAnswerElement && !targetAnswerElement.classList.contains('is-checked')) {
targetAnswerElement.click();
console.log("题号 " + questionNumber + " 点击选项: " + String.fromCharCode((answerList[questionNumber - 1][i] + 1) + 64));
} else {
console.log("用户选择过了");
}
});
})(i);
}
} else {
toast("提醒", "不在可答题的页面", 1e3);
}
} catch (error) {
console.log("异常错误");
}
}
else {
toast("提醒", "尝试检查权限与操作", 2e3);
}
}
function autoAnswerQuestion() {
if (getab()) {
if (savedData.length == 0) {
toast("仅支持新版学企来", "未进入答题界面或未劫持到数据", 2e3);
} else {
for (let i = getQANumber() - 1; i < savedData.length; i++) {
try {
setTimeout(function () {
answerQuestion();
}, answerTimeGap * i);
} catch (error) {
toast("提醒", "请正常手动答题或重新进入", 2e3);
}
try {
setTimeout(function () {
document.querySelectorAll(".el-button")[0].click();
}, answerTimeGap * (i + 1 / 2));
} catch (error) {
toast("提醒", "不在指定页面", 2e3);
}
if (i == savedData.length - 1) {
toast("完成", "所有题目已完成", 2e3);
}
}
}
} else {
toast("权限提醒", "请联系管理员添加权限", 2e3);
}
}
function getab() {
if (verifyUrl()) {
try {
var a = userList.some(function (user) {
if (user.userName === currentUser.userName && user.nickName === currentUser.nickName) {
return true;
} else {
return false;
}
});
} catch (error) {
a = false;
b = false;
toast("提醒", "请从公司页面正常渠道进入", 1e3);
return (a && b);
}
if (a) {
try {
var userName = userList.find(u => u.userName === currentUser.userName);
var userTime = userName ? userName.time : null;
} catch (error) {
console.log("时长获取错误。");
return (a && b);
}
innerMsgAlert = "";
innerMsgAlert = verifyTime(userTime) ? verifyTime(userTime) : " 权限过期 请联系重新授权。";
return (a && verifyTime(userTime));
} else {
innerMsgAlert = "";
for (let i = 0; i < failStringArray.length; i++) {
innerMsgAlert += String.fromCharCode(failStringArray[i]);
}
return (a && b);
}
} else if (window.location.href.includes('http://120.27.194.253/')) {
a = false;
b = false;
titleMsgAlert = "查 询 失 败";
innerMsgAlert = " 请进入学企来后使用";
return (a && b);
}
else {
a = false;
b = false;
titleMsgAlert = "查 询 失 败";
innerMsgAlert = " 请进入学企来后使用";
return (a && b);
}
}
function getabAndToast() {
getab();
waitToast(titleMsgAlert, innerMsgAlert, a);
}
function waitToast(titleText, innerText, logText) {
let CustomBox = Box.mixin({
customFunction: function () {
console.log(logText);
},
});
let customBoxInstance = new CustomBox({
title: titleText,
text: innerText,
});
try {
customBoxInstance.customFunction();
} catch (error) {
console.log("toast 库 error");
}
}
function toast(title, innerText, time) {
let Toast = Box.mixin({
title: title,
toast: true,
time: time,
});
new Toast({ text: innerText });
}
})();