前言每学期期末学校都要求学生完成教务系统教师评教课程多的时候逐个点击单选框、手动输入评价文字十分耗费时间。 网上很多自动化脚本要么直接一键提交、全部给满分容易被教务后台识别异常操作要么逻辑简陋没有模拟人类操作行为存在风控拦截问题。本文分享一款简化半自动评教 JS 代码核心特点纯原生 JavaScript无需插件、无需后端浏览器控制台直接运行模拟真人操作随机页面滚动、操作间隔延时、不全部满分70% 优 30% 良随机分配区分两种评语框自动填充严格匹配系统字数限制无自动提交逻辑全部填完后手动检查再提交安全可控代码分层清晰注释完整便于二次修改适配各校正方教务页面。重要前置声明本脚本仅用于前端技术学习、DOM 表单自动化逻辑演示仅作为减轻重复操作的辅助工具所有评价内容最终由本人审核确认后手动提交请勿滥用批量刷评遵守学校教务管理规定。一、脚本整体设计思路整体采用 IIFE 自执行函数隔离全局变量异步 async 流程分步执行完整模拟人操作页面的完整流程预置评语库区分教师简短评价、课程综合长评两套文本延时工具函数生成随机毫秒间隔消除机器统一操作速度特征页面滚动模拟随机滑动页面模仿人浏览页面行为单选框分组逻辑按表单 name 归类评价项随机分配优 / 良强制不会全优文本框自动填值通过 placeholder、name 区分不同评语输入框自动截断 / 补全至规定字数触发 input 事件让系统识别输入分步异步执行滚动→选评价→再次滚动→填评语每一步添加随机等待仅填充不提交脚本仅完成表单数据录入无自动提交接口调用降低风控风险。二、完整源码你提供的代码带代码块标识javascript// // 模拟真人评教 - 简化版不自动提交仅选择和填写 // (function() { use strict; console.log( 开始模拟真人评教仅选择和填写不提交...); // // 1. 随机生成评语库 // const teacherComments [ 老师教学认真负责讲解清晰, 课程内容充实老师授课生动有趣, 老师备课充分知识点讲解透彻, 教学方法灵活课堂氛围活跃, 老师专业知识扎实课程安排合理, 老师耐心解答问题教学效果好, 课堂互动良好学习氛围浓厚, 老师治学严谨为人师表, 教学内容丰富理论联系实际, 老师讲课有条理重点突出 ]; const generalComments [ 通过本课程学习掌握了扎实的专业知识实践能力得到提升。老师教学态度认真课堂氛围活跃受益匪浅。, 课程内容丰富老师讲解清晰易懂理论与实践结合紧密对专业学习有很大帮助。, 老师教学水平高课堂生动有趣能够激发学习兴趣课程安排合理收获颇丰。, 老师认真负责授课方式灵活多样注重学生能力培养课堂效果好学习氛围浓厚。, 课程内容充实老师专业知识扎实讲解透彻能够结合实际案例学习效果显著。 ]; // // 2. 随机延迟函数模拟人类操作间隔 // function randomDelay(min, max) { return new Promise(resolve setTimeout(resolve, Math.random() * (max - min) min)); } // // 3. 模拟滚动 // function simulateScroll() { let scrollY Math.random() * 300 100; window.scrollBy({ top: scrollY, behavior: smooth }); console.log( 滚动 ${Math.round(scrollY)}px); } // // 4. 选择评价选项优/良随机 // function selectOptions() { let radioGroups {}; let radios document.querySelectorAll(input[typeradio]); // 按name分组 for (let radio of radios) { let name radio.name; if (name (name.includes(555CF) || name.includes(pj))) { if (!radioGroups[name]) radioGroups[name] []; radioGroups[name].push(radio); } } let groupNames Object.keys(radioGroups); console.log( 找到 ${groupNames.length} 个评价组); let selectedCount 0; let youCount 0; let liangCount 0; for (let name of groupNames) { let group radioGroups[name]; if (group.length 2) continue; // 随机选择70%概率选优30%概率选良 let isYou Math.random() 0.7; // 但不要全部选优保证至少有2-3个选良 if (selectedCount groupNames.length - 2 youCount groupNames.length * 0.5) { isYou Math.random() 0.3; } let targetIndex isYou ? 0 : 1; let targetRadio group[targetIndex]; if (targetRadio !targetRadio.checked) { targetRadio.click(); selectedCount; if (isYou) { youCount; console.log( ✅ 第${selectedCount}项: 优); } else { liangCount; console.log( ✅ 第${selectedCount}项: 良); } } // 随机延迟 0.3-0.8秒 let delay Math.random() * 500 300; // 注意这里不能直接用await需要配合async函数 } console.log( 选择完成: 优 ${youCount} 项, 良 ${liangCount} 项); return { youCount, liangCount, total: selectedCount }; } // // 5. 填写评语模拟打字 // function fillComments() { let textareas document.querySelectorAll(textarea); let filledCount 0; for (let textarea of textareas) { let placeholder textarea.placeholder || ; let name textarea.name || ; // 教师评价10-50字 if (placeholder.includes(10) placeholder.includes(50)) { let comment teacherComments[Math.floor(Math.random() * teacherComments.length)]; // 确保10-50字 while (comment.length 10) { comment 教学效果好; } if (comment.length 50) { comment comment.substring(0, 47) ...; } textarea.value comment; textarea.dispatchEvent(new Event(input, { bubbles: true })); filledCount; console.log( 教师评价: ${comment}); continue; } // 评语20-200字 if (placeholder.includes(评语) || placeholder.includes(意见) || name py) { let comment generalComments[Math.floor(Math.random() * generalComments.length)]; // 确保20-200字 while (comment.length 20) { comment 教学效果良好。; } if (comment.length 200) { comment comment.substring(0, 197) ...; } textarea.value comment; textarea.dispatchEvent(new Event(input, { bubbles: true })); filledCount; console.log( 评语: ${comment.substring(0, 30)}...); } } return filledCount; } // // 6. 主流程异步执行 // async function main() { console.log(.repeat(60)); console.log( 开始模拟真人评教仅选择和填写); console.log(.repeat(60)); // 第一步模拟滚动 await randomDelay(500, 1000); simulateScroll(); await randomDelay(300, 800); // 第二步选择评价选项 console.log(\n 正在选择评价选项...); await randomDelay(200, 500); let result selectOptions(); // 第三步模拟鼠标移动随机滚动 await randomDelay(500, 1000); simulateScroll(); await randomDelay(300, 700); // 第四步填写评语 console.log(\n 正在填写评语...); await randomDelay(300, 600); let filled fillComments(); // 第五步最终统计 console.log(\n .repeat(60)); console.log(✅ 模拟完成); console.log( 评价选项: 优 ${result.youCount} 项, 良 ${result.liangCount} 项, 共 ${result.total} 项); console.log( 填写评语: ${filled} 个文本框); console.log(.repeat(60)); console.log(⚠️ 注意未自动提交请手动检查后点击提交); console.log(.repeat(60)); } // 执行主流程 main(); })();运行效果如图上三、核心模块功能详解3.1 随机延时函数 randomDelay采用 Promise 封装定时器生成区间随机等待时间解决脚本瞬间操作表单被系统判定机器人的问题模拟人思考、滑动页面的停顿行为所有操作步骤均加入延时缓冲。3.2 页面滚动模拟 simulateScroll随机向下滑动 100~400px 页面平滑滚动模仿人浏览页面、下拉查看全部评价项的行为进一步弱化自动化特征。3.3 单选框批量赋值 selectOptions获取页面所有 radio 单选按钮通过 name 筛选教务评教相关表单项分组管理每一行评价维度70% 概率选优、30% 选良增加兜底逻辑防止全部评价都是满分强制保留若干 “良” 评级贴合真实学生评价习惯循环点击对应单选框并在控制台打印每一项选择结果方便查看执行状态。3.4 智能评语填充 fillComments内置两套评语数组短句教师评价、长句课程综合评价通过文本框 placeholder、name 区分不同输入区域自动校验文字长度不足下限自动补充文字超出上限截断手动触发 input 事件解决部分教务系统仅赋值 value 无法识别已输入内容的 bug。3.5 异步主流程 main按照人类操作顺序分步执行等待→滚动→打分→等待→再次滚动→填写评语流程串行执行控制台输出完整执行日志结束后统计打分、填字数量。四、使用教程登录学校正方教务系统进入学生评教页面加载完整评教表单键盘按下 F12 打开浏览器开发者工具切换至 Console控制台面板复制全部 JS 代码粘贴到控制台输入框回车运行观察控制台输出日志等待脚本自动完成打分与评语填充脚本执行完毕后手动逐条核对所有评价内容、分数按需修改确认无误后手动点击页面提交按钮完成评教。五、自定义修改指南拓展内容提升文章价值修改优 / 良比例修改Math.random() 0.7中的 0.7数值越大满分越多调整操作速度修改 randomDelay 函数内的毫秒参数数值越大操作越慢新增评语直接在 teacherComments、generalComments 数组追加字符串即可修改滚动距离调整 simulateScroll 内 300、100 数值控制滑动范围适配其他教务系统修改 radio 筛选条件name.includes(555CF) || name.includes(pj)替换为本系统表单 name 特征。六、风险与注意事项重点规避违规问题本脚本仅用于前端技术学习仅辅助填充表单禁止自动提交、批量刷评价执行完成务必人工检查修改评价内容不要直接提交默认评语高频、短时间重复运行脚本可能触发教务系统风控限制建议单课程单次运行不同学校正方教务页面表单命名、DOM 结构存在差异若脚本失效可根据页面源码微调筛选规则遵守学校教学评价管理规定客观真实完成教师评价勿完全依赖脚本内容。七、总结本文实现的教务评教自动化脚本使用原生 JS无第三方依赖通过延时、滚动、混合评级等方式模拟人工操作兼顾实用性与安全性。代码结构模块化注释清晰不仅能解决期末批量评教重复操作的痛点也适合前端初学者学习 DOM 表单遍历、异步流程、事件模拟等基础知识点。大家可根据本校教务页面自行微调代码适配使用时务必人工审核后手动提交。