注:本文提供的Python登录脚本适用于GET登录的校园网,可能需要根据网站的具体数据包格式修改
要想实现开机自动化运行,需要将本文提供的对应bat文件放至系统启动目录
一、完整代码
base.py代码:
import argparse
import requests
import socket
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 ip
def get_args(): # 登录方式1-命令行参数
parser = argparse.ArgumentParser() # 创建一个 ArgumentParser 对象
parser.add_argument('-d', '--device', type=str, default='0', help='登录设备类型,0-pc, 1-pad&phone(待测试)')
parser.add_argument('-a', '--account', type=str, default='填入你的登录账号', help='登录账号')
parser.add_argument('-p', '--password', type=str, default='填入你的登录密码', help='登录密码')
parser.add_argument('-o', '--operator', type=str, default='', help='运营商信息, 空-默认运营商,cmcc-中国移动,cuc-中国联通,ctc-中国电信')
args = parser.parse_args() # 解析命令行参数,并返回一个 args 对象
return args
def login():
ip = get_ip()
# print(ip)
args = get_args()
# print(args)
args.ip = ip
res = requests.get(
'http://10.1.99.100:801/eportal/portal/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=10.1.1.1&wlan_ac_name=&jsVersion=4.1.3'
'&terminal_type=1&lang=zh-cn&v=3345&lang=zh'.format_map(
vars(args)))
# print(args)
# print(res.text)
if '"msg":"Portal协议认证成功!"' in res.text:
print('Portal协议认证成功!登陆成功!')
return
elif '"msg":"密码错误"' in res.text:
print("用户名或密码错误")
return
elif '已经在线!' in res.text:
print("用户已在线")
return
elif "账号不存在" in res.text:
print("账号不存在,可能是运营商选择出错")
return
elif 'Authentication fail' in res.text:
print("用户身份错误,可能是运营商选择出错")
return
# elif 'aW51c2UsIGxvZ2luIGFnYWluL' in res.text: # 可用于检测掉线,重复登录
# login(get_ip(), get_args())
else:
print("出现未知错误:", res.text)
return
login()
autologin.bat代码;放到开始目录下( w i n win win+ R R R输入 shell:startup 可进入),以实现开机自动运行脚本:
cd /d 【base.py存放的目录】
python base.py【上文的程序】
exit
注意修改为你程序存放的路径,例如:
cd /d C:\Users\ZOSEA\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
python base.py
exit
二、程序解析
(1)使用说明:
程序使用了argparse包,命令行运行可选传入参数如下:
python base.py -a 你的账号 -p 你的密码 -o 你的运营商(若选择默认网络则无需传入此参数,cmcc-中国移动 cuc-中国联通,ctc-中国电信)
或直接在代码中将以下提示部分修改为你的内容:
parser.add_argument('-d', '--device', type=str, default='0', help='登录设备类型,0-pc, 1-pad&phone(待测试)')
parser.add_argument('-a', '--account', type=str, default='填入你的登录账号', help='登录账号')
parser.add_argument('-p', '--password', type=str, default='填入你的登录密码', help='登录密码')
parser.add_argument('-o', '--operator', type=str, default='', help='运营商信息, 空-默认网络,cmcc-中国移动,cuc-中国联通,ctc-中国电信')
(2)原理解析:
在校园网登录界面,通过Network抓取网络数据包,在其中的"login?……"数据包中可以发现网页采用GET登录:
因此只需要把相应的个人数据,拼接到"Request URL"中,发送给服务器即可
来到Payload,可以进一步看到URL所含的元素:
于是编写程序,获取以上需要传给服务器的参数,具体代码为:
import argparse
def get_args():
parser = argparse.ArgumentParser() # 创建一个 ArgumentParser 对象
parser.add_argument('-d', '--device', type=str, default='0', help='登录设备类型,0-pc, 1-pad&phone(待测试)') # 可以使用命令行传入参数
parser.add_argument('-a', '--account', type=str, default='填入你的登录账号', help='登录账号')
parser.add_argument('-p', '--password', type=str, default='填入你的登录密码', help='登录密码')
parser.add_argument('-o', '--operator', type=str, default='', help='运营商信息, 空-默认运营商,cmcc-中国移动,cuc-中国联通,ctc-中国电信')
args = parser.parse_args() # 解析命令行参数,并返回一个 args 对象
return args
同时,由于每次登录校园网时,分配的ip可能会变,因此再获取一下当次登录校园网时本地的ip:
import socket
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 ip
到这里已经获取了我们登录需要的所有参数,将他们拼接到url中,发送到服务器即可:
def login():
ip = get_ip()
args = get_args()
args.ip = ip
res = requests.get(
'http://10.1.99.100:801/eportal/portal/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=10.1.1.1&wlan_ac_name=&jsVersion=4.1.3'
'&terminal_type=1&lang=zh-cn&v=3345&lang=zh'.format_map(
vars(args)))
if '"msg":"Portal协议认证成功!"' in res.text:
print('Portal协议认证成功!登陆成功!')
return
elif '"msg":"密码错误"' in res.text:
print("用户名或密码错误")
return
elif '已经在线!' in res.text:
print("用户已在线")
return
elif "账号不存在" in res.text:
print("账号不存在,可能是运营商选择出错")
return
elif 'Authentication fail' in res.text:
print("用户身份错误,可能是运营商选择出错")
return
else:
print("出现未知错误:", res.text)
return
至此,程序实现了校园网的自动登录,但前提是要先打开Wi-Fi,连到学校的校园网,虽然开机后通过勾选网络的“自动连接”可以勉强实现,但如果之前连的是其他网络,还需进行网络的切换以实现完全自动连接校园网,即实现校园网的连接功能,这里使用pywifi包来实现(windows系统可直接pip install,mac用户可参考:http://t.csdnimg.cn/nmhOx),具体的功能函数如下:
def wifi_connect():
wifi = pywifi.PyWiFi() # 创建一个无线对象
ifaces = wifi.interfaces()[0] # 取一个无限网卡
print("无线网卡名称:" + ifaces.name()) # 输出无线网卡名称
ifaces.disconnect() # 断开网卡连接
time.sleep(0.5) # 缓冲0.5秒
profile = pywifi.Profile() # 配置文件
profile.ssid = "i-wxxy" # wifi名称
# 检查配置文件是否存在于网卡中
if profile not in ifaces.network_profiles():
# 如果不存在,则添加配置文件
ifaces.add_network_profile(profile)
ifaces.connect(profile) # 连接
time.sleep(0.5) # 等待0.5秒后看下是否成功连接了
if ifaces.status() == pywifi.const.IFACE_CONNECTED:
print("wifi_connect()成功连接")
else:
print("wifi_connect()连接失败")
print("正在重试连接")
if not ifaces.status() == pywifi.const.IFACE_CONNECTED:
time.sleep(1)
ifaces.connect(profile) # 连接
print("wifi_connect()成功连接")
return
至此,校园网的开机自动连接和登录功能全部实现