18143453325 在线咨询 在线咨询
18143453325 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 校园网自动登录全平台解决方案

校园网自动登录全平台解决方案

时间:2023-04-18 16:50:02 | 来源:网站运营

时间:2023-04-18 16:50:02 来源:网站运营

校园网自动登录全平台解决方案:

TL;DR

最近考研复习有点枯燥,折腾一些好玩的。学校这个校园网有点脑残,应该是根据 IP 和 MAC 地址共同判断是否同一设备,如今不管是 Android 、iOS 还是 Windows 都默认开启了随机 MAC 的功能,说的是为了防止不同 WiFi 网络对设备的追踪,这无可厚非,还是开着比较好,而且我研究了下,这个随机 MAC 应该是针对不同 WiFi,相同 WiFi 使用的 MAC 还是一样的,不过我们学校宿舍和教学楼的 WiFi 名不一样。

但还没完,不仅如此,如果只是在宿舍里,路由器或者说是光猫虽然采用 DHCP 分配 IP,但毕竟设备数量有限,学过计网的应该知道 DHCP 虽然是动态分配 IP,但其实每次重新分配的时候会优先分配相同的 IP,除非该 IP 已经被分配了,基本上不会出现重新登录的情况,比如长期放在宿舍的电脑。但手机不一样,经常是教学楼和宿舍两头跑,一到教学楼,噩梦就开始, 有时候你换一个教室都会让你重新登录。

由于复习的时候,我的 iPad 和手机都需要连接校园网,所以我不得不让 iPad 在登录校园网的时候伪装成电脑(这个很简单,等会再说),但这样会导致下次打开电脑的时候就无法自动连接上校园网了。所以折腾来折腾去,每个平台都折腾出了连接校园网自动登录的方案(macOS 有方案未测试)。

顺便说下宿舍安装路由器的问题,很简单,我们学校没做限制,光猫的 LAN 口连接上路由器的 WAN 口,再连接上路由器的 WiFi 同样登录一次,这样就把校园网帐号绑定到路由器了。但是没啥意义,毕竟带宽就那么点,不划算,除非你设备特别多。

实现连接校园网自动登录需要分为两步

  1. 检测连接到校园网
  2. 执行登录脚本

一键登录脚本

本着解耦的原则,尽量做到登录与检测互不关联,可以分开工作,也方便一套代码跑所有平台。但是吧,理想很丰满,现实很骨感,电脑端可以很方便的使用 Python 脚本,手机上就不行了,就算使用 Nodejs,也会带来很大的成本(电量,内存)开销。当然这个登录逻辑很简单,手机上使用快捷指令和 MacroDroid 也能轻松实现。

登录原理

我们学校是 Web 登录,只需要发送一个 GET 请求即可,当然更多的学校是使用 POST 请求,更加安全。浏览器登录的时候直接 F12 打开开发者工具,找到类似于这么一长串的连接,如果登录时会跳转,建议打开顶上的 Preserve log 选项,这样跳转出去了再返回这些信息还在。

http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2Cxxxxxxx%40cmcc&user_password=Tender520Family&wlan_user_ip=10.17.163.90&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3&v=5407 找到后划到最下边,可以格式化参数,点击 view URL encoded 选项,可以解码 URL,可以正确显示标点符号。比如 , 是 %2C, @ 是 %40




参数分析

主要是

这三个参数比较重要,需要自己填写,其他参数不用改,jsVersion 和 v 这两个参数甚至可以不需要,这需要自己尝试,看哪些参数省略掉同样可以登录。至于为什么 wlan_user_mac 全 0,处于待填充的状态,我尝试过把这个 参数修改为非本机 mac,无法登录。有时候这个 http 请求会读取 mac 地址,比如下面这个,不过都能登录。




脚本逻辑

脚本主要用来获取 ip 和发送 http 请求,通过分析返回值来判断是否登录成功,如果该帐号已登录,就递归调用登录函数来重新登录。 返回值主要有以下几个

这里的返回值为 jsonp,即返回的是一个函数,以达到跨域的目的

脚本编写

Windows、Linux、Mac

均使用 Python 脚本,你需要安装 Python 的运行环境。

def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] s.close() return ipdef login(ip, args): args.ip = ip args.device = 0 if args.device == 'pc' else 1 res = requests.get('http://192.168.200.2:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C{device}%2C{account}%40{operator}&user_password={password}&wlan_user_ip={ip}&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name='.format_map(vars(args))) if '"msg":""' in res.text: print('当前设备已登录') return elif r'/u8ba4/u8bc1/u6210/u529f' in res.text: print('登录成功') return elif 'bGRhcCBhdXRoIGVycm9y' in res.text: print("密码错误") return elif 'aW51c2UsIGxvZ2luIGFnYWluL' in res.text: login(get_ip(), get_args()) else: print("您可能欠费停机") returnPOST 请求和 GET 请求的区别就是 GET 请求会把所有参数写在链接里,这样直接访问这个连接就可以登录了(当然,还需要动态获取 IP 地址)。写脚本的时候就很方便,直接复制这个链接,GET 一下就行了。而 POST 请求的链接很短,请求的参数会单独列出来。首先要看请求头中的 Content-Type 字段

form 表单在校园网登录里应该比较普遍,我随便写一下,自己根据实际情况改就行了。

#登录地址post_addr="http://xxx.xxx"#构造头部信息post_header={ 'Content-Type': 'application/x-www-form-urlencoded',}#构造登录数据post_data={ 'user_account': '1658xxx', 'user_password': 'xxxxxxx'} #发送post请求登录网页requests.post(post_addr,data=post_data,headers=post_header)为了使用方便,脚本做成了命令行输入。在 Windows 上,你可以再进一步封装这个命令成 bat 文件来实现点击执行,这个后面再说。

