NJUST 教务系统免验证码直链登录初探

很早以前我就好奇过南理工助手作为一个非官方 APP,是怎么做到绕过 NJUST 教务系统那个人眼常常不能分辨的登录验证码的。

verification code

(乍一看,$\tau$ ?)

为此我加入了南理工助手开发者创建的交流反馈群……

qq

如此看来真是辛苦开发者大佬了呢!本文到此结束。

后来开发者(群主)终于说出了实情:那个验证码是假的

咦,假的是什么意思?我曾经试图去查南理工助手的源码(hqzxzwb/njustHelper),终于因为看不懂 Kotlin 语言而放弃了。

再后来,过了很久,在某次教务处前端崩溃之际,又有大佬做出了查 GPA 和课表的网站:南理工 GPA 助手(注:此网站原开发者已毕业,故交于一新开发者之手,网址也更改为 http://gpa.nust.pub/

很显然,此网站也不用输万恶的验证码。在它的网站说明里,我终于找到了其中玄机:原来这个叫“强智”的教务系统实在是有够🌶🐔,它其实只是接收并验证了 GET 请求中的几个参数而已。换言之,如果我们提前把参数写进 url 里,访问直链就可以直接进入教务系统。

参数规则如下:

  1. method=verify

  2. USERNAME 即完整的 12 位学号,其中英文字母应大写

  3. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/local/bin/python
from hashlib import md5

def login(username, password):
    url = "http://202.119.81.112:9080/njlgdx/xk/LoginToXk?method=verify&USERNAME=" + \
        str(username.encode('UTF-8'), 'UTF-8') + '&PASSWORD=' + \
        str(md5(password.encode('UTF-8')).hexdigest().upper())
    return url

while 1:
    username = input("Input ID: ")
    password = input("Input password: ")
    url = login(username, password)
    print(url)
    print("-" * 50)

然后在 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import webbrowser
import win32clipboard as w
import win32con
import win32api
from hashlib import md5

def setText(aString):
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
    w.CloseClipboard()

def login(username, password):
    url = "http://202.119.81.112:9080/njlgdx/xk/LoginToXk?method=verify&USERNAME=" + \
        str(username.encode('UTF-8'), 'UTF-8') + '&PASSWORD=' + \
        str(md5(password.encode('UTF-8')).hexdigest().upper())
    return url

while 1:
    username = input("Input ID: ")
    password = input("Input password: ")
    url = login(username, password)
    print(url)
    setText(url)
    webbrowser.open(url, new=0, autoraise=True)
    print("-" * 50)

运行效果如下:

py_win

以上代码都可以在我的 repo jasongzy/njust-jwc 里找到。

另外,我还用 pyinstaller 把 Windows 版本的代码打包成了 exe,实现无需安装任何软件就能运行。可以点击这里下载。

实话说,这次代码实现的实用性不大,纯粹是学习锻炼一下。我曾设想在未来做一个类似功能的网页放在自己的 VPS 上供外界访问,如今也已基本完工,具体内容可以关注我之后的文章。

-------------本文结束    感谢您的阅读-------------
0%