“深澜”认证系统 Web 版的自动登陆实现

“深澜” 认证系统有很多不同的版本在被实际使用,有客户端版也有网页认证版,现在仅讨论网页版(Web 版)认证系统的自动登陆实现。

旧版认证系统的自动登陆

“深澜” 的 Web 版也有很多不同的历史版本,其中旧版本的认证系统不需要获取当前时间戳进行加密,而密码也仅使用 Base64 进行编码传输,可以说对于一个固定的账号,每次登陆所发送的数据包请求几乎相同,只需使用抓包软件对某一次的登陆行为进行抓包导出 Curl 命令,并在路由器端设置定时或开机运行脚本进行模拟发包(如果有定时断电或定时重启的话)。

旧版登陆界面:

旧版登陆界面

新版认证系统的自动登陆

新版“深澜”的认证系统(SRun portal server golang version V1.18 B20190314)加上了时间戳验证以及解决跨域问题的callback参数,导致每次发送请求的参数都不同,因此若要模拟发包需要探究出一部分参数的加密方式,具体方式可以参照这篇文章:《深澜认证协议分析,python模拟登录》

但是我根据文章的方法或者直接使用文章中所附的代码都无法正常使用,提示错误“INFO Error锛宔rr_code=2”(这是“深澜”系统常见的登陆错误,根据某个问卷星调查网页的说明,“此情况原因为并非登录页面登录造成的”),估计可能和使用固定的 callback 有关。同时文章作者的代码实现是 Python ,自己的 K2P 路由闪存空间不够大,不够安装 Python 运行环境和一堆库,而我的辣鸡代码水平无法自己用C/C++/Shell实现同样的功能,所以放弃了这种方法。

此时想到了模拟点击登陆。鉴于路由器容量太小,所以还是准备把运行环境搬上与路由器相连的树莓派,自动登陆的逻辑是每天早上来电时树莓派与路由器自动启动,树莓派连上路由器的WiFi,鉴于有时候树莓派启动太快,启动脚本设定了过五分钟之后检测是否连接上了WiFi,若没有连上就重启树莓派,此时通常能自动连上WiFi了,然后使用脚本模拟点击登陆认证系统。

树莓派上装的是 Raspbian(基于 Debian )系统并且没有安装图形化界面,因此选择使用无头 Chromium 来做模拟点击的接受浏览器,Debian 使用 apt 安装 python3-pipchromium-driver (selenium 所必需的 Chromium 的驱动)会自动安装全部所需软件(包括 Chromium) ,然后使用 pip3 install selenium 安装 selenium 的 Python 包。

代码很简单,已传上Github,要注意的是 >browser = webdriver.Chrome(options=options)

中的 options=options 不可忽略,这是为 Chromium 的启动添加参数的,包括禁用沙盒(root 运行不能使用沙盒)、禁用 GPU、无头模式(以在字符串界面运行程序)和忽略证书错误等,少了这些参数很可能会跑不起来或者运行错误

browser.get("http://www.baidu.com/")

是借用认证成功前访问任何网站都会自动跳转到认证系统的特性来得到正确的认证地址,实际使用中也可以用已知的正确认证地址来替换(自动跳转可以很大程度避免“INFO Error锛宔rr_code=2”错误,但是有时候网络出问题时自动跳转可能会失效)。


2019.12.12 更新

《深澜认证协议分析,python模拟登录》文中提供的代码实际上是可以用的,需要做如下修改:

  1. 把所有登录IP改为自己学校的登录IP
  2. ac_id='1'的定义改为ac_id='2'
  3. 修改用户名密码,记得用户名加@后缀,选取不同运营商,这和各大高校的设定有关
  4. srun_base64.py中的else改为elif len(s) - imax == 2: