垃圾校园网有个毛病,认证成功之后有个时效,认证过期之后就需要重新认证,经常用着用着突然就没网了,而且下周出去比赛,我还准备在宿舍放一台 Win 本,在外面如果有需要还能远程回来。为了保证网络不断开,就考虑在路由器上放一个脚本自动认证校园网,可惜学校用的不是锐捷,不然我也不会这么麻烦了。

此文章有更新内容


首先对校园网认证的网页进行抓包,用 Chrome 就可以了。
打开认证的网页,再打开开发者工具,进入 Network 标签,并勾选 Preserve log,点击登录,然后我们就获取到了一个用于认证的链接。
屏幕快照 2019-09-14 下午4.48.08.png
右键 - Copy - Copy as cURL,粘贴到记事本(下面粘贴的部分内容经过修改以保护隐私),观察其结构,很明显,开头部分 Authorization 中就是根据我们登录的账号密码生成的认证 token。我们当然不能直接通过这个链接进行认证,因为这个 token 随时变化,所以我们还需要动态获取这个 token。

屏幕快照 2019-09-14 下午4.59.12.png

为了找到这个 token,再回到认证的网页,退一步回到登录的页面,重新登录,有了新的发现。
屏幕快照 2019-09-14 下午4.50.42.png
同样的复制链接出来,我们看到最后一项 --data 中直接明文写着我们校园网的账号(username)和密码(password)。

屏幕快照 2019-09-14 下午5.00.07.png

访问一下上面这一串,得到它的返回值。

屏幕快照 2019-09-14 下午5.01.01.png

里面有 access_tokenrefresh_toekn,其中 access_token 应该就是我们需要的东西了,把它复制出来粘贴到上面的连接中替换其中的 token,在终端中执行,果然认证成功了。那么接下来的工作就是写脚本让其自动执行。
屏幕快照 2019-09-14 下午4.52.37.png
首先要从上面这么长一串返回值里把 access_token 截取出来。

session=$(curl 'http://172.16.251.172:8081/authentication/form' -H 'Authorization: Basic eGlhb2RlOnhpYW9kZTEyMw==' -H 'Origin: http://172.16.251.172:8081' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.9' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://172.16.251.172:8081/web/login-pc.html' -H 'X-Requested-With: XMLHttpRequest' -H 'Cookie: Hm_lvt_0da8a0118241f08b1fad788fac2f1f71=1566631566,1567051054,1567245949,1568125421' -H 'Connection: keep-alive' --data 'username=123456&password=123456')

str1=${session#*\":\"}
str2=${str1%%\",\"*}

这里截取子串的方法是我现学现写的...可能不够优雅但是能用(x
大概意思就是将返回的字符串赋给 session,把 session 中从左往右的第一个字符串 ":" 及其前面的字符全部删除,赋值给 str1,再把 str1 中从右往左最后一个 "," 及其之后的字符全部删除,就剩下我们需要的内容了。还需要注意的是转义字符 " 不能直接写,要加个 \

屏幕快照 2019-09-14 下午5.01.49.png

现在 str2 就是获取到的 token,将其与认证的链接拼接在一起。

#! /bin/sh
session=$(curl 'http://172.16.251.172:8081/authentication/form' -H 'Authorization: Basic eGlhb2RlOnhpYW9kZTEyMw==' -H 'Origin: http://172.16.251.172:8081' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.9' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://172.16.251.172:8081/web/login-pc.html' -H 'X-Requested-With: XMLHttpRequest' -H 'Cookie: Hm_lvt_0da8a0118241f08b1fad788fac2f1f71=1566631566,1567051054,1567245949,1568125421' -H 'Connection: keep-alive' --data 'username=123456&password=123456')

str1=${session#*\":\"}
str2=${str1%%\",\"*}

if  ping -c 1 baidu.com >/dev/null 2>&1 ; then
        echo yes
else
        echo no
        cmd="curl 'http://172.16.251.172:8081/portal/wifi/login' -X POST -H 'Authorization: bearer ${str2}' -H 'Origin: http://172.16.251.172:8081' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.9' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://172.16.251.172:8081/web/wifi-pc.html' -H 'X-Requested-With: XMLHttpRequest' -H 'Cookie: Hm_lvt_0da8a0118241f08b1fad788fac2f1f71=1566631566,1567051054,1567245949,1568125421' -H 'Connection: keep-alive' -H 'Content-Length: 0' --compressed --insecure"
        echo $cmd
        eval "$cmd"
fi

这里我加了一个 if 判断, ping baidu.com 如果网络连通就正常连接,如果不通再执行重新认证。

最后把这个脚本放在路由器上,添加 crontab 每分钟执行一次,完美。

Last modification:May 14th, 2020 at 11:49 am
If you think my article is useful to you, please feel free to appreciate