服务器校园网登录验证解决方案

前两天把实验室的一台旧台式机装上了 Ubuntu Server,打算当作测试服务器使用着玩。
装上之后意识到一个严重的问题:实验室电脑连接外网时候需要打开浏览器输入学号进行认证。

而对于服务器版的 Ubuntu Server 来说只有黑乎乎的命令行界面。根本没有浏览器可以打开,所以网络认证就无从谈起。。

就在准备打算重装一个 Ubuntu Desktop 的时候,某君提醒可以尝试使用 curl 来访问认证 API!经过这个提醒,我打算使用 Ubuntu Server
16.04 自带的 Python3 来实现以上功能。

首先,找到网络认证的网页 http://172.16.254.10/0.htm

随便输入账户密码后提交,同时使用 Fiddler 抓包数据。

在上一步中,我提交的账户密码分别为 12345678 和 123456。而可以看到 upass 字段处的密码显然是经过加密的。

这就很头疼了。。

这时只能开始一步步地阅读,页面中的 js 代码了。
有关代码如下:

将密码加密部分的代码翻译为 Python 如下:

def encrypt_pass(upass):
	pid = '2'
	calg='12345678'
	tmpchar = pid+upass+calg
	return calcMD5(tmpchar)+calg+pid

def calcMD5(content):
	return hashlib.md5(content.encode('utf-8')).hexdigest()

请求 Http 接口部分使用 Python 自带的库 Urllib 来实现。
全部代码完成后运行。然后
ping www.baidu.com

完整的源码在 Github 上。

浏览器只是特殊的 “Httpclient”。所以不仅仅网络认证可以使用程序的方式来实现,任何可以由浏览器实现的功能都可以程序来实现。