垃圾校园网有个毛病,认证成功之后有个时效,认证过期之后就需要重新认证,经常用着用着突然就没网了,而且下周出去比赛,我还准备在宿舍放一台 Win 本,在外面如果有需要还能远程回来。为了保证网络不断开,就考虑在路由器上放一个脚本自动认证校园网,可惜学校用的不是锐捷,不然我也不会这么麻烦了。
首先对校园网认证的网页进行抓包,用 Chrome 就可以了。
打开认证的网页,再打开开发者工具,进入 Network 标签,并勾选 Preserve log,点击登录,然后我们就获取到了一个用于认证的链接。右键 - Copy - Copy as cURL
,粘贴到记事本(下面粘贴的部分内容经过修改以保护隐私),观察其结构,很明显,开头部分 Authorization
中就是根据我们登录的账号密码生成的认证 token。我们当然不能直接通过这个链接进行认证,因为这个 token 随时变化,所以我们还需要动态获取这个 token。
为了找到这个 token,再回到认证的网页,退一步回到登录的页面,重新登录,有了新的发现。
同样的复制链接出来,我们看到最后一项 --data
中直接明文写着我们校园网的账号(username)和密码(password)。
访问一下上面这一串,得到它的返回值。
里面有 access_token
和 refresh_toekn
,其中 access_token
应该就是我们需要的东西了,把它复制出来粘贴到上面的连接中替换其中的 token,在终端中执行,果然认证成功了。那么接下来的工作就是写脚本让其自动执行。
首先要从上面这么长一串返回值里把 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
中从右往左最后一个 ","
及其之后的字符全部删除,就剩下我们需要的内容了。还需要注意的是转义字符 "
不能直接写,要加个 \
。
现在 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 每分钟执行一次,完美。
One comment
好good!