- Published on
让你的好分数比别人更高级!
预计阅读时长:5分钟
- Authors
- Name
- Roitium
TL; DR
修改好分数 js,让非 vip 用户能查看考试各科分数和总分的年级班级平均分、最高分、具体名次,比其他同学更快一步(
具体流程
- 进
app
开头的那个 js,搜函数UserGetProfile
(在写这篇文章时是第 17435 行),修改代码让 isMember 始终为 true(开启显示分数对比的 ui)
UserGetProfile: function(e) {
return o.default.http.get("/hfsbe/v2/user-center/user-snapshot").then(function(e) {
return o.default.checkResp(e)
}).then(function(t) {
+ t.isMember = true; // 设置isMember为true
+ t.isPay = true; // 设置isPay为true
return t && t.linkedStudent && delete (t = r()({}, t, t.linkedStudent)).linkedStudent,
e.commit("USER_SET_PROFILE", t),
t
}).catch(function(t) {
throw e.commit("USER_SET_PROFILE"),
t
})
},
- 现在好分数就会把你当成高贵的氪金玩家了,会多调用一大堆 api 获得其他信息,但这些 api 后端都做了鉴权,用不了,会弹一大堆 "无权访问"toast,虽然不影响使用但看着难受,搞掉他!网络面板定位到具体的 api 调用请求(分别是
questions-lost
和knowledge-stat
),点启动器翻调用堆栈找到请求函数(形如 getXXXXX,eg.getKnowledgeStat
),点击后面对应的源 js,然后把这个函数里 catch 代码块中加个判断即可。这里拿一个举例子,另一个同理:
getKnowledgeStat: function() {
var t = this; (this.isMember || this.visible) && this.examId && this.paperId && (this.page = 1, this.reduceActive = !1, this.addActive = !0, this.$http.get("/hfsbe/v3/exam/" + this.examId + "/papers/" + this.paperId + "/knowledge-stat?deviceType=1").then(function(e) {
return t.$checkResp(e)
}).then(function(e) {
e && e.forEach(function(t) {
var e = t.scoreRate,
n = t.chance;
e *= 100,
n *= 100,
t.scoreRateStr = ~~e === e ? e + "%": e.toFixed(2) + "%",
t.chanceStr = ~~n === n ? n + "%": n.toFixed(2) + "%"
}),
t.knowledgeStatList = e || [],
t.knowledgeStatList.length <= t.limit && (t.addActive = !1, t.reduceActive = !1)
}).
catch(function(e) {
- t.$handleError(e.msg)
+ if (e.msg == "无权访问"){}else{
+ t.$handleError(e.msg)
+ }
}))
}
}),
- 继续点开网络面板,找 rank-info 请求(❗️总共有两个 rank-info 接口,一个是各科,一个是总分,修改方法一样,我依旧只拿一个举例)。继续点启动器,找
fetchRankInfo
,点进源码,找到这段,找我这个样子修改,很简单:
fetchRankInfo: function() {
var t = this;
this.examId && this.paperId && !this.flag && (this.flag = !0, this.$http.get("/hfsbe/v3/exam/" + this.examId + "/papers/" + this.paperId + "/rank-info").then(function(e) {
return t.$checkResp(e)
}).then(function(e) {
+ function copyOriginalToSFields(data) {
+ const originalFields = ['highest', 'avg', 'rank', 'number', 'defeatRatio'];
+ const sFields = ['highestS', 'avgS', 'rankS', 'numberS', 'defeatRatioS'];
+
+ for (let i = 0; i < originalFields.length; i++) {
+ const originalField = originalFields[i];
+ const sField = sFields[i];
+
+ if (data[sField] && data[originalField]) {
+ for (const key in data[originalField]) {
+ if (data[originalField].hasOwnProperty(key)) {
+ data[sField][key] = data[originalField][key];
+ }
+ }
+ }
+ }
+
+ return data;
+ }
+ let data = copyOriginalToSFields(e)
+ t.rankTableInfo = data || null
- t.rankTableInfo = e || null
}).
catch(function(e) {
t.$handleError(e.msg)
}).
finally(function() {
t.flag = !1
}))
}
让我们来具体看下增加的那个处理函数,其实很简单。比如,对 rank 和 rankS 来说,就是把 rankS 字段的数据直接替换为 rank 字段的数据,其他同理:
function copyOriginalToSFields(data) {
const originalFields = ['highest', 'avg', 'rank', 'number', 'defeatRatio'];
const sFields = ['highestS', 'avgS', 'rankS', 'numberS', 'defeatRatioS'];
for (let i = 0; i < originalFields.length; i++) {
const originalField = originalFields[i];
const sField = sFields[i];
if (data[sField] && data[originalField]) {
for (const key in data[originalField]) {
if (data[originalField].hasOwnProperty(key)) {
data[sField][key] = data[originalField][key];
}
}
}
}
return data;
}
- 记得一定要按 ctrl+s 保存文件!保存后文件旁边会有紫色小点,代表着生效了。刷新网页即可看到!
碎碎念
- 各科和总分的年级班级平均分、最高分、名次(名次就显示在排名等第那一栏)都能看了,这不香?( overview 里还有一个 gradeRankClass 字段,我推断这是班级平均分的年排?不清楚,有待考证)不用再苦苦等待老师发排名,还不用花那司马的 360 元,好耶!
- 至于为什么会有这个漏网之鱼,我觉得根本原因就是后端太懒了... 前端渲染界面使用的字段都是 xxxS(S 实际上就是 string 字符串简写),所以改 api 时就只改了这种字段,其他 convert 前的原始字段都没改...
- 不知道什么时候会被修复就是了...
enjoy it!🥰