jingtiaopi 发表于 2024-11-15 17:09

查看《好·分·数》平台的成绩

本帖最后由 jingtiaopi 于 2024-11-22 16:31 编辑

因为外甥女期中考试结束,作为舅舅的我在打电话的时候,顺便问了一嘴考试咋样(作为过来人,明知孩子最烦问这个{:1_896:},但还是想知道考得咋样,明年就中考了。。。)。得知学校使用了《好分数》这个平台,不充会员就看不了分数,只显示一个等级。心里很不爽,但懒惰的我第一个想法就是来52找找有没有成品{:1_907:}。找到了本站作者 @nuz 的好分数.exe,直接赠送爱币、热心值,下载体验一番,可惜了一直报错“无效的用户密码或无互联网链接”。因 qfluentwidgets 这个库一直安装不成功没法调试,只能自己动手了。

现提供可直接运行的 Windows 版本,界面粗糙了些,只是在虚拟机下的 Windows10 系统上测试没有问题。但有个问题是在 Windows 环境下,数据库保存不了用户名和密码,目前每次打开软件之后都需要重新输入(Mac 下不好调试,我再研究下,实在不行改为存文件吧)。


https://www.123684.com/s/EgIvTd-GGgk3?提取码:52pj


'''
--- 本程序仅查看《好·分·数》的总成绩、各科目分数
--- 因学校使用了好·分·数平台查分等其他功能,这本该学校义务提供的事项现在只能花钱才能获取,(有点想 TM M人 -_-#)
--- 参考本站作者 @nuz 的成品 好分数.exe,可惜接口有问题,一直提示"无效的用户密码或无互联网链接"。拉取代码调试一下吧
--- 结果 qfluentwidgets 这个库一直安装不成功,无奈...
--- 移动端的可降级 app,我看的 V3.10.0 的版本,可直接显示分数
--- 先暂且提供源码吧,后续增加 UI(看看大家的意见) 和其他功能(可行的话),另外后续还会再提供 iOS 版本的快捷指令
--- 本代码仅供学习与参考,不做其他非法用途
--- ⚠️ 温馨提示:需要修改以下 'userName' 和 'password' 字段的内容
'''
import requests
from base64 import b64encode

class Hfx(object):
    def __init__(self):

      # TODO: 修改登录好分数平台的用户名、密码
      self.user = {
            # 手机号 or 邮箱 (邮箱账号未验证)
            'userName': '',
            'password': ''
      }
      self.userInfo = {}
      self.cookies = {
            'hfs-session-id': ''
      }
      self.headers = {
            'Accept': 'application/json, text/plain, */*',
            'Content-Type': 'application/json;charset=UTF-8',
            'Origin': 'https://www.haofenshu.com',
            'Referer': 'https://www.haofenshu.com/',
            'Sec-Fetch-Dest': 'empty',
            'Sec-Fetch-Mode': 'cors',
            'Sec-Fetch-Site': 'cross-site',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
            'deviceType': '3',
            'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"macOS"',
      }
      self.base_url = 'https://hfs-be.yunxiao.com'

    def login(self):
      json_data = {
            'loginName': self.user['userName'],
            'password': b64encode(hfx.user['password'].encode('utf-8')).decode('utf-8'),
            'roleType': 2,
            'loginType': 1,
            'rememberMe': 2,
      }

      response = requests.post(f'{self.base_url}/v2/users/sessions', cookies=self.cookies, headers=self.headers,
                                 json=json_data).json()
      if response['code'] == 0:
            self.userInfo = response['data']
            token = self.userInfo['token']
            self.cookies['hfs-session-id'] = token
            self.headers['Hfs-Token'] = token
            self.getUserSnapshot()
      else:
            print(response['msg'])

    def getUserSnapshot(self):
      response = requests.get(f'{self.base_url}/v2/user-center/user-snapshot', cookies=self.cookies,
                              headers=self.headers).json()
      if response['code'] == 0:
            linkedStudent = response['data']['linkedStudent']
            keys = list(linkedStudent.keys())
            for key in keys:
                self.userInfo = linkedStudent
            print(f'{self.userInfo["studentName"]} --- {self.userInfo["schoolName"]}·{self.userInfo["sgrade"]}'
                  f'{self.userInfo["className"]}班')
            self.getExamList()
      else:
            print(response['msg'])

    def getExamList(self):
      params = {
            'start': '-1'
      }
      response = requests.get(f'{self.base_url}/v3/exam/list', params=params, headers=self.headers).json()
      if response['code'] == 0:
            data = response['data']
            list = data['list']
            print(f'\n{data["limitTip"]}\n')
            for paper in list:
                self.getOverviewExam(paper['examId'])
      else:
            print(response['msg'])

    def getOverviewExam(self, examId): # 2299726
      response = requests.get(f'{self.base_url}/v3/exam/{examId}/overview', cookies=self.cookies,
                              headers=self.headers).json()
      if response['code'] == 0:
            data = response['data']
            papers = data['papers']

            print(f'● 年级总人数:{data["gradeStuNum"]}人 \t 班级总人数:{data["classStuNum"]}人')
            print('-----------------------------------')
            print(f'● {data["name"]}\n')
            # print(f'\t得分:{data["score"]}分/{data["manfen"]}分,得分评级:{data["scoreS"]},'
            #       f'班级排名:{data["classRank"]}(仅作参考,不准),班级评级:{data["classRankS"]}')
            print(f'\t得分:{data["score"]}分/{data["manfen"]}分,得分评级:{data["scoreS"]},班级评级:{data["classRankS"]}')
            for paper in papers:
                print(f'\t{paper["name"]}\t\t{paper["score"]}分/{paper["manfen"]}分,得分评级:{paper["scoreS"]}')
            print('\n\n')

      else:
            print(response['msg'])

if __name__ == '__main__':
    hfx = Hfx()
    hfx.login()

gaoxiaoao 发表于 2024-11-15 17:48

感谢楼主分享,有技术再给大外甥整一个考试题库。。。。

最新的 发表于 2024-11-15 18:04

好分数:我们已经在修复了{:1_907:}

vikin963 发表于 2024-11-15 18:13

好分数:bug已修复了

popofeng 发表于 2024-11-15 18:57

我也想有个这样有技术的好舅舅。

zpwz 发表于 2024-11-15 20:28

好分数:只有好分数,才会急于知晓好分数

vv168888 发表于 2024-11-15 20:35


我也想有个这样有技术

zyqking 发表于 2024-11-15 20:43

有技术篡改成绩,给大外甥整个高分

jingtiaopi 发表于 2024-11-15 20:56

gaoxiaoao 发表于 2024-11-15 17:48
感谢楼主分享,有技术再给大外甥整一个考试题库。。。。

那我这个舅舅就彻底不认了{:1_890:}

jingtiaopi 发表于 2024-11-15 20:56

最新的 发表于 2024-11-15 18:04
好分数:我们已经在修复了

哈哈哈 且用且珍惜
页: [1] 2 3
查看完整版本: 查看《好·分·数》平台的成绩