自动连接校园网wifi脚本实践(自动网页认证)

目录

  • 起因
  • 执行步骤
    • 分析校园网登录逻辑
      • 如何判断当前是否处于未登录状态?
    • 书写代码
    • 打包
    • 设置开机自动启动

起因

我们一般通过远程控制的方式访问实验室电脑,但是最近实验室老是断电,但重启后也不会自动连接校园网账户认证,远程工具(向日葵、Todesk等)也就用不了,就想着用python做一个自动认证的脚本,下面是实践过程。

注:本脚本只是用于自动做校园网账户的认证(在已经连着校园网的情况下才能验证),并不是让windows去自动连接某个校园网wifi。

执行步骤

分析校园网登录逻辑

先登录校园网认证网页,先点击F12,选中网络并勾选保存日志
在这里插入图片描述
再输入账户密码,点击login,看看发了哪些请求(一般netword的前几个比较重要,后面的都是资源文件)
在这里插入图片描述
这里发现发了两个请求,第一个post请求,第二个get请求(每个学校的不一样,HHU的可以直接用本教程方法)
第一个是post请求
在这里插入图片描述
点击payload查看post请求携带的数据,发现里面包含了自己的校园网账户和密码
在这里插入图片描述
第二个是get请求
在这里插入图片描述
复制上面的request URL到浏览器,发现就是可以访问的认证界面。

总结:点击login按钮后,我的密码是先通过一个post请求提交到服务器,然后再通过一个get请求去实现登录的。

那脚本要做的事情就是:当发现当前处于未登录状态时,要模拟浏览器的行为,先发一个post请求,请求header和data都要和浏览器上的内容对应,然后再发一个get请求就可以了。(有点像爬虫做的事情)

如何判断当前是否处于未登录状态?

一般提交get请求时,当前已经登录和为登录状态得到html文档中的标签内容是不一样的。这里我们在已登录状态下,按F12,再按ctrl+F查找下的内容,发现果然有标识
在这里插入图片描述
也就是说,当get请求结果返回的title标签内容是“登录成功”时,当前就已经处于登录状态了,此时不需要再进行认证,如果不是tittle标签内容不是“登录成功”,则说明当前未登录,需要发请求进行认证。

书写代码

梳理一下脚本要实现的内容:

  1. 写一个死循环,不断判断当前是否处于登录状态:直接发get请求,如果返回的tittle为“登录成功”,则为已登录状态。
