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

:本文提供的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

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

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

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zosea231

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值