// ==UserScript== // @name szu获取详细成绩 // @namespace https://greasyfork.org/ // @version 1.2 // @description szu获取详细成绩,包含平时成绩,期末成绩,平时成绩和期末成绩占比 // @author You // @run-at document-start // @match *://ehall.szu.edu.cn/jwapp/sys/cjcx/* // @require https://scriptcat.org/lib/513/2.1.0/ElementGetter.js#sha256=aQF7JFfhQ7Hi+weLrBlOsY24Z2ORjaxgZNoni7pAz5U= // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/529958/szu%E8%8E%B7%E5%8F%96%E8%AF%A6%E7%BB%86%E6%88%90%E7%BB%A9.user.js // @updateURL https://update.greasyfork.icu/scripts/529958/szu%E8%8E%B7%E5%8F%96%E8%AF%A6%E7%BB%86%E6%88%90%E7%BB%A9.meta.js // ==/UserScript== (function () { 'use strict'; const url = "https://ehall.szu.edu.cn/jwapp/sys/cjcx/modules/cjcx/xscjcx.do"; const cookie = document.cookie; async function fetchScores() { try { const headers = { "Cookie": cookie }; const response = await fetch(url, { method: "GET", headers }); const data = await response.json(); return data.datas.xscjcx.rows; } catch (error) { console.error("获取成绩失败:", error); return []; } } async function fetchPSCJ(value) { const requestBody = new URLSearchParams(); requestBody.append("querySetting", `[{"name":"PSCJ","value":${value},"linkOpt":"and","builder":"equal"}]`); requestBody.append("pageSize", "100"); requestBody.append("pageNumber", "1"); const headers = { "Content-Type": "application/x-www-form-urlencoded", "Cookie": cookie }; const response = await fetch(url, { method: "POST", headers, body: requestBody }); const data = await response.json(); return data.datas.xscjcx.rows; } async function fetchQMCJ(value) { const requestBody = new URLSearchParams(); requestBody.append("querySetting", `[{"name":"QMCJ","value":${value},"linkOpt":"and","builder":"equal"}]`); requestBody.append("pageSize", "100"); requestBody.append("pageNumber", "1"); const headers = { "Content-Type": "application/x-www-form-urlencoded", "Cookie": cookie }; const response = await fetch(url, { method: "POST", headers, body: requestBody }); const data = await response.json(); return data.datas.xscjcx.rows; } async function fetchAllScores() { const scores = await fetchScores(); const nameToRow = {}; scores.forEach(row => { nameToRow[row.KCM + row.XNXQDM_DISPLAY] = row; }); let totalSize = scores.length let count = totalSize for (let i = 100; i >= 0; i--) { const pscjRows = await fetchPSCJ(i); pscjRows.forEach(row => { const key = row.KCM + row.XNXQDM_DISPLAY; if (nameToRow[key]){ nameToRow[key].PSCJ = i.toString(); count--; } }); if (count <= 0) { break; } } count = totalSize for (let i = 100; i >= 0; i--) { const qmcjRows = await fetchQMCJ(i); qmcjRows.forEach(row => { const key = row.KCM + row.XNXQDM_DISPLAY; if (nameToRow[key]){ nameToRow[key].QMCJ = i.toString(); count--; } }); if (count <= 0) { break; } } const groupedScores = {}; Object.values(nameToRow).forEach(row => { const term = row.XNXQDM_DISPLAY; if (!groupedScores[term]) groupedScores[term] = []; groupedScores[term].push(row); }); // Sort the keys of groupedScores const sortedTerms = Object.keys(groupedScores).sort((a, b) => { // Extract the academic year and semester from the term strings const yearRegex = /^(\d{4})-(\d{4})学年/; const semesterRegex = /(第一|第二)学期$/; const extractYearSemester = (term) => { const yearMatch = term.match(yearRegex); const semesterMatch = term.match(semesterRegex); if (yearMatch && semesterMatch) { const startYear = parseInt(yearMatch[1], 10); const isFirstSemester = semesterMatch[1] === "第一"; return { startYear, isFirstSemester }; } return { startYear: 0, isFirstSemester: true }; // Default if no match }; const aTermDetails = extractYearSemester(a); const bTermDetails = extractYearSemester(b); // Compare years first if (aTermDetails.startYear !== bTermDetails.startYear) { return bTermDetails.startYear - aTermDetails.startYear; } // If years are equal, compare the semester (First semester comes before Second semester) return aTermDetails.isFirstSemester ? 1 : -1; }); // Now re-sort the groupedScores object by the sorted keys const sortedGroupedScores = {}; sortedTerms.forEach(term => { sortedGroupedScores[term] = groupedScores[term]; }); return sortedGroupedScores; } async function addScoreTab() { // 获取