山东大学校园网自动重连(python3.6)

临近考试周,要经常查资料,而山东大学软件园校区的无线网QLSC_STU总是每隔十几分钟就会断一次,于是就用python写了个自动重连的小程序。

开发工具

python3.6
pycharm2107.1.3

分析

headers中的内容:
山东大学校园网自动重连(python3.6)_第1张图片

提交的form data:
山东大学校园网自动重连(python3.6)_第2张图片
Client IP 是接入无线网后分配的客户端ip
StartTime:登录时间,登录的那一刻的时间戳,这个时间戳是13位的,精确到了毫秒
username:学号
password:密码

登陆的时候只要把form data 使用requests包的post方法传到http ://192.168.8.10/portal/login.jsp?Flag=0就可以了


获取ip是第一步,也是唯一有难度的一步,执行cmd命令ipconfig,可以看到无线局域网适配器中的IPv4地址正是我们需要的ip地址,将其取出即可。
山东大学校园网自动重连(python3.6)_第3张图片

然后设置一个循环检测时间,如果检测到断网就进行自动重连

代码实现

# coding=utf-8

import requests
import time
import os
import subprocess
import re

class Reconnect:
    # 初始化
    def __init__(self):
        # 检测间隔时间,单位为秒
        self.every = 10


    # 获取当前时间戳,13位
    def getNowTime(self):
        return str(int(time.time())) + "000"
    # 获取ip
    def get_ipconfig_ip(self):

        ipconfig_result_list = os.popen('ipconfig').readlines()  # 执行cmd命令ipconfig,并将结果存于ipconfig_result_list

        for i in range(0, len(ipconfig_result_list)):  # 逐行查找
            if re.search(r'无线局域网适配器 WLAN', ipconfig_result_list[i]) != None:

                for j in range(1, 8):
                    if re.search(r"IPv4 地址", ipconfig_result_list[i + j]) != None:
                        match_ip = re.search(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', ipconfig_result_list[i + j]).group(
                            0)  # 由正则表达式获取ip地址
                        return match_ip

        return None

    # 模拟登录
    def login(self):
        print(self.getCurrentTime(), u"拼命连网中...")

        url = "http://192.168.8.10/portal/login.jsp?Flag=0"
        # 消息头
        headers = {
            'Host': "192.168.8.10",
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
            'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            'Accept-Language': "zh-CN,zh;q=0.8",
            'Accept-Encoding': "gzip, deflate",
            'Referer': "http://192.168.8.10/portal/index_default.jsp?Language=Chinese",
            'Upgrade - Insecure - Requests': '1',
            'Cache - Control': 'max - age = 0',
            'Connection': "keep-alive",
            'Origin': 'http://192.168.8.10',
            'Content-Type': "application/x-www-form-urlencoded",
            'Content-Length': '360'
        }

        self.ip=self.get_ipconfig_ip()
        # 提交的信息
        data = {
            'Language': 'Chinese',
            'ClientIP': self.ip,
            'timeoutvalue': '45',
            'heartbeat': '240',
            'fastwebornot': False,
            'StartTime': self.getNowTime(),
            'username': '201400210073',
            'password': '',#输入密码
            'shkOvertime': '720',
            'strOldPrivateIP': self.ip,
            'strOldPublicIP': self.ip,
            'strPrivateIP': self.ip,
            'PublicIP': self.ip,
            'iIPCONFIG':0,
            'sHttpPrefix': 'http://192.168.8.10'
        }

        try:
            r = requests.post(url, headers=headers, data=data)
            print(r.text)
            print(self.ip)
            print(self.getCurrentTime(), u'连上了...现在开始看连接是否正常')
        except:
            print("连接失败")

    def canConnect(self):

        fnull = open(os.devnull, 'w')
        result = subprocess.call('ping www.baidu.com', shell=True, stdout=fnull, stderr=fnull)
        fnull.close()
        if result:
            return False
        else:
            return True

    # 获取当前时间
    def getCurrentTime(self):
        return time.strftime('[%Y-%m-%d %H:%M:%S]', time.localtime(time.time()))

        # 主函数

    def main(self):
        print(self.getCurrentTime(), u"Hi,欢迎使用自动登陆系统")
        while True:
            self.login()
            while True:
                can_connect = self.canConnect()
                if not can_connect:
                    print(self.getCurrentTime(), u"断网了...")
                    self.login()
                else:
                    print(self.getCurrentTime(), u"一切正常...")
                time.sleep(self.every)
            time.sleep(self.every)


reconnect = Reconnect()
reconnect.main()

你可能感兴趣的:(python,python)