一、前言

南京工业大学校园网登录需要输入账号密码,而且登录后会有一段时间的有效期,一般是 10分钟(现在好像是变成5分钟了)。虽然你可以在后台发一些心跳包来保持登录状态,但是这样依然有可能会掉线。如果能够保持持续在线状态并且自动登录,那当然是最好的。

一开始南工的校园网是没有验证码的,脚本就很好写,不过后来加了验证码,就没那么容易了。现在又把验证码取消了,所以登录脚本相对而言就比较简单了。反正校园网就是反反复复地改来改去,说不定哪天登录验证的接口又变了。

你最好拥有一台刷了 OpenWrt 的路由器,如果没有这个教程可能不太适合你。如果这个教程对你有帮助那当然是最好的,我也就是想写点东西。

So,let’s go!

二、抓取登录接口

我目前使用的脚本是基于下面这个登录页面的:

login

通过观察网络请求可以发现,登录使用的接口中需要知道 运营商用户名密码还有一个 IP 地址。这个IP地址就是运营商分配给你的IP地址,一般是动态的,所以需要动态获取。然后还有一堆其他的参数,好像都是固定的,不过我也没仔细研究。

简单来说下面这行命令就可以实现自动登录:

1
2
3
4
curl -s \
"http://10.50.255.11:801/eportal/portal/login?callback=dr1003&login_method=1&user_account=,0,\
"$username"@"$provider"&user_password="$password"&wlan_user_ip="$address"\
&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=me60&jsVersion=4.1.3&terminal_type=1&lang=zh-cn&v=7804&lang=zh"

其中,如果你的运营商是电信,那么 provider 就是 telecom,如果是移动,那么 provider 就是 cmccusernamepassword 就是你的校园网账号和密码,address 就是你的IP地址。

三、编写脚本

在路由器上创建一个脚本文件,比如 /root/projects/autologin/login.sh,然后复制下面的内容:

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
27
28
29
30
31
32
33
34
#! /bin/bash

# check wifi connection
function check() {
if curl -s baidu.com | grep -q html ;then
echo "[WARN] WiFi already connected!"
return 1
elif ping -w 1 -c 1 njtech.edu.cn > /dev/null 2>&1; then
return 0
else
echo "[ERROR] Cannot access Njtech-Home!"
return 1
fi
}

# login
function login() {
# provider="cmcc"
provider="telecom"
username="username"
password="password"
address=$(ifstatus wan | jsonfilter -e '@["ipv4-address"][0].address')
res=$(curl -s "http://10.50.255.11:801/eportal/portal/login?callback=dr1003&login_method=1&user_account=,0,"$username"@"$provider"&user_password="$password"&wlan_user_ip="$address"&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=me60&jsVersion=4.1.3&terminal_type=1&lang=zh-cn&v=7804&lang=zh")
if echo $res | awk -F'[:,]' '{print $2}' | grep -q 1; then
echo "[INFO] Login success!"
else
echo "[ERROR] Login failed!"
fi
}

# entry point
if check; then
login
fi

修改 providerusernamepassword 为你自己的信息,然后给这个脚本添加可执行权限:

1
chmod +x /root/projects/autologin/login.sh

这个脚本用的命令行工具有:

  • curl:用来发送请求
  • grep:用来匹配字符串
  • awk:用来处理字符串
  • jsonfilter:用来解析JSON

请确保你的路由器上已经安装了这些工具,如果没有,可以通过 opkg 安装:

1
2
opkg update
opkg install curl grep awk jsonfilter

四、开机自启和定时任务

设置开机自启的好处是,每次重启路由器后都会立即自动登录,减少等待连接的时间。而设置定时任务的目的是每隔一段时间就会自动尝试登录,保持在线状态。

4.1 开机自启

在路由器上创建一个启动脚本文件,比如 /etc/init.d/autologin,然后复制下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh /etc/rc.common

STOP=10
START=99

# commands to start application
start() {
/root/projects/autologin/login.sh &
}

# commands to stop application
stop() {
/root/projects/autologin/logout.sh
}

# start application after boot
boot() {
sleep 10
start
}

然后给这个脚本添加可执行权限:

1
chmod +x /etc/init.d/autologin

最后启用这个服务:

1
/etc/init.d/autologin enable

4.2 定时任务

在路由器上创建一个定时任务文件,比如 /etc/crontabs/root,然后复制下面的内容:

1
*/5 * * * * /root/projects/autologin/login.sh

这个任务的意思是每隔5分钟就会执行一次登录脚本。如果你想要修改间隔时间,可以修改 */5 这个值。

最后重启路由器,然后就可以看到效果了。

五、总结

这里附上一个退出登录的脚本,方便大家进行测试登录的效果,如 /root/projects/autologin/logout.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/bash

function logout() {
address=$(ifstatus wan | jsonfilter -e '@["ipv4-address"][0].address')
res=$(curl -s "http://10.50.255.11:801/eportal/portal/logout?callback=dr1003&login_method=1&user_account=drcom&user_password=123&ac_logout=1&register_mode=1&wlan_user_ip="$address"&wlan_user_ipv6=&wlan_vlan_id=0&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=4.1.3&v=2706&lang=zh")
if echo $res | awk -F'[:,]' '{print $2}' | grep -q 1; then
echo "[INFO] Logout success!"
else
echo "[ERROR] Logout failed!"
fi
}

logout

这个脚本不需要做任何修改,直接就可以使用,不过你需要给这个脚本添加可执行权限:

1
chmod +x /root/projects/autologin/logout.sh

最后,如果你有什么问题或者建议,欢迎在评论区留言,我会尽快回复的。