校园网掉线自动重连小助手--Python
一背景
PC在连接学校校园网的情况下如果持续一段时间未使用足够多的流量则会掉线,严重影响了电脑不在身边时通过向日葵远程的访问.因此特地写了一个校园网自动重连的小助手.
二获取数据包
连接校园网,进入认证界面,如下图
按F12,点击Network和Preserve log准备抓包
输入账号密码,点击登录,此时会出现一大堆数据包,一般选择第一个
下图中的就是我们写代码时需要用到的数据
编写自动重连脚本(附带日志)
思路: 每隔60s ping一次百度,如果未ping通则断掉当前WIFI(我所在学校每天凌晨2点左右会断网,如果不进行重新连接就算认证成功也没有网),再连接校园网并认证.
Ping www.baidu.com判断当前网络是否可以上网
def Ping(self):iplist = list()ip = 'www.baidu.com'# 这里使用subprocess模块而不使用os模块,因为os模块在打包后执行cmd命令会出现黑色命令框backinfo = subprocess.call('ping www.baidu.com -n 1', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# print(backinfo)if backinfo:print('no')self.connectFlag = 0logging.info('网络未连接')else:iplist.append(ip)self.connectFlag = 1
断开当前网络
def disconnect(self): # 断开wifi# 这里使用subprocess模块而不使用os模块,因为os模块在打包后执行cmd命令会出现黑色命令框subprocess.call("netsh wlan disconnect", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
连接校园网
def connect_wifi(self, name=None): # 连接wifi# 这里使用subprocess模块而不使用os模块,因为os模块在打包后执行cmd命令会出现黑色命令框cmd = "netsh wlan connect name=" + str(name)subprocess.call(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
自动认证(因为方便后期用户的使用,创建了一个.json的配置文件,通过读字典的方式来获取不同的用户信息)
def connect(self): # 自动认证myaddr = self.getlocalIP()userId = self.data["userId"] # 用户名password = self.data["password"] # 密码service = self.data["service"]queryString = "wlanacname%3DAC6805%26nasip%3D172.18.95.254%26wlanuserip%3D" + myaddr +"%26wlanparameter" \"%3D98%3A3b%3A8f" \"%3Abd%3A6b%3A72" \"%26url%3Dhttp%3A" \"%2F%2Fwww" \".msftconnecttest" \".com%2Fredirect" \"%26SSID%3DZJGM" \"-%25E5%25AD%25A6" \"%25E7%2594%259F "# 认证的ip地址post_addr = self.data["post_addr"]# 请求头post_header = {'Request URL': self.data["Request_URL"],'Request Method': self.data["Request_Method"],'Accept': self.data["Accept"],'Accept-Encoding': self.data["Accept_Encoding"],'Accept-Language': self.data["Accept_Language"],'Connection': self.data["Connection"],# 'Content-Length': '','Content-Type': self.data["Content_Type"],'Host': self.data["Host"],'Origin': self.data["Origin"],'User-Agent': self.data["User_Agent"],}# 用户数据post_data = {'userId': userId,'password': password,'service': service,'queryString': queryString,'operatorPwd': "",'operatorUserId': "",'validcode': "",'passwordEncrypt': "",}# 发送post请求登录网页z = requests.post(post_addr, data=post_data, headers=post_header)z.raise_for_status()print("login success!")
读取配置文件
def config(self): # 读取config.json配置文件with open("config.json", "r", encoding='utf-8') as f:self.data = json.loads(f.read())
话不多说直接上源码(有点乱,请多多指教)
# -*- coding: utf-8 -*-
import os
import time
from threading import Timer
import requests
import json
import logging
import socket
import subprocess
import sslclass Reconnect:def __init__(self):self.connectFlag = 0self.data = {}def config(self): # 读取config.json配置文件with open("config.json", "r", encoding='utf-8') as f:self.data = json.loads(f.read())def log(self):logging.basicConfig(filename=os.path.join(os.getcwd(), 'log.txt'), level=logging.INFO,format='%(asctime)s %(filename)s : %(levelname)s %(message)s', # 定义输出log的格式datefmt='%Y-%m-%d %A %H:%M:%S',filemode='w')def getlocalIP(self):# 获取本机电脑名myname = socket.getfqdn(socket.gethostname())# 获取本机ipmyaddr = socket.gethostbyname(myname)return myaddrdef disconnect(self): # 断开wifi# os.system("netsh wlan disconnect")subprocess.call("netsh wlan disconnect", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)def connect_wifi(self, name=None): # 连接wifi# os.system("netsh wlan connect name=%s" % name)cmd = "netsh wlan connect name=" + str(name)subprocess.call(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)def Ping(self):iplist = list()ip = 'www.baidu.com'# backinfo = os.system('ping %s -n 1 -w 1' % ip) # 实现pingIP地址的功能backinfo = subprocess.call('ping www.baidu.com -n 1', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# print(backinfo)if backinfo:print('no')self.connectFlag = 0logging.info('网络未连接')else:iplist.append(ip)self.connectFlag = 1if self.connectFlag == 0:self.disconnect()self.connect_wifi(self.data["WifiName"])time.sleep(5)self.connect() # 认证backinfo = subprocess.call('ping www.baidu.com -n 1',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)# print(backinfo)if backinfo:logging.info('网络连接失败,请检查网络')else:logging.info('网络已连接')t = Timer(self.data["Ping_Interval"], self.Ping, ()).start()def timedPing(self):t = Timer(1, self.Ping, ()).start() # 打开脚本1s后检测一次网络状态,随后60s检测一次def connect(self): # 自动认证myaddr = self.getlocalIP()userId = self.data["userId"] # 用户名password = self.data["password"] # 密码service = self.data["service"]queryString = "wlanacname%3DAC6805%26nasip%3D172.18.95.254%26wlanuserip%3D" + myaddr +"%26wlanparameter" \"%3D98%3A3b%3A8f" \"%3Abd%3A6b%3A72" \"%26url%3Dhttp%3A" \"%2F%2Fwww" \".msftconnecttest" \".com%2Fredirect" \"%26SSID%3DZJGM" \"-%25E5%25AD%25A6" \"%25E7%2594%259F "# 认证的ip地址post_addr = self.data["post_addr"]# 请求头post_header = {'Request URL': self.data["Request_URL"],'Request Method': self.data["Request_Method"],'Accept': self.data["Accept"],'Accept-Encoding': self.data["Accept_Encoding"],'Accept-Language': self.data["Accept_Language"],'Connection': self.data["Connection"],# 'Content-Length': '','Content-Type': self.data["Content_Type"],'Host': self.data["Host"],'Origin': self.data["Origin"],'User-Agent': self.data["User_Agent"],}# 用户数据post_data = {'userId': userId,'password': password,'service': service,'queryString': queryString,'operatorPwd': "",'operatorUserId': "",'validcode': "",'passwordEncrypt': "",}# 发送post请求登录网页z = requests.post(post_addr, data=post_data, headers=post_header)z.raise_for_status()print("login success!")if __name__ == '__main__':reconnect = Reconnect()reconnect.config()reconnect.log()logging.info('用户信息配置成功!')reconnect.timedPing()
json配置文件(信息从上文的消息包中获得)
{"userId": "账号","password": "密码","WifiName": "校园网名","Ping_Interval": 60,"service": "******","queryString": "****","post_addr": "*****","Request_URL": "*****","Request_Method": "POST","Accept": "*/*","Accept_Encoding": "*****","Accept_Language": "*****","Connection": "keep-alive","Content_Type": "application/x-www-form-urlencoded; charset=UTF-8","Host": "*****","Origin": "*****","User_Agent": "*****"}
最后看一下成品
校园网掉线自动重连小助手--Python相关推荐
- 不做无用功 Google Colab掉线自动重连“助手”
由于不可抗拒的因素,我们必须会用到一些外力才可以正常访问Google等网站,如果你的工具不是很稳定,那么使用Colab的时候就不会那么愉快.有时候本想着安安稳稳挂机一夜,第二天早上一看电脑才发现真的是 ...
- 如何使用百度语音识别api将自己的电脑设置成听话的小助手(python)
工程链接:https://download.csdn.net/download/lidashent/11711069 电脑上自带的语音助手功能惨不忍睹,简直不能忍,于是自己写了一个语音助手 这里将使用 ...
- 湖北工业大学深澜校园网断线自动重连
一.采集自己的登录信息 1.在湖工大校园网登录页面点击F12,进入开发者选项. 2.自行输入账号密码,点击连接:在网络标头中找到如下的记录.这都是代码中需要的修改值. 二.将自己的登录信息输入到代码 ...
- [心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连...
此文讲述的内容是一个实际项目开发中的一部分内容,笔者将亲身经历写成文章. [背景] 现 需要实现这样的功能:有多个客户端连着同一个服务器.服务器和客户端之间需要"互相"知道彼此的连 ...
- python 生成excel自动重命名_用Python重命名和保存Excel文件
检查^{}和^{}模块以列出文件夹内容(walk,listdir)并使用路径名(abspath,basename等) 另外,^{}还有一些有趣的复制功能.签出copyfile,并根据从excel文件中 ...
- 超星学习通小助手多线程工具Python
话不多说,直接开始,不会安转的直接使用后面两款,下载直接打开exe运行 第一款:网课小助手python,需要自行安装Python环境(支持Windows.Mac.Linux各种环境) https:// ...
- 如何快速搭建”疫情问答“小助手服务
自2020开年以来,突如其来的新冠肺炎疫情时刻牵动着全国人民的心,网络上各种与疫情相关的新闻也是层出不穷,让人难辨真伪.为让公众了解权威.准确的疫情发展及防护信息,百度大脑智能对话定制与服务平台UNI ...
- 还没抢到春运票?这个12306购票小助手也许能帮到你
一年一度的春运又开启了,相信还有很多小伙伴没有抢到一张回家的车票.没抢到票怎么办?自己动手丰衣足食,这个项目也许能帮到你. 12306 购票小助手 python版本支持 2.7.10 - 2.7.15 ...
- 树莓派python实例_使用Python实现树莓派WiFi断线自动重连实例(附代码)
实现 WiFi 断线自动重连,原理是用 Python 监测网络是否断线,如果断线则重启网络服务.接下来给大家分享实现代码,需要的朋友参考下 1.Python 代码 autowifi.py,放在 /ho ...
最新文章
- linux下创建和删除软、硬链接
- 【设计模式】加薪非要老总批 --- 职责链模式
- Rust: 如何交换Vec类型中数据的位置?
- 威联通 Qnap PK 群晖 Synology 安全篇3
- php jquery制作抖音,抖音制作优质脚本的方法在这里
- 配置一台新的kubuntu
- 03独立按键控制LED移动
- 用python绘制字符画
- VMware环境部署vFW虚拟防火墙
- ubuntu 22.04 系统下载
- 你了解设计公司的服务内容有哪些吗?
- 【matlab】spm数据处理
- 服务器网页能进去app进不去怎么办啊,ao3网页版进入 ao3进不去怎么办
- 推荐一个临时邮箱生成网站,专门用于各种注册用途
- 金山毒霸6 、金山网镖6 增强版 发布在即!!!
- [安洵杯 2019]吹着贝斯扫二维码
- pytorch数据增广
- sqlite 连接oracle,OracleToSqlite数据库转换工具下载
- oracle数据库查看锁表
- 复星医药遭员工举报:比长生生物更恶劣 多次遭美国FDA警告