前言
最近实验室装修,实验室的Wi-Fi不能用了,所以只能用校园网了. 之前搞到过几个教师网的账户,现在还能使用来着. 但是每次连接校园网的Wi-Fi都要重新输入帐号密码,搞得有点烦躁,刚好最近在业余时间也学了Python,那就搞一个自动登录吧!
- 虽然我已经完成了大量的工作,但是由于每个人机器环境不一样和之后校园网可能的更新 ps. 其实主要是懒的去用`QT`写界面(呜呜 ,工作量依然很大,如果你不想折腾的话就右上角退出叭.
- 学校: NCIST
- Wi-Fi: ncist-teacher
- 支持的平台: Linux
- 如果想要快速使用的话,请直接跳转到 GitHub
实现过程
实现思路
- 检测连接到校园网
- 执行登录脚本
登录原理
我们学校是 Web 登录,通过发送一个 GET 请求来进行登录/注销. 当然,这里我们只需要登录就行了. ps. 当然更多的学校是使用 POST 请求,更加安全
在浏览器中输入登录校园网的网址,我们学校是http://10.200.0.2/
,按下F12
,选择NetWork(网络)
,勾选Preserve log(保存日志)
. 然后输入帐号密码,我们可以看到一个get请求. 类似下面这种.
http://10.200.0.2:801/eportal/?c=Portal&a=login&
callback=dr1635076144926&login_method=1&user_account=yimiao&
user_password=111111&wlan_user_ip=10.200.156.234&
wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&
wlan_ac_name=&jsVersion=3.3.1&_=1635076104291
找到后划到最下边,可以显示格式化参数,点击view URL encoded(查看来源)
选项,可以解码 URL,可以正确显示标点符号。比如,
是%2C
,@
是%40
参数分析
- a: 请求命令,有
login
,logout
等 - user_account: 帐号
- user_password: 密码
- wlan_user_ip: 设备IP
Linux 实现自动登录
均使用Python
来实现自动登录校园网,你需要在电脑上安装Python
环境.
我们使用requests
库来发送GET
请求,用socket
库来获取设备IP,用os
库来测试最终网络是否可用.
Python脚本
根据之前F12
获取的信息,修改相关参数.
# -*- coding = UTF-8 -*-
# @Time : 2021/10/24 上午10:46
# @Author : XIADENGMA
# @File : auto_2.py
# @Software : PyCharm
# @achieve : get请求
# @version : 1.0.0
import socket
import requests
import os
#获取局域网ip
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
s.close()
print("本机ip:"+ip)
except:
print("获取局域网ip失败:请检查Wi-Fi是否连接正确")
exit()
#校园网请求地址&帐号&密码
url = "http://10.200.0.2:801/eportal/"
account = "yimiao"
password = "111111"
#请求标头
headers = {
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.81',
'DNT': '1',
'Accept': '*/*',
'Referer': 'http://10.200.0.2/',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
}
#参数
params = (
('c', 'Portal'),
('a', 'login'),
('callback', 'dr1003'),
('login_method', '1'),
('user_account', account),
('user_password', password),
('wlan_user_ip', ip),
('wlan_user_ipv6', ''),
('wlan_user_mac', '000000000000'),
('wlan_ac_ip', ''),
('wlan_ac_name', ''),
('jsVersion', '3.3.1'),
('_', '000000000000'),
)
#连接校园网
try:
response = requests.get(url, headers=headers, params=params, verify=False, timeout=1)
# 校园网登录状态判断
if '"msg":""' in response.text:
print("当前设备已登录")
elif r'\u8ba4\u8bc1\u6210\u529f' in response.text:
print("登录成功")
elif 'bGRhcCBhdXRoIGVycm9y' in response.text:
print("密码错误")
else:
print("未知错误")
print("返回状态码: ", response.status_code)
except:
print("连接校园网失败")
#测试是否可以正常上网
exit_code = os.system('ping www.baidu.com -n -q -c 1 -W 1 >/dev/null 2>&1')
#正常上网状态判断
if exit_code == 0:
print("连接网络成功")
else:
print("连接网络失败")
Linux实现连接Wi-Fi自动登录
我使用了NetworkManager
作为网络管理工具,它提供了一个钩子,用于在网络发生变化时执行脚本。 在/etc/NetworkManager/dispatcher.d
中创建脚本,命名为auto_ncist_teacher.sh
,脚本表示当连接到包含ncist-teacher
的 WiFi 时执行 Python 脚本,注意要使用完整地址。
#!/bin/sh
if [[ $(nmcli -t -f NAME connection show --active) == "ncist-teacher" ]];#ncist-teacher对应替换成你需要Wi-Fi的SSID
then
#下面的路径对应替换:python路径 python文件路径
/home/xiadengma/miniconda3/envs/auto-ncist-teacher/bin/python /home/xiadengma/code/个人项目/python/auto-ncist-teacher/auto_2.py
fi
然后再赋予脚本可执行权限
sudo chmod a+x auto_ncist_teacher.sh
最后启用NetworkManager-dispatcher.service
服务,就大功告成了~
sudo systemctl enable --now NetworkManager-dispatcher.service
Comments | NOTHING