Published on

让你的好分数比别人更高级!

预计阅读时长:5分钟
Authors
  • avatar
    Name
    Roitium

TL; DR

修改好分数 js,让非 vip 用户能查看考试各科分数和总分的年级班级平均分、最高分、具体名次,比其他同学更快一步(

具体流程

  1. 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
    })
},
  1. 现在好分数就会把你当成高贵的氪金玩家了,会多调用一大堆 api 获得其他信息,但这些 api 后端都做了鉴权,用不了,会弹一大堆 "无权访问"toast,虽然不影响使用但看着难受,搞掉他!网络面板定位到具体的 api 调用请求(分别是 questions-lostknowledge-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)
+        }
    }))
}
}), 
  1. 继续点开网络面板,找 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;
}
  1. 记得一定要按 ctrl+s 保存文件!保存后文件旁边会有紫色小点,代表着生效了。刷新网页即可看到!

碎碎念

  1. 各科和总分的年级班级平均分、最高分、名次(名次就显示在排名等第那一栏)都能看了,这不香?( overview 里还有一个 gradeRankClass 字段,我推断这是班级平均分的年排?不清楚,有待考证)不用再苦苦等待老师发排名,还不用花那司马的 360 元,好耶!
  2. 至于为什么会有这个漏网之鱼,我觉得根本原因就是后端太懒了... 前端渲染界面使用的字段都是 xxxS(S 实际上就是 string 字符串简写),所以改 api 时就只改了这种字段,其他 convert 前的原始字段都没改...
  3. 不知道什么时候会被修复就是了...

enjoy it!🥰