while(True):
    print("自动联网脚本开始运行...")
    # 请求校园网url
    response = request.urlopen(get_URL)
    html = response.read()
    # 获取tittle元素内容
    res = re.findall('<title>(.*)</title>', html.decode(encoding="GBK", errors="strict"))
    print('res:', res)
    title = ''
    if len(res) == 0:
        print("访问",get_URL,"失败,请检查请求地址!")
        pass
    else:
        title = res[0]
    print("title:",title)
  1. 否则的话,就模拟浏览器的行为,给服务器发一个post请求(设置好header和data,示例如下),然后再发一个get请求进行认证。
    2.1设置header
    在这里插入图片描述
    变成如下

        # 设置post的请求头,浏览器点击F12,在Netword中选中post请求,点击Headers、request header面板中查看
        header = {
            "Accept": "*/*",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
            "Connection": "keep-alive",
            "Content-Length": "762",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Cookie": "EPORTAL_COOKIE_DOMAIN=false; EPORTAL_COOKIE_USERNAME=XXXXX; EPORTAL_COOKIE_SERVER=%E4%B8%AD%E5%9%E7%A7%BB%E5%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SERVER_NAME=%E4%B8%AD%E5%9B%BA7%BB%E5%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SAVEPASSWORD=true; EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_COOKIE_NEWV=true; EPORTAL_COOKIE_PASSWORD=1e485d5861f50092df261f37ca6218c4d8675e6daf226f84489f5bd7ca8339a4e15b27b2fdb3a1ade55b553c96a04a76ad00a31cb46902d356babec2ced138dc40f97b6f5b489274aa5561d24a6f9610caf99e52e5a0d92bf2448819f44dfc2f2c37966d8554aa00fe530d0cbe52a0d4438f2640f04410e865ff3aeff6faf9ff; EPORTAL_AUTO_LAND=; EPORTAL_USER_GROUP=%E5%AD%A6%E7%94%9F; JSESSIONID=8A3372E32254B5F7321DF7B93A4851AA; JSESSIONID=F2C1BB4E6D58762763F36630541B5C38",
            "Host": "eportal.hhu.edu.cn",
            "Origin": "http://eportal.hhu.edu.cn",
            "Referer": "http://eportal.hhu.edu.cn/eportal/index.jsp?wlanuserip=29fc0b608918b04682c9e6c6cf6c1c29&wlanacname=2356e8aa38c836625d91257381aaef57&ssid=ea65e712d7d12a1fb44ec48a1c5072b0&nasip=07ec241dffc0de15d87efe9c07b8c6e0&mac=027a460789bb1e7c9c4acc766c937e6e&t=wireless-v2&url=35e6780db7fde27a90f8986393791ca7b01578112b560bd2",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
        }
    

    2.2设置data
    在这里插入图片描述
    变成如下

        # 设置post的请求数据,浏览器点击F12,在Netword中选中post请求,点击payload面板中查看
        data = {
            "userId": 'XXX',  # 需要根据自己的情况修改
            "password": '1e485d5861f50092df261f37ca621daf226f84489f5bd5b27b2fdb3a1ade55b553c96a04a76ad00aa31cb4ced138dc40f97b6f5b489274a6f9610caf99e52e5a0d92bf2448819f44dfc2f2c37966d8554ada00fe530d0cbe52a0d4438f2640f04410e865ff3aeff6faf9ff',  # 需要根据自己的情况修改
            "queryString": 'wlanuserip%3D29fc0b608918b04682c9e6c6cf6c1c29%26wlanacname%3D2356e8aa38c836625d91257381aaef57%26ssid%3Dea65e712d7d12a1fb44ec48a1c5072b0%26nasip%3D07ec241dffc0de15d87efe9c07b8c6e0%26mac%3D027a460789bb1e7c9c4acc766c937e6e%26t%3Dwireless-v2%26url%3D35e6780db7fde27a90f8986393791ca7b01578112b560bd2',
            "passwordEncrypt": 'true',
            "operatorPwd": '',
            "operatorUserId": '',
            "validcode": '',
            "service": '%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8(CMCC%20NET)',
        }
    
  2. 打印状态码,判断是否认证成功。

  3. 休眠一段时间,然后进行下一次循环。

    # 每1h左右检测一次是否成功连接
    rand = random.uniform(0, 100)
    print("休眠",int(3600.0 + rand),"s")
    time.sleep(3600.0 + rand)

另外,由于这个脚本可以放到需要后台运行,看不到print输出。所以增加一个小功能,把日志输出到log文件中去,可以查看脚本运行状态。(各位可以考虑要不要这个功能)

完整代码如下:

import re    # 正则表达式,用于匹配字符
from urllib import request
import requests
import time
import random
import os

# 设置日志文件路径
log_file_path = 'log.txt'

