openwrt 实现 Drcom Web 登录认证 (两种方式)
前言
我校(西安石油大学)在20年左右全校覆盖了ac+ap方式Drcom Web认证。网线连接网络模块+dogcom验证方式已逐渐失效(网络模块坏了不给修)。
故只剩下了Web认证这条路。此次方案采取的是无线中继 + 认证方式,这种方式对路由器的性能有一定要求(网络带宽最多50M倒也不用太担心不够)。
首先openwrt路由器中继XSYU_WLAN ap信号,然后用路由器进行Web认证。这之后连接路由器的设备可实现上网。
参考:
Dr.COM校园网多设备解决方案——路由器 Padavan/LuCI 固件自动网页认证+Telegram Bot 定时发送连接情况
天津师范大学 校园网登陆脚本 Dr.Com
无线中继
若可以有线连接,一定要有线有线。我校有线连接就无法连接上校园网,故只可以无线连接。
中继步骤
进入 网络-无线 ,这里有2个无线,看红线画着的,一个表示2.4G,另一个表示5G。建议使用5G去中继,设备去连接2.4G(反过来也可以)。点击扫描。
找信号最强的 XSYU_WLAN ,点击加入网络
这里直接点提交就ok。
这时,5G下应该多出来一个名字是XSYU_WLAN,模式为Client的。这样就中继完成了。
这时候连上路由器的设备应该就相当于连接上了XSYU_WLAN。
推荐把同在5G信号下的另一个wifi(模式为Master)移除,只留下2.4G的wifi给设备连接。
路由器Web认证
Web认证有两种方式,一种是我基于天津师范大学 校园网登陆脚本 Dr.Com修改的shell脚本,另一种是我开发的openwrt插件。
两种插件都需要进行一些配置的修改。
配置获取
在电脑上打开未认证时的认证网页,然后按F12,打开网络(Network)选项,接着认证登录,点击其中几个包,找到形似截图的这个包。
看到请求网址那里,需要记录下:
- 请求网址开头的ip,记为server。
- server冒号后面的数字,记为port
- wlan_ac_name=后面的字符串,直到&为止(不包括&下同)
- wlan_user_ip=后面的ip,这是学校分配下的内网ip
使用第二种方法的需要额外记录以下信息:
打开cmd
,输入ipconfig
找到校园网对应的那一块(即ip为刚刚记录的wlan_user_ip),记录下他的子网掩码(net mask)。注意截图不是win系统的:
方法1:shell脚本
将如下脚本的配置区修改为自己的,然后上传至路由器的/etc/storage/drcom_cron.sh
目录下,添加crontab计划任务。
#!/bin/bash
# 西安石油大学 校园网登陆脚本 2023.08
# 适用于: openwrt
# by: 1v7w
# 本脚本保存至 /etc/storage/drcom_cron.sh
# 添加计划任务
#『系统 - 计划任务』
# */10 * * * * /etc/storage/drcom_cron.sh
# --------- 配置区 ---------
server=10.123.0.253
user=202000000000 # 修改成你的账号
password="password" # 修改成你的密码
wlanacname="HUXIAN_C1_1F_107_H3C_AC_01" # 修改成你所连接的AP的名字
# --------- 配置区 ---------
html_file="/tmp/drcom_html.log"
login_out_file="/tmp/drcom_login.log"
logger -t "【Dr.COM网页认证】" "开始定时检测"
curl -s "http://${server}" > ${html_file}
check_web=`grep "Dr.COMWeb" ${html_file} | head -n1`
check_status=`grep "Dr.COMWebLoginID_0.htm" ${html_file} | head -n1`
# Dr.COMWebLoginID_0.htm 登陆页(未登陆)
# Dr.COMWebLoginID_1.htm 注销页(已登录)
# Dr.COMWebLoginID_2.htm 登陆失败页
# Dr.COMWebLoginID_3.htm 登陆成功页
if [[ "$check_web" == "" ]]; then
logger -t "【Dr.COM网页认证】" "访问认证网页失败"
elif [[ "$check_status" != "" ]]; then
#尚未登录
logger -t "【Dr.COM网页认证】" "上网登录窗尚未登录"
# 此处如果不能正确获取ip则需要进行修改
ip=$(ifconfig | grep inet | grep -v inet6 | grep -v 127 | grep -v 192 | awk '{print $(NF-2)}' | cut -d ':' -f2) # 这里如果不能获取到内网ip则自己修改试试
if [[ "$ip" == "" ]]; then
logger -t "【Dr.COM网页认证】" "获取当前内网ip失败"
else
timestamp_0="$(date +%s)526"
logger -t "【Dr.COM网页认证】" "当前内网ip:${ip}"
timestamp_1="$(date +%s)153"
url="http://${server}:801/eportal/?c=Portal&a=login&callback=dr${timestamp_1}&login_method=1&user_account=${user}&user_password=${password}&wlan_user_ip=${ip}&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=${wlanacname}&jsVersion=3.0&_=${timestamp_0}"
echo $url
curl -s "$url" \
-H 'Connection: keep-alive' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.57' \
-H 'Accept: */*' \
-H 'Referer: http://${server}/' \
-H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
> ${login_out_file}
result=`grep -Eo '"result":"[0-9]+"' ${login_out_file} | sed -r 's/"result":"([0-9]+)"/\1/g'`
result=`[[ "$result" == 1 || "$result" == "ok" ]] && echo "登陆成功" || echo "登陆失败"`
logger -t "【Dr.COM网页认证】" "上网登录窗未登录,尝试登陆结果:${result} " `cat ${login_out_file}`
fi
else
#已经登录
logger -t "【Dr.COM网页认证】" "上网登录窗之前已登录"
fi
logger -t "【Dr.COM网页认证】" "结束定时检测"
方法2:openwrt插件
插件地址如下,使用方法请看readme
opwnwrt-webdogcom
webdogcom