自动连接校园网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("自动联网脚本开始运行...")# 请求校园网urlresponse = 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,"失败,请检查请求地址!")passelse: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("自动联网脚本开始运行...")# 请求校园网urlresponse = 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,"失败,请检查请求地址!")passelse: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_URLresponse = 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脚本

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法&#xff0c;以及自动化实时数据采集 mmWave Studio提供的功能完全够用了 不用去纠结用DCA1000低延迟、无GUI传数据 速度最快又保证算力无非就是就是Linux板自己写驱动做串口和UDP 做雷达产品应用也不会采用DCA1000的…

目标检测中的Bounding Box(边界框)介绍:定义以及不同表示方式

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

【C语言】获取文件属性

目录 1. stat函数 2. 获取文件属性 3. 获取文件权限 1. stat函数 int stat(const char *path, struct stat *buf); 功能&#xff1a;获取文件属性 参数&#xff1a; path&#xff1a;文件路径名buf&#xff1a;保存文件属性信息的结构体 返回值&#xff1a;成功&#xff1…

springboot

springboot排出tomcat服务器&#xff0c;当成spring容器使用 springboot-mybatis springboot-mybatisplus 整合druid

【算法】将单链表按值划分

问&#xff1a; 将单链表按某值划分成左边小、中间相等、右边大的形式 答&#xff1a; 笔试&#xff1a;初始化一个Node类型的数组&#xff0c;对数组进行partition&#xff0c;然后把数组中的节点元素串成链表 public static Node listPartition1(Node head, int pivot) {…

图解Git——分支的新建与合并《Pro Git》

⭐分支的新建与合并 先引入一个实际开发的工作流&#xff1a; 开发某个网站。为实现某个新的需求&#xff0c;创建一个分支。在这个分支上开展工作。 正在此时&#xff0c;你突然接到一个电话说有个很严重的问题需要紧急修补。你将按照如下方式来处理&#xff1a; 切换到你…

Web前端界面开发

前沿&#xff1a;介绍自适应和响应式布局 自适应布局&#xff1a;-----针对页面1个像素的变换而变化 就是我们上一个练习的效果 我们的页面效果&#xff0c;随着我们的屏幕大小而发生适配的效果&#xff08;类似等比例&#xff09; 如&#xff1a;rem适配 和 vw/vh适配 …

解决:ubuntu22.04中IsaacGymEnv保存视频报错的问题

1. IsaacGymEnvs项目介绍 IsaacGymEnvs&#xff1a;基于NVIDIA Isaac Gym的高效机器人训练环境 IsaacGymEnvs 是一个基于 NVIDIA Isaac Gym 的开源 Python 环境库&#xff0c;专为机器人训练提供高效的仿真环境。Isaac Gym 是由 NVIDIA 开发的一个高性能物理仿真引擎&#xf…

服务器数据恢复—raid5故障导致上层ORACLE无法启动的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器上的8块硬盘组建了一组raid5磁盘阵列。上层安装windows server操作系统&#xff0c;部署了oracle数据库。 raid5阵列中有2块硬盘的硬盘指示灯显示异常报警。服务器操作系统无法启动&#xff0c;ORACLE数据库也无法启动。 服…

MySQL批量修改数据表编码及字符集为utf8mb4

​​​​​​MySQL批量修改数据表编码及字符集为utf8mb4 utf8mb4编码是utf8编码的超集&#xff0c;兼容utf8&#xff0c;并且能存储4字节的表情字符。 采用utf8mb4编码的好处是&#xff1a;存储与获取数据的时候&#xff0c;不用再考虑表情字符的编码与解码问题。 更改数据库…

Day05-后端Web基础——TomcatServletHTTP协议SpringBootWeb入门

目录 Web基础知识课程内容1. Tomcat1.1 简介1.2 基本使用1.2.1 下载1.2.2 安装与卸载1.2.3 启动与关闭1.2.4 常见问题 2. Servlet2.1 快速入门2.1.1 什么是Servlet2.1.2 入门程序2.1.3 注意事项 2.2 执行流程 3. HTTP协议3.1 HTTP-概述3.1.1 介绍3.1.2 特点 3.2 HTTP-请求协议3…

python-42-使用selenium-wire爬取微信公众号下的所有文章列表

文章目录 1 seleniumwire1.1 selenium-wire简介1.2 获取请求和响应信息2 操作2.1 自动获取token和cookie和agent2.3 获取所有清单3 异常解决3.1 请求url失败的问题3.2 访问链接不安全的问题4 参考附录1 seleniumwire Selenium WebDriver本身并不直接提供获取HTTP请求头(header…

Android SDK下载安装(图文详解)

安装完sdk&#xff0c;就可以直接使用adb命令了&#xff0c;我们做app自动化测试&#xff0c;也需要sdk环境的依赖。 1. 下载Android SDK 网盘下载地址&#xff1a;https://pan.quark.cn/s/8398e52cefc9 官网下载地址&#xff1a;https://www.androiddevtools.cn/ &#xff08;…

【HM-React】08. Layout模块

基本结构和样式reset 结构创建 实现步骤 打开 antd/Layout 布局组件文档&#xff0c;找到示例&#xff1a;顶部-侧边布局-通栏拷贝示例代码到我们的 Layout 页面中分析并调整页面布局 代码实现 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

51单片机入门基础

目录 一、基础知识储备 &#xff08;一&#xff09;了解51单片机的基本概念 &#xff08;二&#xff09;掌握数字电路基础 &#xff08;三&#xff09;学习C语言编程基础 二、开发环境搭建 &#xff08;一&#xff09;硬件准备 &#xff08;二&#xff09;软件准备 三、…

LeetCode-493. Reverse Pairs

目录 题目描述 解题思路 【C】 【Java】 https://leetcode.com/problems/reverse-pairs/description/https://leetcode.com/problems/reverse-pairs/description/ 题目描述 Given an integer array nums, return the number of reverse pairs in the array. A reverse pai…

【Python】数据容器:列表,元组,字符串,集合字典及通用操作

文章目录 一.序列1.1list列表定义常用操作列表的遍历 1.2tuple元组定义常见操作元组的遍历 1.3str字符串定义常见操作字符串的遍历 1.4序列常用操作——切片 二.set集合定义常见操作集合的遍历 三.dict字典定义常用操作字典的嵌套 *数据容器对比总结四.数据容器的通用操作4.1通…

计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)

局域网: LAN:在某一区域内由多台计算机互联成的计算机组&#xff0c;使用广播信道 特点&#xff1a; 覆盖范围有限&#xff1a;通常局限在几千米范围内&#xff0c;比如一栋办公楼、一个校园或一个工厂等相对较小的地理区域。 数据传输速率高&#xff1a;一般能达到 10Mbps…

Qt WORD/PDF(五)使用Json一键填充Word表格

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: 《Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作》 《Qt WORD/PDF&#…

Elasticsearch入门学习

Elasticsearch是什么 Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。 特点 分布式&a…