# 第一个post请求的URL
post_URL = 'http://eportal.hhu.edu.cn/eportal/InterFace.do?method=login'
# 第二个get请求的URL(浏览器可访问的url)
get_URL = 'http://eportal.hhu.edu.cn/eportal/success.jsp?userIndex=3037656332343164666663306465asd3135643837656665396330376238633665305f31302e3139392e34362e38325f3232313630asd37303130303039&keepaliveInterval=0'
while(True):
    print("自动联网脚本开始运行...")
    # 请求校园网url
    response = request.urlopen(get_URL)
    html = response.read()
    # 获取tittle元素内容
    res = re.findall('<title>(.*)</title>', html.decode(encoding="GBK", errors="strict"))
    print('res:', res)
    title = ''
    if len(res) == 0:
        print("访问",get_URL,"失败,请检查请求地址!")
        pass
    else:
        title = res[0]
    print("title:",title)
    # 根据title元素内容判断是否处于已登录状态
    if title == '登录成功':    
        print('当前状态为:已登陆成功!')
    else:
        print('当前状态为:未登录!')
        # 设置post的请求头,浏览器点击F12,在Netword中选中post请求,点击Headers、request header面板中查看
        header = {
            "Accept": "*/*",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
            "Connection": "keep-alive",
            "Content-Length": "762",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Cookie": "EPORTAL_COOKIE_DOMAIN=false; EPORTAL_COOKIE_USERNAME=xxx; EPORTAL_COOKIE_SERVER=%E4%B8%AD%E5%9B%BD%A7%BB%E%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SERVER_NAME=%E4%BADE5%9B%D%E7%A7%BB%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SAVEPASSWORD=true; EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_COOKIE_NEWV=true; EPORTAL_COOKIE_PASSWORD=1e485d5861f50092df261f37ca6218c4d8675e6daf226f84489f5bd7ca8339a4e15b27b2fdb3a1ade55b553c96a04a76ad00a31cb46902d356babec2ced138dc40f97b6f5b489274aa5561d24a6f9610caf99e52e5a0d92bf2448819f44dfc2f2c37966d8554aa00fe530d0cbe52a0d4438f2640f04410e865ff3aeff6faf9ff; EPORTAL_AUTO_LAND=; EPORTAL_USER_GROUP=%E5%AD%A6%E7%94%9F; JSESSIONID=8A3372E32254B5F7321DF7B93A4851AA; JSESSIONID=F2C1BB4E6D58762763F36630541B5C38",
            "Host": "eportal.hhu.edu.cn",
            "Origin": "http://eportal.hhu.edu.cn",
            "Referer": "http://eportal.hhu.edu.cn/eportal/index.jsp?wlanuserip=29fc0b608918b04682c9e6c6cf6c1c29&wlanacname=2356e8aa38c836625d91257381aaef57&ssid=ea65e712d7d12a1fb44ec48a1c5072b0&nasip=07ec241dffc0de15d87efe9c07b8c6e0&mac=027a460789bb1e7c9c4acc766c937e6e&t=wireless-v2&url=35e6780db7fde27a90f8986393791ca7b01578112b560bd2",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
        }
        # 设置post的请求数据,浏览器点击F12,在Netword中选中post请求,点击payload面板中查看
        data = {
            "userId": 'XXX',  # 校园网账号
            "password": 'XXX',  # 校园网密码(密文)
            "queryString": 'wlanuserip%3D29fc0b608918b04682c9e6c6cf6c1c29%26wlanacname%3D2356e8aa38c836625d91257381aaef57%26ssid%3Dea65e712d7d12a1fbsa44ec48aa1c5072b0%26nasip%3D07ec241dffc0de15d87efe9c07b8c6e0%26mac%3D027a460789bb1e7c9c4acc7d66c937e6e%26t%3Dwireless-v2%26url%3D35e6780db7fde27a90f8986393791ca7b01578112b560bd2',
            "passwordEncrypt": 'true',
            "operatorPwd": '',
            "operatorUserId": '',
            "validcode": '',
            "service": '%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8(CMCC%20NET)',
        }
        # 发送post请求(设置好header和data)
        response = requests.post(post_URL, data, headers=header)
        uft_str = response.text.encode("iso-8859-1").decode('utf-8')
        print("post请求状态码{}".format(response))  # 打印状态码

        # 发送get请求,登录校园网
        schoolWebLoginURL = get_URL
        response = requests.get(schoolWebLoginURL).status_code  # 直接利用 GET 方式请求这个 URL 同时获取状态码
        print("get请求状态码{}".format(response))  # 打印状态码

    # 将print的内容写入log文件
    with open(log_file_path, 'a', encoding='utf-8') as log_file:
        log_file.write("自动联网脚本开始运行...\n")
        log_file.write(f"res: {res}\n")
        log_file.write(f"title: {title}\n")
        log_file.write(f"当前状态为: {'已登陆成功' if title == '登录成功' else '未登录'}\n")
        log_file.write(f"状态码: {response}\n")

    # 检查文件大小,如果大于1KB则清空文件
    if os.path.getsize(log_file_path) > 1024:
        open(log_file_path, 'w').close()

    # 每1h左右检测一次是否成功连接
    rand = random.uniform(0, 100)
    print("休眠",int(3600.0 + rand),"s")
    time.sleep(3600.0 + rand)

