UESTC学分查看辅助2

本脚本旨在方便学生计划自己的学分。

  1. // ==UserScript==
  2. // @name UESTC学分查看辅助2
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.11
  5. // @description 本脚本旨在方便学生计划自己的学分。
  6. // @description 只在“课程管理->我的计划中生效”。
  7. // @description 灰色斜体字:已经修过并拿到学分的科目
  8. // @description 黄色背景:本学期正在学习的科目
  9. // @description 绿色背景:下学期可选科目
  10. // @description P.S: 本脚本以每年的2月1日和8月1日作为学期的分界线。
  11. // @author RobinEatCorn
  12. // @match http://eams.uestc.edu.cn/eams/*
  13. // @grant none
  14. // ==/UserScript==
  15.  
  16.  
  17. function compareArrays(a,b){
  18. if(a.length!=b.length)return false;
  19. for(let i=0;i<a.length;i++){
  20. if(a[i]!=b[i])return false;
  21. }
  22. return true;
  23. }
  24.  
  25. function matchCourses(txt,tbs){
  26. var flag=false;
  27. for(let i=0;i<tbs.length;i++){
  28. flag|=(txt.indexOf(tbs[i])!=-1);
  29. }
  30. return flag;
  31. }
  32.  
  33. function setStyles(x){
  34. "使得x之后的5个格子都和x具有相同的样式"
  35. //console.log(x.nextElementSibling);
  36. var y;
  37. for(let i=0;i<5;i=i+1){
  38. y=x.nextElementSibling;
  39. y.style.color=x.style.color;
  40. y.style.fontStyle=x.style.fontStyle;
  41. y.style.fontWeight=x.style.fontWeight;
  42. y.style.fontSize=x.style.fontSize;
  43. y.bgColor=x.bgColor;
  44. x=y;
  45. }
  46. }
  47.  
  48. function processPage(){
  49. var dt=new Date();
  50. var nextSemesterCourses=[];
  51. var courses=[];
  52. var ids=0;
  53. var XHR_ids=new XMLHttpRequest();
  54. var res;
  55.  
  56. function getIds(){
  57. XHR_ids.onreadystatechange=()=>{
  58. if(XHR_ids.readyState==4&&XHR_ids.status==200){
  59. res=XHR_ids.response;
  60. var stt=res.indexOf("form,\"ids\",")+12;
  61. var ed=stt;
  62. while("0"<=res[ed]&&res[ed]<="9")ed++;
  63. ids=Number(res.substr(stt,ed-stt));
  64. console.log(`Get ids=${ids}`);
  65. checkSemester(0,processCheck,[]);
  66. }
  67. }
  68. XHR_ids.open("GET","/eams/courseTableForStd.action",true);
  69. XHR_ids.send();
  70. }
  71.  
  72. function compareArrays(a,b){
  73. if(a.length!=b.length)return false;
  74. for(let i=0;i<a.length;i++){
  75. if(a[i]!=b[i])return false;
  76. }
  77. return true;
  78. }
  79.  
  80. function matchCourses(txt,tbs){
  81. var flag=false;
  82. for(let i=0;i<tbs.length;i++){
  83. flag|=(txt.indexOf(tbs[i])!=-1);
  84. }
  85. return flag;
  86. }
  87.  
  88. function setStyles(x){
  89. "使得x之后的5个格子都和x具有相同的样式"
  90. //console.log(x.nextElementSibling);
  91. var y;
  92. for(let i=0;i<5;i=i+1){
  93. y=x.nextElementSibling;
  94. y.style.color=x.style.color;
  95. y.style.fontStyle=x.style.fontStyle;
  96. y.style.fontWeight=x.style.fontWeight;
  97. y.style.fontSize=x.style.fontSize;
  98. y.bgColor=x.bgColor;
  99. x=y;
  100. }
  101. }
  102.  
  103.  
  104. var pInnerText=document.getElementsByTagName("p")[0].innerText;
  105. var pCut=pInnerText.indexOf("生效日期:")+5;
  106. var sttDate=Number(pInnerText.substr(pCut,4));
  107.  
  108. currentSemester=2*(dt.getFullYear()-sttDate)-(dt.getMonth()<2)+(dt.getMonth()>8);
  109. var nextSemester=currentSemester+1;
  110.  
  111. if(nextSemester<8){
  112. var table=document.getElementsByTagName("table")[3+2*nextSemester];
  113. var trs=table.getElementsByTagName("tr");
  114. for(let i=0;i<trs.length;i++){
  115. nextSemesterCourses.push(trs[i].children[1].innerText);
  116. }
  117. }
  118.  
  119. if(courses.length==0){
  120. courses=document.getElementsByClassName("course");
  121. }
  122. for(let i=0;i<courses.length;i++){
  123. if(matchCourses(courses[i].innerText,nextSemesterCourses)){
  124. courses[i].bgColor="#00ff00";
  125. setStyles(courses[i]);
  126. }
  127. }
  128.  
  129.  
  130. var latestCourses=[];
  131.  
  132. function checkSemester(s,callback,latch){
  133. "callback(s,currentCourses,latch)"
  134. var fd=new FormData();
  135. var XHR=new XMLHttpRequest();
  136. var currentCourses=[];
  137. var doc;
  138.  
  139. fd.append("ignoreHead","1");
  140. fd.append("setting.kind","std");
  141. fd.append("startWeek","1");
  142. fd.append("project.id","1");
  143. fd.append("isEng","0");
  144. fd.append("semester.id",String(s));
  145. fd.append("ids",ids);
  146.  
  147. XHR.addEventListener("load",()=>{console.log("Done");});
  148. XHR.addEventListener("error",()=>{alert("Error");});
  149. XHR.onreadystatechange=()=>{
  150. if(XHR.readyState==4&&XHR.status==200){
  151. var parser=new DOMParser();
  152. doc=parser.parseFromString(XHR.response,"text/html");
  153. var tbd=doc.getElementsByTagName("tbody")[1];
  154. trs=tbd.getElementsByTagName("tr");
  155. if(trs.length<=1){callback(s,currentCourses,latch);return;}
  156. for(let i=0;i<trs.length;i++){
  157. currentCourses.push(trs[i].children[2].innerText);
  158. }
  159.  
  160. callback(s,currentCourses,latch);
  161.  
  162. }
  163. }
  164.  
  165. XHR.open("POST","/eams/courseTableForStd!courseTable.action",true);
  166. XHR.send(fd);
  167. }
  168.  
  169. function processCheck(s,currentCourses,latch){
  170. if(currentCourses.length==0){
  171. //此时latch中是目前最新的课表
  172. currentCourses=latch;
  173. latestCourses=latch;
  174. if(courses.length==0){
  175. courses=document.getElementsByClassName("course");
  176. }
  177. for(let i=0;i<courses.length;i++){
  178. if(matchCourses(courses[i].innerText,currentCourses)){
  179. courses[i].bgColor="#ffff00";
  180. setStyles(courses[i]);
  181. }
  182. }
  183.  
  184. } else {
  185. console.log(s);
  186. checkSemester(s+20,processCheck,currentCourses);
  187. }
  188. }
  189.  
  190. //checkSemester(0,processCheck,[]);
  191. getIds();
  192.  
  193. var xhttp=new XMLHttpRequest();
  194. var doc;
  195. var coursesName=[];
  196. var currentSemester=0;
  197.  
  198.  
  199. xhttp.onreadystatechange=()=>{
  200. if(xhttp.readyState==4&&xhttp.status==200){
  201. //处理xhttp带来的网页
  202. var parser=new DOMParser();
  203. doc=parser.parseFromString(xhttp.response,"text/html");
  204. var tds=doc.getElementsByTagName("td");
  205. for(let i=63;i<tds.length;i++){
  206. if(tds[i].colSpan==4&&tds[i].innerText.length>1){
  207. coursesName.push(tds[i].innerText);
  208. var smst=Number(tds[i].previousElementSibling.innerText);
  209. currentSemester=(smst>currentSemester)?smst:currentSemester;
  210. //console.log(tds[i]);
  211. }
  212. }
  213. currentSemester++;
  214. //匹配课程
  215.  
  216. if(courses.length==0){
  217. courses=document.getElementsByClassName("course");
  218. }
  219. for(let i=0;i<courses.length;i++){
  220. if(matchCourses(courses[i].innerText,coursesName)){
  221. courses[i].style.color="gray";
  222. courses[i].style.fontStyle="italic";
  223. //console.log(courses[i]);
  224. setStyles(courses[i]);
  225. }
  226. }
  227.  
  228. }
  229. }
  230. xhttp.open("GET","/eams/teach/grade/transcript/stdFinal.action",true);
  231. xhttp.send();
  232.  
  233.  
  234.  
  235.  
  236. }
  237.  
  238. function checkAndProcess(){
  239. if(location.href.indexOf("http://eams.uestc.edu.cn/eams/programDoc!info.action")!=-1){
  240. processPage();
  241. }
  242. }
  243.  
  244. (function() {
  245. 'use strict';
  246.  
  247. document.addEventListener("click",()=>{
  248. setTimeout(checkAndProcess,1000);
  249. });
  250.  
  251. window.onload=()=>{
  252. setTimeout(checkAndProcess,1000);
  253. }
  254. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址