Greasy Fork

Greasy Fork is available in English.

速通NUIST学习通教评

新版教评令人窒息,默认给所有老师全10分,大家都开心(想改分的改源代码90行)

当前为 2024-06-04 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        速通NUIST学习通教评
// @namespace    http://tampermonkey.net/
// @version      1.17
// @description  新版教评令人窒息,默认给所有老师全10分,大家都开心(想改分的改源代码90行)
// @author        咩咩怪!
// @match      *://i.chaoxing.com/*
// @match      *://i.chaoxing.com/*
// @grant        none
// @license MIT
// ==/UserScript==

// 创建悬浮窗
var floatWindow = document.createElement("div");
floatWindow.className = "float-window";
floatWindow.innerHTML = `
  <h3>打开到评教第一页</h3><br><h3>然后点开始运行</h3>
  <button id="anniu" class="float-button" onclick="changeParamAndText()">开始运行</button>
`;
document.body.appendChild(floatWindow);

// 创建样式
var style = document.createElement("style");
style.innerHTML = `
  .float-window {
    position: fixed;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    width: 120px;
    height: 80px;
    background-color: lightblue;
    border: 1px solid black;
    text-align: center;
    padding: 10px;
    z-index: 9999;
  }

  .float-button {
    margin-top: 10px;
    width: 100px;
    height: 40px;
    font-size: 16px;
    cursor: pointer;
    z-index: 9999;
  }
`;
document.head.appendChild(style);

// 定义一个变量,初始值为1
var param = 0;
// 定义一个变量,表示是否还有 fontColor02 节点对象存在
var hasFontColor02 = true;
// 定义一个变量,表示是否需要换页
var needChangePage = false;
// 定义一个变量,表示当前的页码
var pageNum = 0;
// 定义一个变量,表示当前页的节点对象
var curPage = null;
// 使用 while 循环,当还有 fontColor02 节点对象存在时,继续循环
var nummnum = 1;

// 定义一个函数,用来改变参数和按钮的文本
function changeParamAndText() {
  // 切换参数的值,如果是1就变成0,如果是0就变成1
  param = param === 1 ? 0 : 1;

  // 获取id为anniu的按钮元素
  var button = document.getElementById("anniu");

  // 根据参数的值来改变按钮的文本
  if (param === 1) {
    button.innerHTML = "停止运行";
    setTimeout(() => {
      start_main();
    }, 500);
  } else {
    button.innerHTML = "开始运行";
  }

  // 打印参数的值
  console.log(param);
}

// 定义一个延时函数,返回一个 Promise 对象
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

// 定义一个 putdefen 函数,使用 async/await 语法
async function putdefen() {
  //设置分值
  var score = 10; //改分值在这里★★★
  await delay(300);
  console.log("进入点击函数");
  // 获取所有类名为 blueInp dafen 的元素
  let elements1;
  try {
    elements1 = document
      .getElementById("frame_content")
      .contentWindow.document.getElementsByClassName("blueInp dafen");
  } catch (error) {
    console.log("发生错误,500毫秒后重试");
    await delay(500);
    elements1 = document
      .getElementById("frame_content")
      .contentWindow.document.getElementsByClassName("blueInp dafen");
  }

  // 如果 elements1 为空,等待 500 毫秒,然后再次尝试获取 elements1
  while (elements1.length === 0) {
    console.log("elements1 为空,500毫秒后重试");
    await delay(500);
    elements1 = document
      .getElementById("frame_content")
      .contentWindow.document.getElementsByClassName("blueInp dafen");
  }

  // 使用 for...of 循环遍历元素列表
  for (const element of elements1) {
    // 设置元素的 value 属性为 10
    element.value = score;
  }
  // 获取类名为 botBtnBox 的元素
  await delay(200);
  // 使用 for...of 循环遍历元素列表
  const elements2 = document
    .getElementById("frame_content")
    .contentWindow.document.getElementsByClassName("blueInp dafen");
  for (const element of elements2) {
    // 设置元素的 value 属性为 10
    element.value = score;
  }
  await delay(200);
  const box1 = document
    .getElementById("frame_content")
    .contentWindow.document.querySelector(".botBtnBox");
  console.log(box1);
  // 如果 box 元素没有子节点,或者只有一个子节点,跳过这一步
  try {
    if (box1.children.length < 2) return;
    // 获取 box 元素的第二个子节点
    const button = box1.children[1];
    // 模拟用户点击元素
    button.click();
  } catch (error) {
    console.log("是我想的那样");
    console.log(error.name + ": " + error.message);
  }
  // 等待 300 毫秒
  await delay(500);
  // 获取类名为 layui-layer-btn0 的元素
  const button2 = document
    .getElementById("frame_content")
    .contentWindow.document.querySelector(".layui-layer-btn0");
  // 模拟用户点击元素
  button2.click();
  // 等待 100 毫秒
  await delay(400);
  // 获取 id 名字为 pageindex 的节点
  let pageindex = document
    .getElementById("frame_content")
    .contentWindow.document.getElementById("pageindex");
  // 获取 pageindex 节点的所有子节点
  let children = pageindex.children;
  // 使用 for...of 循环遍历子节点列表
  for (const child of children) {
    // 如果子节点的 innerHTML 在 "1" 到 "9" 之间,表示是页码节点
    if (child.innerHTML >= "1" && child.innerHTML <= "9") {
      if (Number(child.innerHTML) === pageNum) {
        // 模拟用户点击子节点
        console.log("点击函数回到当前页", Number(child.innerHTML));
        child.click();
        // 跳出 for 循环
        await delay(400);
        break;
      }
    }
  }
}

