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

您所在的位置:网站首页 校园网wifi总是自动断开 自动连接校园网wifi脚本实践(自动网页认证)

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

2024-07-12 22:29| 来源: 网络整理| 查看: 265

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

起因

我们一般通过远程控制的方式访问实验室电脑,但是最近实验室老是断电,但重启后也不会自动连接校园网账户认证,远程工具(向日葵、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标签内容不是“登录成功”,则说明当前未登录,需要发请求进行认证。

书写代码

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

写一个死循环,不断判断当前是否处于登录状态:直接发get请求,如果返回的tittle为“登录成功”,则为已登录状态。 while(True): print("自动联网脚本开始运行...") # 请求校园网url response = request.urlopen(get_URL) html = response.read() # 获取tittle元素内容 res = re.findall('(.*)', 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)

否则的话,就模拟浏览器的行为,给服务器发一个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=221607010009; EPORTAL_COOKIE_SERVER=%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SERVER_NAME=%E4%B8%AD%E5%9B%BD%E7%A7%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)', }

打印状态码,判断是否认证成功。

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

# 每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('(.*)', 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=221607010009; EPORTAL_COOKIE_SERVER=%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8(CMCC%20NET); EPORTAL_COOKIE_SERVER_NAME=%E4%B8%AD%E5%9B%BD%E7%A7%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", } # 设置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脚本



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3