打包

先安装好pyinstall工具

pip install pyinstall

最后用pyinstall工具把.py文件打包成.exe可执行文件

pyinstaller -F 你的脚本.py

注:-F是把所有内容都打包进一个exe文件的意思
在这里插入图片描述
打包后如下
在这里插入图片描述
在dist里面找到可执行程序,双击测试运行。
在这里插入图片描述

设置开机自动启动

win+r,输入shell:startup
在这里插入图片描述
把.exe拖入开机自启动文件夹里面
在这里插入图片描述

参考博客:
Python校园网(网页认证)开机/断网自动连接
手把手教你python实现校园网自动连接
校园自动联网python脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS 解决两个tableView.嵌套滚动手势冲突

我们有这样一个场景&#xff0c;就是页面上有一个大的tableView&#xff0c; 每一个cell都是和屏幕一样高的&#xff0c;然后cell中还有一个可以 tableView&#xff0c;比如直播间的情形&#xff0c;这个时候如果我们拖动 cell里面的tableView滚动的话&#xff0c;如果滚动到内…

机组存储系统

局部性 理论 程序执行&#xff0c;会不均匀访问主存&#xff0c;有些被频繁访问&#xff0c;有些很少被访问 时间局部性 被用到指令&#xff0c;不久可能又被用到 产生原因是大量循环操作 空间局部性 某个数据和指令被使用&#xff0c;附近数据也可能使用 主要原因是顺序存…

LeetCode热题100-二叉树的中序遍历【JavaScript讲解】

题目&#xff1a; 二叉树&#xff1a; 二叉树的遍历是指按照某种特定的顺序访问二叉树中的每个节点&#xff0c;使得每个节点被访问且仅被访问一次。二叉树的遍历主要分为三种&#xff1a;先序遍历&#xff08;前序遍历&#xff09;、中序遍历和后序遍历。 ‌先序遍历&#x…

【Linux】正则表达式

正则表达式是一种可供Linux工具过滤文本的自定义模板&#xff0c;Linux工具&#xff08;如sed、gawk&#xff09;会在读取数据时使用正则表达式对数据进行模式匹配。 正则表达式使用元字符来描述数据流中的一个或多个字符。它是由正则表达式引擎实现的。正则表达式引擎是一种底…

计算机视觉算法实战——步态识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​​​​​​​​​​​​ 1. 步态识别简介✨✨ 步态识别&#xff08;Gait Recognition&#xff09;是计算机视觉领域中的一个…

【RTSP】使用webrtc播放rtsp视频流

一、简介 rtsp流一般是监控、摄像机的实时视频流,现在的主流浏览器是不支持播放rtsp流文件的,所以需要借助其他方案来播放实时视频,下面介绍下我采用的webrtc方案,实测可行。 二、webrtc-streamer是什么? webrtc-streamer是一个使用简单机制通过 WebRTC 流式传输视频捕获…

从0开始学习搭网站第二天

前言&#xff1a;今天比较惭愧&#xff0c;中午打铲吃了一把&#xff0c;看着也到钻二了&#xff0c;干脆顺手把这个赛季的大师上了&#xff0c;于是乎一直到网上才开始工作&#xff0c;同样&#xff0c;今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

【Pico串流预览】使用“PICO Unity Live Preview Plugin”和PDC工具进行实时预览

使用“PICO Unity Live Preview Plugin”和PDC工具进行实时预览 支持内容 支持预览的内容 虚拟场景手势追踪 支持操作系统 仅支持Windows 下载插件 PICO Unity Live Preview Plugin 当前版本&#xff1a;v1.0.4 更新时间&#xff1a; 2024-12-05 大小&#xff1a; 3.27MB …

poi处理多选框进行勾选操作下载word以及多word文件压缩

一、场景 将数据导出word后且实现动态勾选复选框操作 eg: word模板 导出后效果&#xff08;根据数据动态勾选复选框&#xff09; 二、解决方案及涉及技术 ① 使用poi提供的库进行处理&#xff08;poi官方文档&#xff09; ② 涉及依赖 <!-- excel工具 --><depen…

