您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动处理教学评价表单提交及评估(自动连续处理版本)
// ==UserScript== // @name 教学评价自动处理脚本 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 自动处理教学评价表单提交及评估(自动连续处理版本) // @author https://github.com/overflow0verture // @match http://stu.j.tjcu.edu.cn/* // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; // 暂停状态标志 let isPaused = false; // 评教文本库 const evaluationTexts = [ "老师授课认真负责,讲解深入浅出,课堂氛围活跃", "教学内容充实,方法灵活多样,让人受益匪浅", "理论结合实践,案例丰富新颖,教学效果出色", "讲课思路清晰,重点难点突出,知识传授到位", "课堂互动频繁,学习氛围浓厚,收获很大" ]; // 创建日志显示区域 function createLogDisplay() { const logDiv = document.createElement('div'); logDiv.style.position = 'fixed'; logDiv.style.bottom = '20px'; logDiv.style.right = '20px'; logDiv.style.width = '300px'; logDiv.style.maxHeight = '200px'; logDiv.style.overflowY = 'auto'; logDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.8)'; logDiv.style.color = 'white'; logDiv.style.padding = '10px'; logDiv.style.borderRadius = '5px'; logDiv.style.fontSize = '12px'; logDiv.style.zIndex = '9999'; logDiv.id = 'evaluationLog'; document.body.appendChild(logDiv); return logDiv; } // 添加日志 function addLog(message) { const logDiv = document.getElementById('evaluationLog') || createLogDisplay(); const logEntry = document.createElement('div'); logEntry.textContent = `${new Date().toLocaleTimeString()} - ${message}`; logDiv.insertBefore(logEntry, logDiv.firstChild); console.log(message); } function getPageType() { const path = window.location.pathname; if (path.includes('/evaluation/index')) return 'list'; if (path.includes('/evaluationPage')) return 'evaluation'; return 'unknown'; } // 监听并自动点击确认按钮 // 监听并自动点击确认按钮 function autoConfirm() { return new Promise(resolve => { // 在点击提交之前就设置自动继续标记 sessionStorage.setItem('autoContinue', 'true'); const originalConfirm = layer.confirm; layer.confirm = function(content, options, callback) { if (callback && typeof callback === 'function') { setTimeout(() => { callback(true); resolve(); }, 500); } }; const submitButton = document.querySelector('#buttonSubmit'); if (submitButton) { submitButton.click(); } }); } // 提交评估并返回列表页 async function submitEvaluationAndReturn() { addLog('提交评估并准备返回列表页...'); // 确保在任何操作之前设置自动继续标记 sessionStorage.setItem('autoContinue', 'true'); await new Promise(resolve => setTimeout(resolve, 5000)); window.location.href = 'http://stu.j.tjcu.edu.cn/student/teachingEvaluation/evaluation/index'; } // 监听倒计时并在时间到时提交 function waitForSubmitTime() { return new Promise(resolve => { const checkTime = setInterval(() => { if (isPaused) return; const minutes = document.getElementById('RemainM'); const seconds = document.getElementById('RemainS'); if (minutes && seconds) { if (minutes.textContent === '0' && seconds.textContent === '0') { clearInterval(checkTime); setTimeout(() => { autoConfirm().then(() => { resolve(); }); }, 1000); } } }, 1000); }); } // 实现评估填写逻辑 async function fillEvaluation(status) { addLog('开始填写评估表...'); return new Promise(resolve => { const radioGroups = {}; const radios = document.querySelectorAll('input[type="radio"]'); radios.forEach(radio => { if (!radioGroups[radio.name]) { radioGroups[radio.name] = []; } radioGroups[radio.name].push(radio); }); Object.values(radioGroups).forEach(group => { group[0].checked = true; }); const zgpj = document.querySelector('textarea[name="zgpj"]'); if (zgpj) { zgpj.value = evaluationTexts[Math.floor(Math.random() * evaluationTexts.length)]; } const optTypeInput = document.querySelector('#optType'); if (optTypeInput) { optTypeInput.value = 'submit'; } waitForSubmitTime().then(() => { resolve(); }); }); } // 提交评估并返回列表页 async function submitEvaluationAndReturn() { addLog('提交评估并准备返回列表页...'); await new Promise(resolve => setTimeout(resolve, 5000)); // 设置自动继续标记 sessionStorage.setItem('autoContinue', 'true'); window.location.href = 'http://stu.j.tjcu.edu.cn/student/teachingEvaluation/evaluation/index'; } // 创建提交表单的函数 function submitForm(item) { const form = document.createElement('form'); form.method = 'POST'; form.action = 'http://stu.j.tjcu.edu.cn/student/teachingEvaluation/teachingEvaluation/evaluationPage'; const addField = (name, value) => { const input = document.createElement('input'); input.type = 'hidden'; input.name = name; input.value = value; form.appendChild(input); }; addField('evaluatedPeople', item.evaluatedPeople); addField('evaluatedPeopleNumber', item.id.evaluatedPeople); addField('questionnaireCode', item.id.questionnaireCoding); addField('questionnaireName', item.questionnaire.questionnaireName); addField('evaluationContentNumber', item.id.evaluationContentNumber); document.body.appendChild(form); addLog(`准备提交评价 - ${item.evaluatedPeople}...`); form.submit(); } // 处理列表页面 function handleListPage() { if (!isPaused) { const xhr = new XMLHttpRequest(); xhr.open('POST', 'http://stu.j.tjcu.edu.cn/student/teachingEvaluation/teachingEvaluation/search', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = async function() { if (xhr.status === 200) { const data = JSON.parse(xhr.responseText); const unEvaluatedItems = data.data.filter(item => item.isEvaluated === "否"); if (unEvaluatedItems.length > 0) { addLog(`发现 ${unEvaluatedItems.length} 个未评价项目,开始处理下一个`); submitForm(unEvaluatedItems[0]); } else { addLog('所有评价已处理完成!'); sessionStorage.removeItem('autoContinue'); } } }; xhr.send('optType=1&pageSize=50'); } } // 处理评估页面 async function handleEvaluationPage(status) { status.appendChild(createControlButton()); if (!isPaused) { await fillEvaluation(status); await submitEvaluationAndReturn(); } else { addLog('评价处理已暂停,等待继续...'); const waitForResume = setInterval(() => { if (!isPaused) { clearInterval(waitForResume); fillEvaluation(status).then(() => { submitEvaluationAndReturn(); }); } }, 1000); } } // 创建控制按钮 function createControlButton() { const button = document.createElement('button'); button.style.padding = '8px 16px'; button.style.backgroundColor = isPaused ? '#4CAF50' : '#f44336'; button.style.color = 'white'; button.style.border = 'none'; button.style.borderRadius = '4px'; button.style.cursor = 'pointer'; button.style.marginLeft = '10px'; button.textContent = isPaused ? '开始' : '暂停'; button.onclick = () => { isPaused = !isPaused; button.textContent = isPaused ? '开始' : '暂停'; button.style.backgroundColor = isPaused ? '#4CAF50' : '#f44336'; addLog(isPaused ? '已暂停评价处理' : '继续评价处理'); const pageType = getPageType(); if (!isPaused) { if (pageType === 'list') { handleListPage(); } else if (pageType === 'evaluation') { fillEvaluation(document.querySelector('.status')).then(() => { submitEvaluationAndReturn(); }); } } }; return button; } // 页面加载完成后执行 window.onload = async function() { const pageType = getPageType(); createLogDisplay(); // 添加状态显示 const status = document.createElement('div'); status.className = 'status'; status.style.position = 'fixed'; status.style.top = '20px'; status.style.right = '20px'; status.style.zIndex = '9999'; status.style.padding = '10px'; status.style.backgroundColor = '#4CAF50'; status.style.color = 'white'; status.style.borderRadius = '5px'; status.style.fontSize = '14px'; document.body.appendChild(status); if (pageType === 'list') { if (sessionStorage.getItem('autoContinue') === 'true') { // 如果是自动继续模式,直接继续处理下一个 addLog('继续处理下一个评价...'); status.appendChild(createControlButton()); handleListPage(); } else { // 首次启动,显示开始按钮 const startButton = document.createElement('button'); startButton.textContent = '开始处理评价'; startButton.onclick = () => { handleListPage(); status.removeChild(startButton); status.appendChild(createControlButton()); }; status.appendChild(startButton); } } else if (pageType === 'evaluation') { await handleEvaluationPage(status); } }; })();