默认分类 2026-01-19 18:33 5

教务系统查分,我是如何从“手动刷新”进化到“服务器自动推送”的

前言:期末周的焦虑

每当期末考结束,最折磨人的不是考试本身,而是随后漫长且无规律的“出分等待期”。每天几十次打开教务系统、输入验证码、点击查询,得到的往往只有令人失望的空白。

作为一个不想把时间浪费在重复劳动上的技术党,我决定动手写一个自动化脚本。我的目标很明确:全自动监控,出成绩了直接发通知到手机,彻底告别手动刷新。

第一阶段:天真的想法与“RSA 之墙”

起初,我希望能用 iOS 自带的 “快捷指令” (Shortcuts) 实现一个纯本地的方案。我的设想是:

快捷指令发送 POST 请求 -> 模拟登录 -> 获取成绩 -> 弹窗显示。

然而,当我打开 F12 抓包工具分析学校教务系统的登录接口时,现实给了我当头一棒。

拦路虎:RSA 非对称加密

我发现登录请求中的密码字段不是明文,也不是简单的 MD5,而是一串长得离谱的 Base64 乱码。进一步分析网页源码(login.js),我看到了这段逻辑:

// 教务系统加密逻辑简化
var rsa = new JSEncrypt();
rsa.setPublicKey(key); // 从服务器获取公钥
var encryptedPass = rsa.encrypt(password); 

// RSA 加密

教务系统使用了 RSA 加密。这意味着每次登录前,必须先请求服务器获取公钥(Exponent 和 Modulus),然后对密码进行复杂的模幂运算。
快捷指令的极限
这直接判了原生快捷指令的“死刑”。

  • 算力缺失:快捷指令的原生模块不支持 RSA 所需的大数运算。
  • 环境限制:虽然可以通过内嵌网页运行 JS,但在纯后台请求模式下极不稳定。
  • 加密库缺失:不像 Python 有 Crypto 库,快捷指令处理这种加密极其痛苦。

想要在手机本地通过原生指令“硬刚”RSA,几乎是不可能的任务。
第二阶段:降维打击——服务器 Python 方案
既然手机本地算力有限,我把目光投向了我的云服务器(VPS)。Python 拥有强大的生态库,处理 RSA 加密简直易如反掌。
我决定转换思路:服务器负责“脏活累活”(加密、请求、监控),手机只负责“接收通知”和“下达指令”。

  1. 攻克加密逻辑
    利用 Python 的 pycryptodome 库,我重写了加密逻辑。这里还遇到了一个坑:学校返回的 Exponent 有时候是 Hex 格式,有时候是 Base64 格式(如 AQAB),我必须写一个兼容函数:
def encrypt(pwd, pub_key, exponent):
    rsa_n = base64.b64decode(pub_key)
    try:
        # 尝试 16 进制解析
        rsa_e = int(exponent, 16)
    except:
        # 兼容 Base64 格式
        rsa_e = bytes_to_long(base64.b64decode(exponent))
    key = RSA.construct((bytes_to_long(rsa_n), rsa_e))
    return base64.b64encode(PKCS1_v1_5.new(key).encrypt(pwd.encode())).decode()
  1. 部署 24 小时后台监控
    解决了登录问题,我在服务器上部署了一个死循环监控脚本。

    • 逻辑:每隔 10 分钟自动查询一次。
    • 防封:伪造 User-Agent 和 Ajax 请求头,模拟真实浏览器。
    • 持久化:使用 nohup 让脚本在后台静默运行。
    • 推送:一旦比对发现新成绩,直接通过 Bark/Server酱 推送到我的手机。

    服务器后台运行命令

    nohup python3 monitor_final.py > grade.log 2>&1 &

现在,我再也不用打开教务系统了。只要手机一响,我就知道:出分了。
第三阶段:快捷指令的“回归”
虽然有了后台监控,但我有时候还是想主动查一下(比如刚考完试那一刻)。我不想打开 SSH 软件输命令,于是我又想到了 iOS 快捷指令。
这次,快捷指令不再负责计算,而是作为一个“触发器”
利用快捷指令的 “通过 SSH 运行脚本” (Run Script over SSH) 功能:

  • 手机点击桌面图标。
  • 快捷指令连接服务器。
  • 服务器运行 Python 脚本进行查询。
  • 返回结果,手机顶部弹窗显示。

这样,我既拥有了服务器级的强大处理能力(搞定 RSA),又保留了原生 App 般的丝滑体验(点击即看,不跳转)。
总结
技术折腾的尽头是“自动化”。
从试图在本地强行破解,到利用服务器算力进行“降维打击”,这套方案完美解决了两个痛点:

  • RSA 加密困难:交给 Python 处理。
  • 重复劳动:交给 nohup 后台监控。

现在的我,终于可以优雅地躺平,坐等成绩自己“找上门”了。

Tags: python, 自动化

发表评论