hqu一键评教
// ==UserScript==
// @name HQU 评教脚本
// @namespace http://tampermonkey.net/
// @version 1.2.1
// @description hqu一键评教
// @author Drifter
// @match http://jwapp-hqu-edu-cn-s.w.hqu.edu.cn:8118/jwapp/sys/pjapp/*
// @match *://jwapp.hqu.edu.cn/*pjapp*
// @icon https://www.google.com/s2/favicons?sz=64&domain=hqu.edu.cn
// @grant none
// ==/UserScript==
(function () {
const CLICK_INTERVAL = 5000; // 按钮点击间隔
//#region 工具函数
/**
* 获取一个用于延时的 promise
* @param {int} ms 延时毫秒
* @returns 用于延时的 promise
*/
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function checkSingles() {
// 单选
const singles = document.querySelectorAll(".jqx-radiobutton-text"); // 获取全部单选框
let randint; // 单选偏移量
let target; // 最终点击目标
for (let i = 0; i < singles.length; i = i + 5) {
randint = Math.floor(Math.random() * 2); // 随机偏移量
target = i + randint;
singles[target].click(); // 点击单选框
}
// 单选部分完成
// 滚动到页面底部
window.scrollTo({
top: document.documentElement.scrollHeight,
behavior: "smooth",
});
}
function checkMutis() {
// 多选
const mutis = document.querySelectorAll(
'.wjtxQuestionOptionItem div[role="checkbox"]'
); // 获取全部多选框
const flags = [1, 1, 1, 1];
for (let i = 0; i < Math.floor(1 + Math.random() * 3); i++) {
randint = Math.floor(Math.random() * 4); // 随机抽选项点
if (flags[randint]) {
flags[randint] = 0;
const checkbox = mutis[randint];
if (typeof $(checkbox).jqxCheckBox === "function") {
$(checkbox).jqxCheckBox("check");
}
}
console.log(randint);
}
}
// 主观题
function fillText() {
const textareas = $("textarea.jqx-text-area-element");
textareas.each(function () {
$(this).jqxTextArea("val", "好"); // 设置值
let changeEvent = new Event("change", {
bubbles: true,
cancelable: true,
});
this.dispatchEvent(changeEvent);
});
}
/**
* 根据内容返回一个按钮
* @param {string} content 按钮内容
* @returns 按钮对象
*/
function getBtnByContent(content) {
return Array.from(document.querySelectorAll("button, a")).find(
(el) => el.textContent.trim() === content
);
}
/**
* 评教一次
*/
async function judgeOne() {
checkSingles();
checkMutis();
fillText();
getBtnByContent("提交").click();
await sleep(CLICK_INTERVAL);
getBtnByContent("确认").click();
}
async function judgeAll() {
while (getBtnByContent("立刻评教")) {
getBtnByContent("立刻评教").click();
await sleep(CLICK_INTERVAL);
await judgeOne();
await sleep(CLICK_INTERVAL);
}
}
//#endregion
// 创建一个可拖动的控制面板
function createControlPanel() {
// 创建控制面板div
const panel = document.createElement("div");
panel.id = "control-panel";
panel.style.cssText = `
position: fixed;
top: 20px;
left: 20px;
background-color: rgba(255, 255, 255, 0.7);
border-radius: 5px;
width: 250px;
padding: 0;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
z-index: 10000;
`;
// 创建拖动区域
const dragHandle = document.createElement("div");
dragHandle.style.cssText = `
background-color: #4a4a4a;
color: white;
padding: 8px 12px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
font-weight: bold;
cursor: move;
user-select: none;
display: flex;
justify-content: space-between;
align-items: center;
`;
dragHandle.innerHTML = "<span>锐评连接 trashbin, 发誓要变 211</span>";
// 创建按钮容器
const buttonContainer = document.createElement("div");
buttonContainer.style.cssText = `
display: flex;
flex-direction: column;
gap: 10px;
padding: 15px;
`;
// 创建judgeALL按钮
const judgeAllBtn = document.createElement("button");
judgeAllBtn.textContent = "自动评价所有课程";
judgeAllBtn.style.cssText = `
padding: 10px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.2s;
`;
judgeAllBtn.addEventListener("mouseover", () => {
judgeAllBtn.style.backgroundColor = "#3e8e41";
});
judgeAllBtn.addEventListener("mouseout", () => {
judgeAllBtn.style.backgroundColor = "#4CAF50";
});
judgeAllBtn.addEventListener("click", judgeAll);
// 创建judgeOne按钮
const judgeOneBtn = document.createElement("button");
judgeOneBtn.textContent = "评价当前课程";
judgeOneBtn.style.cssText = `
padding: 10px;
background-color: #2196F3;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.2s;
`;
judgeOneBtn.addEventListener("mouseover", () => {
judgeOneBtn.style.backgroundColor = "#0b7dda";
});
judgeOneBtn.addEventListener("mouseout", () => {
judgeOneBtn.style.backgroundColor = "#2196F3";
});
judgeOneBtn.addEventListener("click", judgeOne);
// 添加按钮到容器
buttonContainer.appendChild(judgeAllBtn);
buttonContainer.appendChild(judgeOneBtn);
// 添加拖动区域和按钮容器到面板
panel.appendChild(dragHandle);
panel.appendChild(buttonContainer);
// 添加面板到页面
document.body.appendChild(panel);
// 实现拖动功能(只针对拖动区域)
makeDraggable(panel, dragHandle);
}
// 实现元素可拖动
function makeDraggable(element, dragHandle) {
let pos1 = 0,
pos2 = 0,
pos3 = 0,
pos4 = 0;
dragHandle.onmousedown = dragMouseDown;
function dragMouseDown(e) {
e = e || window.event;
e.preventDefault();
// 获取鼠标初始位置
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
// 鼠标移动时调用elementDrag函数
document.onmousemove = elementDrag;
}
function elementDrag(e) {
e = e || window.event;
e.preventDefault();
// 计算新位置
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
// 设置元素的新位置
element.style.top = element.offsetTop - pos2 + "px";
element.style.left = element.offsetLeft - pos1 + "px";
}
function closeDragElement() {
// 停止移动
document.onmouseup = null;
document.onmousemove = null;
}
}
// 初始化控制面板
function initControlPanel() {
// 等待页面加载完成
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", createControlPanel);
} else {
createControlPanel();
}
}
// 调用初始化函数
initControlPanel();
})();