# 运营商默认为 cmcc,伪装设备默认为 pc,这两个选项可以不用写> python main.py 1658xxxx passxxxx -o cmcc -d pc> python main.py -h usage: main.py [-h] [-o {cmcc,telecom}] [-d {pc,phone}] account password positional arguments: account password optional arguments: -h, --help show this help message and exit -o {cmcc,telecom}, --operator {cmcc,telecom} operator, cmcc or telecom -d {pc,phone}, --device {pc,phone} fake device, phone or pc

iOS

iOS 有个强大的工具——快捷指令,这个很简单,直接导入就行了,要用 Safari 打开链接导入,导入的时候会填写帐号密码等等。如果无法导入,需要在设置-快捷指令-打开运行不受信任的快捷指令选项。如果是 POST 请求下面这样,可以把这个快捷指令添加到桌面,也可以当作小部件。




Android

可能需要 Root 安装 Busybox,也有不需要 Root 的方法,等我有空再完善。
Android 也有一个强大的工具——MarcoDriod,使用逻辑和快捷指令一毛一样,说实话是要比快捷指令好用一点。下载文件(校园网.category)选择 MacroDriod 打开就可以完成导入。<自动登录校园网>是用来检测是否连接到校园网的,一旦连接就调用<一键登录校园网>

导入后需要填写以下几个变量

不过如果是 POST 请求的话,我用的是 Shll 脚本来执行 curl 命令,只需要

curl -X POST -d 'user_account=1658xxx&user_password=passxxxx' http://xxx.xxx

检测连接到校园网

如何检测连接到校园网呢,我的方案是判断连接 WiFi 的名称,比如 CQUPT 的 WiFi 都有 CQUPT,当然其实也可以请求一个内网的网址来判断。我选择使用不同操作系统本身的方法,而不是让这个 Python 脚本在后台运行,监控 WiFi 的变化,这样很不优雅。

Windows

Windows 的计划任务功能非常强大,可以根据不同的条件来触发不同的命令,尤其是在启动系统但还没登录的时候就能启动其他的程序,可以加快某些软件的自启动速度。不过可能很多人压根都不知道这个玩意儿在哪儿,打开文件管理器,如下步骤即可,我提供了可以导入的文件导入即可,确实挺复杂的。

这玩意儿问题还挺多的,比如本来可以设置系统启动时先判断连接到指定 WiFi 才执行登录脚本,但始终无法正确检测连接到 WiFi,一直不执行。不过,它还可以监控 WIndows 系统所有的日志,也包括连接 Wifi 的日志,只需要添加一个自定义事件的触发器,这样只要你连接上校园网都能触发登录脚本,不管你是刚打开 WiFi 连接校园网还是切换到校园网。

然而当我把系统设置为快速启动时,WiFi 不会重启,这样开机时会马上连接上,但计划任务就无法监控到这个事件。所以还需要在开机登录系统的时候在执行一次脚本,这就需要自行判断一下连接的 WiFi 是否为校园网的 WiFi,我这里写了一个 bat 批处理文件(一键登录校园网.bat),顺便封装了一下登录脚本,你自己改一下python.exe 的安装位置和脚本的位置。

@echo off@for /f "tokens=1,2,3" %%i in ('netsh WLAN show interfaces') do ( if [%%i]==[SSID] set ssid=%%k)if "%ssid:CQUPT=%"=="%ssid%" (echo) else C:/ProgramData/Miniconda3/envs/py36/python.exe D:/Desktop/Github/login4cqupt/main.py 1658xxx Tenderxxxxxx导入计划任务的文件(校园网自动登录.xml)前需要修改一下几个关键的地方

关于这个自定义事件具体的设置方法可以查看这个回答,这里不细讲

如何设置计划任务或者脚本才能使电脑在连接指定wifi后自动运行某程序? - 开源AI的回答 - 本站 https://www.zhihu.com/question/50249683/answer/950791896

Linux

我使用的 NetworkManager 作为网络管理工具,它提供了一个钩子,用于在网络发生变化时执行脚本。

在 /etc/NetworkManager/dispatcher.d 中创建脚本,命名为 10-login.sh,脚本表示当连接到包含 CQUPT 的 WiFi 时执行 Python 脚本,注意要使用完整地址。

#!/bin/shif [[ $(nmcli -t -f NAME connection show --active) =~ "CQUPT" ]]then /home/ourongxing/miniconda3/envs/python36/bin/python3 /home/ourongxing/Github/login4cqupt/main.py 1658xxx passxxxxfi然后再赋予脚本可执行权限

sudo chmod a+x 10-login.sh最后启用 NetworkManager-dispatcher.service 服务,就大功告成了

sudo systemctl enable --now NetworkManager-dispatcher.service

macOS

由于我没有设备,暂时无法尝试,但你可以参考这篇文章,其中的原理一样。 mac根据wifi切换工作环境

iOS

iOS 还是要靠快捷指令,它自带了自动化功能,非常简单,我相信你也能做到。只是可以它无法做到真正的自动登录,因为它弹出选项需要你确定。

Android

同样,Macroid 本身就带了触发器,可以检测连接 WiFi 的事件,其实前面你导入(校园网.category)后就已经可以连接 WiFi 自动登录了,你要做的就是保证这个程序一直在后台运行着。

关键词:平台,解决,方案,校园

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