深入浅出负载均衡:理解其原理并选择最适合你的实现方式

负载均衡是一种在多个计算资源&#xff08;如服务器、CPU核心、网络链接等&#xff09;之间分配工作负载的技术&#xff0c;旨在优化资源利用率、提高系统吞吐量和降低响应时间。负载均衡的实现方式多种多样&#xff0c;以下是几种常见的实现方式&#xff1a; 1. 硬件负载均衡&…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO&#xff08;El Nio-Southern Oscillation&#xff09;是全球气候系统中最显著的年际变率现象之一&#xff0c;对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来&#xff0c;深度学习技术在气象领域…

MySQL表格练习(单表查询,多表查询)

一,单表查询 素材&#xff1a; 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NUL…

postgresql分区表相关问题处理

1.使用pg_cron按日创建分区表&#xff0c;会出现所在数据库对应用户权限不足的问题。 原因是pg_cron运行在postgres数据库中&#xff0c;是用superuser进行执行的&#xff0c;对应的分区表的owner为postgres&#xff0c;所以需要单独授权对表的所有操作权限。不知道直接改变ow…

【数据结构】基础知识

目录 1.1 什么是数据结构 1.2数据 1.3 逻辑结构 1.4 存储结构 1.4.1 顺序存储 1.4.2 链式存储 1.4.3 索引存储 1.4.4 散列存储 1.5 操作 1.1 什么是数据结构 数据的逻辑结构以及存储操作 数据结构没有那么复杂&#xff0c;它就教会你一件事&#xff1a;如何更有效的…

空指针:HttpSession异常,SpringBoot集成WebSocket

异常可能性&#xff1a; 404 &#xff1a; 请检查拦截器是否将请求拦截WebSocket握手期间HttpSession为空 HttpSession为空 方法一 &#xff1a; 网上参考大量的文档&#xff0c;有说跟前端请求域名有关系的。 反正对我来说&#xff0c;没啥用无法连接。 需使用 localhost&a…

相机SD卡照片数据不小心全部删除了怎么办?有什么方法恢复吗?

前几天&#xff0c;小编在后台友收到网友反馈说他在整理相机里的SD卡&#xff0c;原本是想把那些记录着美好瞬间的照片导出来慢慢欣赏。结果手一抖&#xff0c;不小心点了“删除所有照片”&#xff0c;等他反应过来&#xff0c;屏幕上已经显示“删除成功”。那一刻&#xff0c;…

Observability:利用 GCP Vertex AI 集成提升 LLM 可观察性

作者&#xff1a;来自 Elastic Ishleen Kaur•Muthukumar Paramasivam 随着组织越来越多地将 LLM 用于内容创建、检索增强生成 (Retrieval-Augmented Generation - RAG) 和数据分析等 AI 应用&#xff0c;SRE 和开发人员面临着新的挑战。监控工作流、分析输入和输出、管理查询延…

WEB攻防-通用漏洞_XSS跨站_权限维持_捆绑钓鱼_浏览器漏洞

目录 XSS的分类 XSS跨站-后台植入Cookie&表单劫持 【例1】&#xff1a;利用beef或xss平台实时监控Cookie等凭据实现权限维持 【例2】&#xff1a;XSS-Flash钓鱼配合MSF捆绑上线 【例3】&#xff1a;XSS-浏览器网马配合MSF访问上线 XSS的分类 反射型&#xff08;非持久…

21、Transformer Masked loss原理精讲及其PyTorch逐行实现

1. Transformer结构图 2. python import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0batch_size 2seq_length 3vocab_size 4logits torch.randn(batch…

上传自己的镜像到docker hub详细教程

上传自己的镜像到docker hub详细教程 本博客通B站视频一致&#xff1a; 上传自己的镜像到docker hub详细教程 1. 登录自己的hub.docker.com的账号 docker hub仓库 2. 点击Repositories&#xff0c;跳转到创建仓库页面 3. 点击Create a repository 创建repository&#xff0c…