Python实现开机自动登录校园网(GET登录) 您所在的位置:网站首页 北林校园网登录 Python实现开机自动登录校园网(GET登录)

Python实现开机自动登录校园网(GET登录)

2024-06-05 22:30| 来源: 网络整理| 查看: 265

注:本文提供的Python登录脚本适用于GET登录的校园网,可能需要根据网站的具体数据包格式修改 要想实现开机自动化运行,需要将该脚本放至系统启动目录

一、完整代码 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() 二、程序解析 (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

至此,校园网的开机自动连接和登录功能全部实现

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有