您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
一次性快速完成沈阳理工大学方正教务系统的教师评价,由Cursor编写。分数默认为6-8分,如果需要其他分数请自行修改代码。
// ==UserScript== // @name 沈阳理工大学方正教务快速评教脚本2025 // @namespace https://github.com/Dark-Li/SYLU_JiaoshiPingjia // @version 0.1 // @description 一次性快速完成沈阳理工大学方正教务系统的教师评价,由Cursor编写。分数默认为6-8分,如果需要其他分数请自行修改代码。 // @author Ender_Li // @match *://jxw.sylu.edu.cn/xspjgl/xspj_cxXspjIndex.html* // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; // 添加控制面板 const panel = document.createElement('div'); panel.innerHTML = ` <div style="position: fixed; top: 10px; right: 10px; background: #fff; padding: 10px; border: 1px solid #ccc; z-index: 9999;"> <button id="quickRate">一键评教</button> <div id="debugInfo" style="color: red;"></div> </div> `; document.body.appendChild(panel); function showDebug(message) { const debugDiv = document.getElementById('debugInfo'); if (debugDiv) { debugDiv.textContent = message; } console.log(message); } // 快速评教函数 async function quickRate() { showDebug('开始快速评教...'); // 一次性获取所有输入框 const inputs = document.querySelectorAll('input.form-control.input-sm.input-pjf'); if (inputs.length === 0) { showDebug('未找到评分输入框!'); return; } // 一次性填充所有分数 inputs.forEach(input => { const maxScore = parseInt(input.getAttribute('data-zdfz')) || 8; let score; if (maxScore === 8) { score = Math.floor(Math.random() * 3) + 6; // 6-8分 } else if (maxScore === 6) { score = Math.floor(Math.random() * 3) + 4; // 4-6分 } else { score = Math.floor(maxScore * 0.8); // 其他情况 } input.value = score; input.dispatchEvent(new Event('input', { bubbles: true })); input.dispatchEvent(new Event('change', { bubbles: true })); }); // 点击保存按钮 const saveBtn = document.querySelector('#btn_xspj_bc'); if (saveBtn) { saveBtn.click(); let firstDialogHandled = false; // 添加标记,记录第一个弹窗是否已处理 // 处理警告框和确认框 const handleDialogs = setInterval(() => { // 尝试查找并点击各种可能的确认按钮 const buttons = [ document.querySelector('#btn_ok[data-bb-handler="ok"]'), // 最后的确定按钮 document.querySelector('#btn_ok'), // 警告框的确认按钮 document.querySelector('button[data-bb-handler="confirm"]'), // 保存确认按钮 ]; for (const btn of buttons) { if (btn && btn.offsetParent !== null) { // 检查按钮是否可见 // 模拟鼠标移动到按钮上 btn.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, cancelable: true, view: window })); // 模拟鼠标按下 btn.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, button: 0 })); // 短暂延迟后模拟鼠标释放和点击 setTimeout(() => { btn.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, button: 0 })); btn.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window, button: 0 })); }, 50); // 如果这是第一个弹窗的处理 if (!firstDialogHandled) { firstDialogHandled = true; // 等待1秒后模拟鼠标点击提交按钮 setTimeout(() => { const submitBtn = document.querySelector('#btn_xspj_tj'); if (submitBtn) { // 模拟鼠标移动到按钮上 submitBtn.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, cancelable: true, view: window })); // 模拟鼠标按下 submitBtn.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, button: 0 })); // 短暂延迟后模拟鼠标释放和点击 setTimeout(() => { submitBtn.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, button: 0 })); submitBtn.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window, button: 0 })); // 等待500ms后处理提交确认按钮 setTimeout(() => { const confirmBtn = document.querySelector('#btn_confirm'); if (confirmBtn) { // 模拟鼠标移动到确认按钮上 confirmBtn.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, cancelable: true, view: window })); // 模拟鼠标按下 confirmBtn.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, button: 0 })); // 短暂延迟后模拟鼠标释放和点击 setTimeout(() => { confirmBtn.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, button: 0 })); confirmBtn.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window, button: 0 })); // 等待500ms后处理最后的确定按钮 setTimeout(() => { const okBtn = document.querySelector('#btn_ok'); if (okBtn) { // 模拟鼠标移动到确定按钮上 okBtn.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, cancelable: true, view: window })); // 模拟鼠标按下 okBtn.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, button: 0 })); // 短暂延迟后模拟鼠标释放和点击 setTimeout(() => { okBtn.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, button: 0 })); okBtn.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window, button: 0 })); // 点击确定按钮后,尝试切换到下一个教师 setTimeout(() => { // 获取所有教师行 const allTeachers = document.querySelectorAll('tr.ui-widget-content.jqgrow.ui-row-ltr'); if (allTeachers.length > 0) { // 寻找下一个未评教的教师 let nextTeacher = null; for (const teacher of allTeachers) { // 查找状态单元格 const statusCell = teacher.querySelector('td[aria-describedby="tempGrid_tjztmc"]'); if (statusCell && statusCell.getAttribute('title') === '未评') { nextTeacher = teacher; break; } } if (nextTeacher) { showDebug('切换到下一位未评教师...'); // 获取教师姓名用于调试显示 const teacherName = nextTeacher.querySelector('td[aria-describedby="tempGrid_jzgmc"]')?.textContent || '未知教师'; showDebug(`正在切换到教师:${teacherName}`); // 模拟鼠标点击下一个教师 nextTeacher.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, cancelable: true, view: window })); setTimeout(() => { nextTeacher.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, button: 0 })); setTimeout(() => { nextTeacher.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, button: 0 })); nextTeacher.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window, button: 0 })); // 清除当前的定时器 clearInterval(handleDialogs); // 等待页面加载新教师的评教表 setTimeout(() => { // 递归调用quickRate继续评教 quickRate(); }, 1000); }, 50); }, 50); } else { showDebug('所有教师评教完成!'); clearInterval(handleDialogs); } } else { showDebug('未找到教师列表!'); clearInterval(handleDialogs); } }, 1000); }, 50); } else { showDebug('未找到确定按钮!'); } }, 500); }, 50); } else { showDebug('未找到提交确认按钮!'); } }, 500); }, 50); } else { showDebug('未找到提交按钮!'); } }, 1000); } break; } } // 尝试切换到下一个教师 const nextTeacher = document.querySelector('tr.odd:not(.selected), tr:not(.selected)'); if (nextTeacher) { nextTeacher.click(); clearInterval(handleDialogs); // 找到并点击下一个教师后停止检查 } }, 200); // 每200ms检查一次 // 60秒后自动清除定时器(以防万一) setTimeout(() => { clearInterval(handleDialogs); }, 60000); } else { showDebug('未找到保存按钮!'); } } // 绑定按钮事件 window.addEventListener('load', () => { const rateButton = document.getElementById('quickRate'); if (rateButton) { rateButton.addEventListener('click', quickRate); showDebug('脚本已准备就绪'); } else { showDebug('未找到按钮!'); } }); })();