Skip to content

Instantly share code, notes, and snippets.

@erjiaqing
Last active January 11, 2018 13:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save erjiaqing/9723b23cae8e5fa6fdde416afbd33f2e to your computer and use it in GitHub Desktop.
Save erjiaqing/9723b23cae8e5fa6fdde416afbd33f2e to your computer and use it in GitHub Desktop.
让武大学子在查分时……有那么一点心理准备的Tampermonkey脚本
// ==UserScript==
// @name Score Guesser
// @namespace http://app.ejq.me/
// @version 0.5.1
// @description Hide your score.
// @author EJQ
// @include http://210.42.121.132/servlet/Svlt_QueryStuScore*
// @include http://210.42.121.133/servlet/Svlt_QueryStuScore*
// @include http://210.42.121.134/servlet/Svlt_QueryStuScore*
// @include http://210.42.121.241/servlet/Svlt_QueryStuScore*
// @grant none
// @updateURL https://gist.githubusercontent.com/erjiaqing/9723b23cae8e5fa6fdde416afbd33f2e/raw/ScoreGuesser.js
// ==/UserScript==
/*
这个项目以后会加入到我的某个设想之中,Just wait & see.
2018-01-11 0.5.0 -> 0.5.1
* [新增] 在分学期显示中也显示已修和已选内容
* [优化] 细节提升
2017-07-11 0.4.0 -> 0.5.0
* [新增] 保研GPA计算(不通用)
2017-07-05 0.3.2 -> 0.4.0
* [修改] 以表格形式直接显示学分信息
2017-07-05 0.3.1-fix2 -> 0.3.2
* [优化] 暑期学期显示更加优雅
2017-07-04 0.3.1 -> 0.3.1-fix2
* [修复] 支持暑期学期显示
2017-07-04 0.3.1 -> 0.3.1-fix1
* [修复] 均分均绩分页显示,避免Chrome内容过多省略
2017-07-04 0.3.0-fix2 -> 0.3.1
* [新增] 计算已修学分功能
2017-07-04 0.3.0 -> 0.3.0-fix2
* [修复] 修复满分GPA算成0的问题
2017-06-27 0.3.0 -> 0.3.0-fix1
* [修复] 统一显示
2017-01-17 0.2.1 -> 0.3.0
* [新增] GPA、平均分计算功能
* [修复] 名字统一为ScoreGuesser
2017-01-13 0.2 -> 0.2.1
* [新增] 支持几个备用的地址
2017-01-11 0.1 -> 0.2
* [新增] (1)
* 只隐藏当前需要查的分数,对第一次使用的稍微友好一些
* 每年4月份之后,一律显示上学期分数
* 每年10月份之后,一律显示下学期分数
* [优化] (2)
* 优化了一些样式的显示
*/
(function() {
'use strict';
var score = {};
var originContent = {};
var creditSumGONGBI = 0, creditSumZHUANBI = 0;
var creditSumGONGXUAN = 0, creditSumZHUANXUAN = 0;
var creditSumTIYU = 0;
var creditSelGONGBI = 0, creditSelZHUANBI = 0;
var creditSelGONGXUAN = 0, creditSelZHUANXUAN = 0;
var creditSelTIYU = 0;
var gpaBAOYAN = 0, scoreBAOYAN = 0, creditBAOYAN = 0;
var creditSumBIXIU = {}, creditSumXUANXIU = {}, creditExpectedBIXIU = {}, creditExpectedXUANXIU = {};
var weightedGpaSumBIXIU = {},weightedGpaSumXUANXIU = {};
var weightedScoreBIXIU = {},weightedScoreXUANXIU = {};
var hideIds = 0;
var gpaMin = {
"4.0" : 90,
"3.7" : 85,
"3.3" : 82,
"3.0" : 78,
"2.7" : 75,
"2.3" : 72,
"2.0" : 68,
"1.0" : 60,
"0" : 0
};
var gpaMax = {
"4.0" : 101,
"3.7" : 90,
"3.3" : 85,
"3.0" : 82,
"2.7" : 78,
"2.3" : 75,
"2.0" : 72,
"1.0" : 68,
"0" : 59
};
var scoreList = new Array("4.0", "3.7", "3.3", "3.0", "2.7", "2.3", "2.0", "1.0", "0");
var semesterName = new Array("X", "上学期", "下学期");
// 未来用于计算GPA
function directDisplay(id) {
localStorage["ClassId" + id] = true;
console.log("DirectDisplay" + id + " = " + score["ClassId" + id]);
$("#showScoreContainer-" + id).html("<span>" + score["ClassId" + id] + "</span>");
$("#showOptionContainer-"+id).html(originContent["ClassId" + id]);
}
function displayGPA(year) {
var retstr = "";
var current = 0;
var gpaBIXIU = 0, scoreBIXIU = 0, creditBIXIU = 0;
var creditXUANXIU = 0;
for (var yr = (year || 2000); yr <= (year || (new Date()).getFullYear()); yr = yr + 1) {
var yrSumGPA = 0, yrSumScore = 0, yrSumCredit = 0, yrSumExpected = 0;
for (var sm = 1; sm < 3; sm = sm + 1) {
var smstr = String(yr * 10 + sm);
if (creditSumBIXIU[smstr] !== undefined) {
if (smstr != current) {
retstr = retstr + "\n" + yr + "~" + (yr+1) + "学年 " + semesterName[sm] + ":\n";
current = smstr;
}
retstr = retstr + "必修GPA " + (weightedGpaSumBIXIU[smstr] / creditSumBIXIU[smstr]).toFixed(3) +
", 必修均分 " + (weightedScoreBIXIU[smstr] / creditSumBIXIU[smstr]).toFixed(3) + ", 共" + creditSumBIXIU[smstr] + "学分\n";
gpaBIXIU = gpaBIXIU + weightedGpaSumBIXIU[smstr];
scoreBIXIU = scoreBIXIU + weightedScoreBIXIU[smstr];
creditBIXIU = creditBIXIU + creditSumBIXIU[smstr];
yrSumGPA = yrSumGPA + weightedGpaSumBIXIU[smstr];
yrSumScore = yrSumScore + weightedScoreBIXIU[smstr];
yrSumCredit = yrSumCredit + creditSumBIXIU[smstr];
yrSumExpected = yrSumExpected + creditExpectedBIXIU[smstr];
}
if (creditSumXUANXIU[smstr] !== undefined) {
if (smstr != current) {
retstr = retstr + "\n" + yr + "~" + (yr+1) + "学年 " + semesterName[sm] + ":\n";
current = smstr;
}
yrSumExpected = yrSumExpected + creditExpectedXUANXIU[smstr];
retstr = retstr + "选修GPA " + (weightedGpaSumXUANXIU[smstr] / creditSumXUANXIU[smstr]).toFixed(3) +
", 选修均分 " + (weightedScoreXUANXIU[smstr] / creditSumXUANXIU[smstr]).toFixed(3) + ", 共" + creditSumXUANXIU[smstr] + "学分\n";
}
if (creditExpectedBIXIU[smstr] !== undefined || creditExpectedXUANXIU[smstr] !== undefined)
{
var creditStrBIXIU = (creditExpectedBIXIU[smstr] == creditSumBIXIU[smstr] ? creditSumBIXIU[smstr] : ("<abbr title=\"本学期分未全部公布\">(" + (creditSumBIXIU[smstr] || 0) + " / " + (creditExpectedBIXIU[smstr] || 0) + ")</abbr>"));
var creditStrXUANXIU = (creditExpectedXUANXIU[smstr] == creditSumXUANXIU[smstr] ? creditSumXUANXIU[smstr] : ("<abbr title=\"本学期分未全部公布\">(" + (creditSumXUANXIU[smstr] || 0) + " / " + (creditExpectedXUANXIU[smstr] || 0) + ")</abbr>"));
$("#gpaTbody").append('<tr>'+
'<td>'+yr + "~" + (yr+1) + '</td>'+
'<td>'+semesterName[sm]+'</td>'+
'<td>'+creditStrBIXIU+'</td>'+
'<td>'+(creditSumBIXIU[smstr] ? (weightedScoreBIXIU[smstr] / creditSumBIXIU[smstr]).toFixed(3) : '--')+'</td>'+
'<td>'+(creditSumBIXIU[smstr] ? (weightedGpaSumBIXIU[smstr] / creditSumBIXIU[smstr]).toFixed(3) : '--')+'</td>'+
'<td>'+creditStrXUANXIU+'</td>'+
'<td>'+(creditSumXUANXIU[smstr] ? (weightedScoreXUANXIU[smstr] / creditSumXUANXIU[smstr]).toFixed(3) : '--')+'</td>'+
'<td>'+(creditSumXUANXIU[smstr] ? (weightedGpaSumXUANXIU[smstr] / creditSumXUANXIU[smstr]).toFixed(3) : '--')+'</td>'+
'</tr>');
}
}
if (yrSumExpected > 0) {
//retstr = retstr + "学年必修GPA " + (yrSumGPA / yrSumCredit).toFixed(3) + ",学年必修均分" + (yrSumScore / yrSumCredit).toFixed(3) + "\n";
$("#gpaTbody").append('<tr>'+
'<td>'+yr + "~" + (yr+1) + '</td>'+
'<td></td>'+
'<td>'+(yrSumCredit)+'</td>'+
'<td>'+(yrSumCredit ? (yrSumScore / yrSumCredit).toFixed(3) : '--')+'</td>'+
'<td>'+(yrSumCredit ? (yrSumGPA / yrSumCredit).toFixed(3) : '--')+'</td>'+
'<td></td>'+
'<td></td>'+
'<td></td>'+
'</tr>');
}
if (retstr !== "") {
// alert(retstr);
}
retstr = "";
}
$("#creditTbody").append('<tr>'+
'<td>已修 '+creditSumGONGBI + '<br>已选 ' + creditSelGONGBI +'</td>'+
'<td>已修 '+creditSumGONGXUAN + '<br>已选 ' + creditSelGONGXUAN +'</td>'+
'<td>已修 '+creditSumZHUANBI + '<br>已选 ' + creditSelZHUANBI +'</td>'+
'<td>已修 '+creditSumZHUANXUAN + '<br>已选 ' + creditSelZHUANXUAN +'</td>'+
'<td>已修 '+creditSumTIYU + '<br>已选 ' + creditSelTIYU +'</td>'+
'<td>已修 '+(creditSumGONGBI + creditSumGONGXUAN + creditSumZHUANBI + creditSumZHUANXUAN) + ' <br> 已选 ' +
(creditSelGONGBI + creditSelGONGXUAN + creditSelZHUANBI + creditSelZHUANXUAN)+' </td>'+
'<td>'+(creditBIXIU ? ((scoreBIXIU / creditBIXIU).toFixed(3)+'<br>' + (gpaBIXIU / creditBIXIU).toFixed(3)) : '--')+'</td>'+
'<td>'+(creditBAOYAN ? ((scoreBAOYAN / creditBAOYAN).toFixed(3) +'<br>'+(gpaBAOYAN / creditBAOYAN).toFixed(3)) : '--')+'</td>'+
'</tr>');
if (year == undefined) {
var retstr2 = "";
retstr2 = "目前为止,必修GPA " + (gpaBIXIU / creditBIXIU).toFixed(3) + " ,必修均分 " + (scoreBIXIU / creditBIXIU).toFixed(3);
retstr2 = retstr2 + "\n\n已修学分情况:\n公共必修 " + creditSumGONGBI + " 学分(含体育 "+creditSumTIYU+") / 已选 "+creditSelGONGBI+"学分(含体育 "+creditSelTIYU+"学分)\n"+
"专业必修 已修" + creditSumZHUANBI + " 学分 <br><small>已选 "+creditSelZHUANBI+" 学分</small>\n"+
"公共选修 " + creditSumGONGXUAN + " 学分 <br><small> 已选 "+creditSelGONGXUAN+" 学分</small>\n"+
"专业选修 " + creditSumZHUANXUAN + " 学分 <br><small> 已选 "+creditSelZHUANXUAN+" 学分</small>\n";
retstr2 = retstr2 + "\n只计算第一次学习绩点,重修、重考、二次重修等不算在内";
//addCustomAlert(retstr, '均分均绩');
//alert(retstr2);
}
}
function abs(x) {
if (x < 0) return -x;
return x;
}
function displayScore(id) {
var lastScore = -1;
var trueScore = Number(score["ClassId" + id]);
var minScore = 0;
var maxScore = 100;
var tmpLastScore = -1;
while (abs(lastScore - trueScore) > 0.5) {
while (true) {
lastScore = tmpLastScore;
console.log(lastScore);
if (lastScore < 0) {
lastScore = prompt("你猜你有多少分?");
} else if (lastScore < trueScore) {
minScore = lastScore;
lastScore = prompt("上一次你猜的是"+lastScore+",猜低了\nTips:可能的分数区间是("+minScore+","+maxScore+") OvO");
} else if (lastScore > trueScore) {
maxScore = lastScore;
lastScore = prompt("上一次你猜的是"+lastScore+",猜高了\nTips:可能的分数区间是("+minScore+","+maxScore+") O_O");
}
if (lastScore === "") {
break;
}
var tLastScore = Number(lastScore);
if (tLastScore < minScore || tLastScore > maxScore) {
alert("输入的分数不合法,不想猜的话,直接按回车就能显示分数");
} else {
break;
}
}
if (lastScore === "") {
break;
}
tmpLastScore = lastScore = Number(lastScore);
}
directDisplay(id);
}
function processScore() {
var src = $("tbody")[0];
var res = new Array($("tbody")[0].children[0]);
var curDate=new Date();
var curYear = curDate.getFullYear();
var curMonth = curDate.getMonth();
if (curMonth < 3) {
hideIds = (curYear - 1) * 10 + 1;
} else if (curMonth < 9) {
hideIds = (curYear - 1) * 10 + 2;
} else {
hideIds = (curYear) * 10 + 1;
}
$(".total_count").html($(".total_count").html() + ",“ScoreGuesser”插件不会上传你的分数\n推荐使用<a href=\"https://gist.github.com/erjiaqing/f1049583108196310f9b4dcec58d95f7\">NoTT.js</a>一键导出课程表为日历软件使用的格式");
for (var ii = 1; ii < src.children.length; ii++) {
(function (i){
console.log("ClassId" + src.children[i].children[0].innerText + " = " + src.children[i].children[9].innerText);
var classId = src.children[i].children[0].innerText.replace('sq', '');
if (src.children[i].children[0].innerText.substr(0, 2) === 'sq') {
src.children[i].children[8].innerText = '暑';
}
if (src.children[i].children[6].innerText === "普通") {
console.log("计算GPA的课头");
// 只计算“普通”的GPA(保研GPA),不计算重修、二次重修、重考等
var credit = Number(src.children[i].children[3].innerText);
if (src.children[i].children[2].innerText === "公共必修") {
creditSelGONGBI += credit;
if (src.children[i].children[5].innerText === "体育部") {
creditSelTIYU += credit;
}
}
if (src.children[i].children[2].innerText === "专业必修") {
creditSelZHUANBI += credit;
}
if (src.children[i].children[2].innerText === "公共选修") {
creditSelGONGXUAN += credit;
}
if (src.children[i].children[2].innerText === "专业选修") {
creditSelZHUANXUAN += credit;
}
}
if (src.children[i].children[9].innerText === "") {
$(src.children[i].children[9]).html('<span style="color:#999">未出分</span>');
let semester = classId.substr(0, 5);
let credit = Number(src.children[i].children[3].innerText);
if (src.children[i].children[2].innerText === "公共必修" || src.children[i].children[2].innerText === "专业必修") {
if (creditExpectedBIXIU[semester] === undefined) {
creditExpectedBIXIU[semester] = 0;
}
creditExpectedBIXIU[semester] = creditExpectedBIXIU[semester] + credit;
} else {
if (creditExpectedXUANXIU[semester] === undefined) {
creditExpectedXUANXIU[semester] = 0;
}
creditExpectedXUANXIU[semester] = creditExpectedXUANXIU[semester] + credit;
}
console.log("还没出分");
console.log(creditExpectedBIXIU);
console.log("------");
} else {
let semester = classId.substr(0, 5);
if (src.children[i].children[6].innerText === "普通") {
console.log("计算GPA的课头");
// 只计算“普通”的GPA(保研GPA),不计算重修、二次重修、重考等
var gpa = 0;
var tscore = Number(src.children[i].children[9].innerText);
let credit = Number(src.children[i].children[3].innerText);
scoreList.forEach(function _(e) {
if (gpaMin[e] - 0.01 < tscore && tscore < gpaMax[e] - 0.01) {
gpa = Number(e);
}
});
if (src.children[i].children[2].innerText === "公共必修") {
creditSumGONGBI += credit;
gpaBAOYAN += credit * gpa;
scoreBAOYAN += credit * tscore;
creditBAOYAN += credit;
if (src.children[i].children[5].innerText === "体育部") {
creditSumTIYU += credit;
}
}
if (src.children[i].children[2].innerText === "专业必修") {
creditSumZHUANBI += credit;
gpaBAOYAN += credit * gpa;
scoreBAOYAN += credit * tscore;
creditBAOYAN += credit;
}
if (src.children[i].children[2].innerText === "公共选修") {
creditSumGONGXUAN += credit;
}
if (src.children[i].children[2].innerText === "专业选修") {
creditSumZHUANXUAN += credit;
gpaBAOYAN += credit * gpa;
scoreBAOYAN += credit * tscore;
creditBAOYAN += credit;
}
if (src.children[i].children[2].innerText === "公共必修" || src.children[i].children[2].innerText === "专业必修") {
if (creditSumBIXIU[semester] === undefined) {
creditSumBIXIU[semester] = 0;
weightedGpaSumBIXIU[semester] = 0;
weightedScoreBIXIU[semester] = 0;
}
if (creditExpectedBIXIU[semester] === undefined) {
creditExpectedBIXIU[semester] = 0;
}
creditExpectedBIXIU[semester] = creditExpectedBIXIU[semester] + credit;
creditSumBIXIU[semester] = creditSumBIXIU[semester] + credit;
weightedGpaSumBIXIU[semester] = weightedGpaSumBIXIU[semester] + credit * gpa;
weightedScoreBIXIU[semester] = weightedScoreBIXIU[semester] + credit * tscore;
} else {
if (creditSumXUANXIU[semester] === undefined) {
creditSumXUANXIU[semester] = 0;
weightedGpaSumXUANXIU[semester] = 0;
weightedScoreXUANXIU[semester] = 0;
}
if (creditExpectedXUANXIU[semester] === undefined) {
creditExpectedXUANXIU[semester] = 0;
}
creditExpectedXUANXIU[semester] = creditExpectedXUANXIU[semester] + credit;
creditSumXUANXIU[semester] = creditSumXUANXIU[semester] + credit;
weightedGpaSumXUANXIU[semester] = weightedGpaSumXUANXIU[semester] + credit * gpa;
weightedScoreXUANXIU[semester] = weightedScoreXUANXIU[semester] + credit * tscore;
}
}
if (localStorage.getItem("ClassId" + classId)) {
return;
}
if (Number(classId.substr(0, 5)) < hideIds) {
return;
}
score["ClassId" + src.children[i].children[0].innerText] = src.children[i].children[9].innerText;
originContent["ClassId" + src.children[i].children[0].innerText] = $(src.children[i].children[10]).html();
$(src.children[i].children[9]).html('<span style="color:#333" id="showScoreContainer-' + classId + '">已出分</span>');
$(src.children[i].children[10]).html('<span id="showOptionContainer-'+classId+'"><button class="btn overlay ShowScoreBtn" href="#" id="showScore-'+classId+'">猜分</button>'+
'<button class="btn overlay directShowScoreBtn" href="#" id="directShowScore-'+classId+'">看分</button></span>');
$("#showScore-"+classId).click(function () {displayScore(classId);});
$("#directShowScore-"+classId).click(function () {directDisplay(classId);});
}
})(ii);
}
$("#searchBox").css("height", "70px");
//$("#searchBox").append('<div><button class="searchBtb" id="calaulateGPA">均分均绩</button></div>');
$("#searchBox").after('<table id="gpaTable" class="table listTable">'+
'<tbody id="gpaTbody"><tr class="alt"><th>学年</th><th>学期</th><th>必修学分</th><th>必修均分</th><th>必修均绩</th><th>选修学分</th><th>选修均分</th><th>选修均绩</th></tr></tbody></table>');
$("#gpaTable").after('<table id="creditTable" class="table listTable">'+
'<tbody id="creditTbody"><tr class="alt"><th>公共必修</th><th>公共选修</th><th>专业必修</th><th>专业选修</th><th>体育</th><th>总学分</th><th>必修均分均绩</th><th><abbr title="必修及专业选修">保研均分均绩</abbr></th></tr></tbody></table>');
displayGPA();
//$("#calaulateGPA").click(function e(){});
/*
for (var yr = 2000; yr <= (new Date()).getFullYear(); yr = yr + 1) {
$("#calaulateGPA_"+yr).click(function e(){displayGPA(yr);});
}*/
console.log(score);
}
console.log("OvO");
processScore();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment