【原创】中国移动校园网使用Post实现自动认证

在这里插入图片描述

——前言


分享下实现中国移动校园网通过request自动认证的思路

注意:只适用于中国移动的校园网,其他的校园网根据逻辑自行修改。

移动校园网

逛了很多的论坛发现没有用这种方法实现校园网自动认证的
办理的校园网每次登陆都需要手动打开浏览器进行验证
而且通过Python自动化实现登录校园网的功能具有一定局限性
在不装自动化驱动和环境的情况下是不能实现自动认证校园网的

是我换了一种思路,模拟Post提交表单数据请求直接实现校园网自动认证


软件的整体运行逻辑:

输入校园网账号与密码

自动保存账号密码到文本文件中

获取本机网卡的mac地址

获取本机WiFi的IPV4地址

自动填充到链接中的IP和MAC中

GET方法获取链接页面内容

页面内容中提取登录表单

构造登录请求

Post发送登录请求

检查是否登录成功

在这里插入图片描述

——1、准备工作

要模拟POST请求,必须拿到POST请求的相关信息。如请求的URL,发送的表单数据和标头

登陆界面如图上图所示
在此页面打开开发者选项[F12],选择网络,勾选保留日志:
网页开发者选项
输入账号密码登录,成功后会看到右侧出现一条名为login.do的数据
在这里插入图片描述
点击框内数据会显示该请求的URL、响应头、请求头、表单等信息:
URL、响应头、请求头
将请求的URL、请求头、表单先记下来:

#请求url
http://211.138.1.146:8888/login.do
#请求标头:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 147
Content-Type: application/x-www-form-urlencoded
Cookie: portalsessionid=CA9DF25A110D4F6F774447463F25FB0C
Host: 211.138.1.146:8888
Origin: http://211.138.1.146:8888
Pragma: no-cache
Referer: http://211.138.1.146:8888/showLogin.do?wlanuserip=100.64.176.0&wlanacname=0013.0311.311.00&user-mac=44-e5-17-dc-04-06
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0
#表单数据
'showVerify': 'false',
'loginType': '1',
'bpssUSERNAME': 校园网账号,
'bpssBUSPWD': 校园网密码,
'dynVerifyCode': '',
'bpssVERIFY': '',
'macAge': '填获取的',
'CSRFHW': '填获取的'

记住这三项数据,开始编写python代码


在这里插入图片描述

——2、技术细节

需要注意一点,中国移动校园网和其他的校园网认证方式不一样
认证页面的网址里是需要有本机IP和MAC地址的,不然认证失败

那么让我们先写获取IP地址和MAC地址的代码


获取IPV4地址:

import socket

ip_address = socket.gethostbyname(socket.gethostname())
print("本机IPv4地址:", ip_address)

运行截图:
在这里插入图片描述



获取MAC地址:

import wmi

def get_MACAddress():
    s = wmi.WMI()

    network = []
    for nw in s.Win32_NetworkAdapterConfiguration(IPEnabled=1):
        network.append(
            {
                "MAC": nw.MACAddress,
                "ip": nw.IPAddress
            }
        )

    MACAddress = str(network[0]["MAC"]).replace(':', '')
    formatted_MACAddress = '-'.join([MACAddress[i:i + 2] for i in range(0, len(MACAddress), 2)])
    return formatted_MACAddress

if __name__ == "__main__":
    mac_address = get_MACAddress()
    print("网卡MAC地址="+mac_address)

运行截图:
在这里插入图片描述

在这里插入图片描述

——3、自动匹配链接

将获取的IP地址和Mac地址自动匹配到链接中:

url = f"http://211.138.1.146:8888/showLogin.do?wlanuserip={ip_address}&wlanacname=0014.0311.311.00&user-mac={mac_address}"

运行截图:
在这里插入图片描述



在这里插入图片描述

——4、编写代码

提示:为了能有更好的使用体验,我在里面放了首次登录输入账号密码自动储存的功能,方便下次登录。

import socket
import requests
from bs4 import BeautifulSoup
import wmi
import os


def create_credentials_file():
    credentials_file = "D:\\credentials.txt"  # 修改文件路径为 D 盘根目录下的 credentials.txt

    if not os.path.exists(credentials_file):
        username = input("请输入校园网账号:")
        password = input("请输入校园网密码:")

        with open(credentials_file, "w") as file:
            file.write(username + "\n")
            file.write(password + "\n")
    else:
        print("1、密码储存文件已存在,请勿删除credentials.txt")

    return credentials_file


def get_credentials():
    credentials_file = create_credentials_file()

    with open(credentials_file, "r") as file:
        lines = file.readlines()
        if len(lines) >= 2:
            username = lines[0].strip()
            password = lines[1].strip()
        else:
            username = input("请输入校园网账号:")
            password = input("请输入校园网密码:")
            with open(credentials_file, "w") as file:
                file.write(username + "\n")
                file.write(password + "\n")

    return username, password


class NetworkInfo:
    def get_MACAddress(self):
        s = wmi.WMI()

        network = []
        for nw in s.Win32_NetworkAdapterConfiguration(IPEnabled=1):
            network.append(
                {
                    "MAC": nw.MACAddress,
                    "ip": nw.IPAddress
                }
            )

        MACAddress = str(network[0]["MAC"]).replace(':', '')
        formatted_MACAddress = '-'.join([MACAddress[i:i + 2] for i in range(0, len(MACAddress), 2)])
        print("2、网卡MAC地址={}".format(formatted_MACAddress))
        return formatted_MACAddress


username, password = get_credentials()


# 获取本机IPv4地址
ip_address = socket.gethostbyname(socket.gethostname())
# 获取本机MAC网卡地址
network_info = NetworkInfo()
mac_address = network_info.get_MACAddress()
url = f"http://211.138.1.146:8888/showLogin.do?wlanuserip={ip_address}&wlanacname=0013.0311.311.00&user-mac={mac_address}"
print("3、IP和MAC匹配的登录网址为:"+url)


# 发送GET请求,获取showLogin页面的内容
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

# 提取登录表单的相关信息
form_url = url + soup.find("form")["action"]

# ... (其他部分代码)

# 发送登录请求
with requests.Session() as session:
    # 构造请求头
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Cache-Control': 'no-cache',
        'Content-Length': '147',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cookie': 'portalsessionid=3EF9A1E666889BC47339C06195BCF724',
        'Host': '211.138.1.146:8888',
        'Origin': 'http://211.138.1.146:8888',
        'Pragma': 'no-cache',
        'Proxy-Connection': 'keep-alive',
        'Referer': 'http://211.138.1.146:8888/showLogin.do',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
    }

    # 发送GET请求,获取showLogin页面的内容
    response_show_login = session.get(url, headers=headers)
    print(f"4、发送GET请求获取showLogin页面的内容为:+{response_show_login}")
    # 提取登录表单的相关信息
    form_url = url + BeautifulSoup(response_show_login.text, "html.parser").find("form")["action"]
    print(f"5、提取登录表单的相关信息为:"+form_url)
    # ...(获取其他表单数据的代码)

    # 构造登录请求的数据(和之前保持一致)
    data = {
        'showVerify': 'false',
        'loginType': '1',
        'bpssUSERNAME': username,
        'bpssBUSPWD': password,
        'dynVerifyCode': '',
        'bpssVERIFY': '',
        'macAge': '',
        'CSRFHW': ''
    }

    # 设置登录请求的地址为login.do,而非showLogin.do
    login_url = "填写login.do链接"

    # 然后发送登录请求
    print(f"6、login_url的内容为:"+login_url)
    print(f"7、headers的内容为:+{headers}")
    print(f"8、data的内容为:+{data}")
    response_login = session.post(login_url, headers=headers, data=data)

# 检查登录是否成功
    print(f"9、response_login.text的内容为:"+response_login.text)
if "用户登录成功" in response_login.text:
    print("登录成功!")
else:
    print("登录失败!")


在这里插入图片描述

——5、编译为exe文件

首先先安装pyinstaller库:

pip install pyinstaller

然后到你py文件的目录下cmd,使用以下命令将Python脚本编译为exe文件:

pyinstaller --onefile 名字.py

将会在当前目录下的dist文件夹中生成可执行文件:
exe
将其放入启动项文件夹中,每次开机自动启动

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

——6、注意事项

需要安装不同的库和依赖来运行与编译python代码

可以使用pip命令来安装这些库。下面是安装所需库的命令:

  1. 安装socket库:

    pip install socket
    
  2. 安装requests库:

    pip install requests
    
  3. 安装BeautifulSoup库:

    pip install beautifulsoup4
    
  4. 安装wmi库:

    pip install wmi
    
  5. 安装os库:

    pip install os
    

更多待完善…欢迎提出问题

在这里插入图片描述

  • 40
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XiaoHui_Zyh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值