Last active
January 11, 2018 13:46
-
-
Save erjiaqing/9723b23cae8e5fa6fdde416afbd33f2e to your computer and use it in GitHub Desktop.
让武大学子在查分时……有那么一点心理准备的Tampermonkey脚本
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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