很早以前我就好奇过南理工助手作为一个非官方 APP,是怎么做到绕过 NJUST 教务系统那个人眼常常不能分辨的登录验证码的。
为此我加入了南理工助手开发者创建的交流反馈群……
如此看来真是辛苦开发者大佬了呢!本文到此结束。
后来开发者(群主)终于说出了实情:那个验证码是假的。
咦,假的是什么意思?我曾经试图去查南理工助手的源码(hqzxzwb/njustHelper),终于因为看不懂 Kotlin 语言而放弃了。
再后来,过了很久,在某次教务处前端崩溃之际,又有大佬做出了查 GPA 和课表的网站:南理工 GPA 助手(注:此网站原开发者已毕业,故交于一新开发者之手,网址也更改为 http://gpa.nust.pub/)
很显然,此网站也不用输万恶的验证码。在它的网站说明里,我终于找到了其中玄机:原来这个叫“强智”的教务系统实在是有够🌶🐔,它其实只是接收并验证了 GET 请求中的几个参数而已。换言之,如果我们提前把参数写进 url 里,访问直链就可以直接进入教务系统。
参数规则如下:
-
method=verify
-
USERNAME
即完整的 12 位学号,其中英文字母应大写 -
PASSWORD
为密码字串的 32 位大写 MD5 值,可以使用 MD5 在线加密生成
此外,本科综合教务管理系统的网址是 http://202.119.81.113:8080/(吐槽:竟然是 ip + port 的 url …),但接收参数的并非 8080 端口,而是 9080,url 为 http://202.119.81.112:9080/njlgdx/xk/LoginToXk
。
用这个规则可以非常简单地组合出一个直链登录 url。比如学号为 917000000000
,密码是 password
,则 url 为:http://202.119.81.112:9080/njlgdx/xk/LoginToXk?method=verify&USERNAME=917000000000&PASSWORD=5F4DCC3B5AA765D61D8327DEB882CF99
(解释: GET 的参数要放入 url 的话,需要在网址后面加 ?
,然后写 name=value
的形式,多个参数之间使用 &
连接)
心满意足地生成了我自己的登录直链之后,我又想尝试用代码自动实现一下。当时懂一点的语言里比较合适的就是 Python 了。
先在 Linux 下写,用 Python 算个 MD5 也就调个库的事。做成了循环的模式,输入学号密码之后打印链接,然后可以继续输入下一组。完整代码如下:
1 |
|
然后在 Windows 下也实现了一遍,增加了直接将链接复制到剪贴板,然后自动打开浏览器访问 url 的功能。Windows 下的开发有点小麻烦,很多库都可能需要手动去安装。这里我用到了 pywin32
,需要先 pip install pywin32
一下。
BTW,Windows 下 pip 可能速度很慢,最好换成国内的源(推荐清华源)。方法是新建
%APPDATA%\pip\pip.ini
,修改 ini 文件内容为:[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple保存即可。
完整代码如下:
1 |
|
运行效果如下:
以上代码都可以在我的 repo jasongzy/njust-jwc 里找到。
另外,我还用 pyinstaller 把 Windows 版本的代码打包成了 exe,实现无需安装任何软件就能运行。可以点击这里下载。
实话说,这次代码实现的实用性不大,纯粹是学习锻炼一下。我曾设想在未来做一个类似功能的网页放在自己的 VPS 上供外界访问,如今也已基本完工,具体内容可以关注我之后的文章。