// 定义一个主函数,使用 async/await 语法
async function start_main() {
  console.log("进入主函数");
  while (true) {
    await delay(100);
    if (param === 1) {
      // 获取 id 名字为 pageindex 的节点
      console.log("第", nummnum, "次循环");
      nummnum = nummnum + 1;
      await delay(200);
      let pageindex = document
        .getElementById("frame_content")
        .contentWindow.document.getElementById("pageindex");
      // 获取 pageindex 节点的所有子节点
      let children = pageindex.children;
      // 使用 for...of 循环遍历子节点列表
      for (const child of children) {
        console.log("进入确定页码");
        // 如果子节点的 innerHTML 在 "1" 到 "9" 之间,表示是页码节点
        if (child.innerHTML >= "1" && child.innerHTML <= "9") {
          // 获取子节点的类名
          let className = child.className;
          // 如果类名包含 cur,表示是当前页的节点
          if (className.includes("cur")) {
            // 把子节点赋值给 curPage
            curPage = child;
            console.log(child.innerHTML);
            // 获取子节点的 innerHTML,转换为数字
            pageNum = Number(child.innerHTML);
            console.log("当前页码为:", Number(child.innerHTML));
          }
        }
      }

      // 检查是否还有待评价的 fontColor02 节点
      hasFontColor02 = false;
      // 再次获取所有类名为 fontColor02 的元素
      const elements2 = document
        .getElementById("frame_content")
        .contentWindow.document.getElementsByClassName("fontColor02");
      // 使用 for...of 循环遍历元素列表
      for (const element of elements2) {
        console.log("检查是否还有待评价的,决定是否换页");
        // 获取元素的文字内容,包括 HTML 标签
        const text = element.innerHTML;
        // 如果文字是“待评价”,表示还有待评价的 fontColor02 节点
        if (text === "待评价") {
          // 设置 hasFontColor02 为 true
          console.log("还有待评价的");
          hasFontColor02 = true;
          needChangePage = false;
          // 跳出 for 循环
          break;
        }
      }
      // 如果没有待评价的 fontColor02 节点,设置 needChangePage 为 true,表示需要换页
      if (!hasFontColor02) {
        needChangePage = true;
        console.log("该换页了");
      }

      if (needChangePage) {
        console.log("进入换页");
        let pageindex = document
          .getElementById("frame_content")
          .contentWindow.document.getElementById("pageindex");
        // 获取 pageindex 节点的所有子节点
        let children = pageindex.children;
        // 使用 for...of 循环遍历子节点列表
        for (const child of children) {
          // 如果子节点的 innerHTML 在 "1" 到 "9" 之间,表示是页码节点
          if (child.innerHTML >= "1" && child.innerHTML <= "9") {
            // 如果等于 pageNum+1,表示是要更换的页码
            if (Number(child.innerHTML) === pageNum + 1) {
              // 模拟用户点击子节点
              console.log("要换成", pageNum + 1);
              child.click();
              // 跳出循环
              pageNum = pageNum + 1;
              break;
            }
          }
        }
      }

      // 获取所有类名为 fontColor02 的元素
      const elements = document
        .getElementById("frame_content")
        .contentWindow.document.getElementsByClassName("fontColor02");
      // 使用 for...of 循环遍历元素列表
      for (const element of elements) {
        console.log("检查是否是待评价的,是就点击");
        // 获取元素的文字内容,包括 HTML 标签
        const text = element.innerHTML;
        // 如果文字是“待评价”,则执行以下操作
        if (text === "待评价") {
          // 调用点击函数
          element.click();
          await putdefen();
          await delay(400);
          break;
        }
      }
    } else {
      break;
    }
  }
  console.log("整个函数结束了");
}

var image1 = document.getElementById("anniu");
image1.onclick = changeParamAndText;