综述

最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它!

决战前夕

首先我们看一下那个验证页面是咋样滴,上个图先

嘿,这界面还算可以把,需要我们输入的东西就是俩,一个就是学号,另一个是身份证号后六位,然后就可以登录,享受免费的无线网啦。

不过不知道谁设置了个登录时长,一段时间后就会掉线了,于是,自动模拟登陆系统就要应运而生啦。

来,我们先点击一下连接,看一下浏览器怎么工作的。

按下F12,监听网络,我们点击第一个响应,也就是login.jsp,看一下。我们具体看一下headers,里面form提交了什么东西,真的是茫茫多的数据啊。嗯,一目了然POST的数据和提交的地址。 让我们来分析几个数据吧:

ClientIP:当前客户端的IP地址,在山大软件园校区这个地址是211.87开头的

timeoutvalue:连接等待时间,也就是俗话说的timeout

StartTime:登录时间,也就是在你登录的那一刻的时间戳,这个时间戳是13位的,精确到了毫秒,不过一般是10位的,我们加3个0就好了

shkOvertime:登录持续时间,这个数据默认是720,也就是12分钟之后,登录就失效了,自动掉线,我们可以手动更改

username:学号

password:密码,也就是我们身份证号后六位

我们需要在登录的时候把form表单中的所有信息都POST一下,然后就可以完成登录啦。 万事俱备,只欠东风,来来来,程序写起来!

一触即发

说走咱就走啊,天上的星星参北斗啊!

登陆地址:Request URL:http://192.168.8.10/portal/login.jsp?Flag=0

首先,我们需要验证一下IP地址,先写一个获取IP地址的函数,首先判断当前IP是不是211.87开头的,如果是的话,证明连接的IP是有效的。 首先我们写一个获取本机IP的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

self.ip_pre = "211.87"    
#获取本机无线IP
    def getIP(self):
        local_iP = socket.gethostbyname(socket.gethostname())
        if self.ip_pre in str(local_iP):
            return str(local_iP)
        ip_lists = socket.gethostbyname_ex(socket.gethostname())
        for ip_list in ip_lists:
            if isinstance(ip_list, list):
                for i in ip_list:
                    if self.ip_pre in str(i):
                        return str(i)
            elif type(ip_list) is types.StringType:
                if self.ip_pre in ip_list:
                    return ip_list

这个方法利用了gethostbyname和gethostbyname_ex方法,获取了各个网卡的IP地址,遍历一下,找到那个211.87开头的IP,返回 接下来,获取到IP之后,我们便可以构建form,然后进行模拟登陆了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

#模拟登录
    deflogin(self):
        printself.getCurrentTime(),u"正在尝试认证QLSC_STU无线网络"
        ip=self.getIP()
        data={
            "username":self.username,
            "password":self.password,
            "serverType":"",
            "isSavePass":"on",
            "Submit1":"",
            "Language":"Chinese",
            "ClientIP":self.getIP(),
            "timeoutvalue":45,
            "heartbeat":240,
            "fastwebornot":False,
            "StartTime":self.getNowTime(),
            #持续时间,超过这个时间自动掉线,可进行设置
            "shkOvertime":self.overtime,
            "strOSName":"",
            "iAdptIndex":"",
            "strAdptName":"",
            "strAdptStdName":"",
            "strFileEncoding":"",
            "PhysAddr":"",
            "bDHCPEnabled":"",
            "strIPAddrArray":"",
            "strMaskArray":"",
            "strMask":"",
            "iDHCPDelayTime":"",
            "iDHCPTryTimes":"",
            "strOldPrivateIP":self.getIP(),
            "strOldPublicIP":self.getIP(),
            "strPrivateIP":self.getIP(),
            "PublicIP":self.getIP(),
            "iIPCONFIG":0,
            "sHttpPrefix":"http://192.168.8.10",
            "title":"CAMS Portal"
        }
        #消息头
        headers={
            'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',
            'Host':'192.168.8.10',
            'Origin':'http://192.168.8.10',
            'Referer':'http://192.168.8.10/portal/index_default.jsp?Language=Chinese'
        }
        post_data=urllib.urlencode(data)
        login_url="http://192.168.8.10/portal/login.jsp?Flag=0"
        request=urllib2.Request(login_url,post_data,headers)
        response=urllib2.urlopen(request)
        result=response.read().decode('gbk')

比较多的内容就在于form表单的数据内容以及请求头,后来利用urllib2的urlopen方法实现模拟登陆。

如果大家对此不熟悉,可以参见

Urllib的基本使用

这样,登录后的结果就会保存在result变量中,我们只需要从result中提取出我们需要的数据就可以了。

乘胜追击

接下来,我们就分析一下数据啦,结果有这么几种:

1.登录成功 2.已经登录 3.用户不存在 4.密码错误 5.未知错误

好,利用result分析一下结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#打印登录结果
    def getLoginResult(self, result):
        if u"用户上线成功" in result:
            print self.getCurrentTime(),u"用户上线成功,在线时长为",self.overtime/60,"分钟"
        elif u"您已经建立了连接" in result:
            print self.getCurrentTime(),u"您已经建立了连接,无需重复登陆"
        elif u"用户不存在" in result:
            print self.getCurrentTime(),u"用户不存在,请检查学号是否正确"
        elif u"用户密码错误" in result:
            pattern = re.compile('<td class="tWhite">.*?2553:(.*?)</b>.*?</td>', re.S)
            res = re.search(pattern, result)
            if res:
                print self.getCurrentTime(),res.group(1),u"请重新修改密码"
        else:
            print self.getCurrentTime(),u"未知错误,请检查学号密码是否正确"

通过字符串匹配和正则表达式,我们分辨并提取出了上述五种情况。

增加循环检测 既然是检测网络是否断开,那么我们只需要每隔一段时间检测一下就好了,那就10秒吧。

因为这个10秒是可配置的,为了方便配置,统一配置到__init__方法里面。

1
2

#检测间隔时间,单位为秒
self.every=10

然后,我们写一个循环来检测一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

while True:
            nowIP = self.getIP()
            if not nowIP:
                print self.getCurrentTime(), u"请检查是否正常连接QLSC_STU无线网络"
            else:
                print self.getCurrentTime(),u"成功连接了QLSC_STU网络,本机IP为",nowIP
                self.login()
                while True:
                    can_connect = self.canConnect()
                    if not can_connect:
                        nowIP = self.getIP()
                        if not nowIP:
                            print self.getCurrentTime(), u"当前已经断线,请确保连接上了QLSC_STU网络"
                        else:
                            print self.getCurrentTime(), u"当前已经断线,正在尝试重新连接"
                            self.login()
                    else:
                        print self.getCurrentTime(), u"当前网络连接正常"
                    time.sleep(self.every)
            time.sleep(self.every)

其中我们用到了canConnect方法,这个就是检测网络是否已经断开的方法,我们可以利用ping百度的方法来检测一下。

方法实现如下

1
2
3
4
5
6
7
8
9

#判断当前是否可以联网
    defcanConnect(self):
        fnull=open(os.devnull,'w')
        result=subprocess.call('ping www.baidu.com',shell=True,stdout=fnull,stderr=fnull)
        fnull.close()
        ifresult:
            returnFalse
        else:
            returnTrue

好啦,所有的要点我们已经逐一击破,等着凯旋吧

收拾战场

好了,所有的代码要点已经被我们攻破了,接下来就整理一下,让他们组合起来,变成一个应用程序吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

__author__ = 'CQC'
#-*- coding:utf-8 -*-
import urllib
import urllib2
import socket
import types
import time
import re
import os
import subprocess
class Login:
    #初始化
    def __init__(self):
        #学号密码
        self.username = '201200131012'
        self.password = 'XXXXXX'
        #山大无线STU的IP网段
        self.ip_pre = '211.87'
        #登录时长
        self.overtime = 720
        #检测间隔时间,单位为秒
        self.every = 10
    #模拟登录
    def login(self):
        print self.getCurrentTime(), u"正在尝试认证QLSC_STU无线网络"
        ip = self.getIP()
        data = {
            "username": self.username,
            "password": self.password,
            "serverType": "",
            "isSavePass": "on",
            "Submit1": "",
            "Language": "Chinese",
            "ClientIP": self.getIP(),
            "timeoutvalue": 45,
            "heartbeat": 240,
            "fastwebornot": False,
            "StartTime": self.getNowTime(),
            #持续时间,超过这个时间自动掉线,可进行设置
            "shkOvertime": self.overtime,
            "strOSName": "",
            "iAdptIndex": "",
            "strAdptName": "",
            "strAdptStdName": "",
            "strFileEncoding": "",
            "PhysAddr": "",
            "bDHCPEnabled": "",
            "strIPAddrArray": "",
            "strMaskArray": "",
            "strMask": "",
            "iDHCPDelayTime": "",
            "iDHCPTryTimes": "",
            "strOldPrivateIP": self.getIP(),
            "strOldPublicIP": self.getIP(),
            "strPrivateIP": self.getIP(),
            "PublicIP": self.getIP(),
            "iIPCONFIG":0,
            "sHttpPrefix": "http://192.168.8.10",
            "title": "CAMS Portal"
        }
        #消息头
        headers = {
            'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',
            'Host': '192.168.8.10',
            'Origin': 'http://192.168.8.10',
            'Referer': 'http://192.168.8.10/portal/index_default.jsp?Language=Chinese'
        }
        post_data = urllib.urlencode(data)
        login_url = "http://192.168.8.10/portal/login.jsp?Flag=0"
        request = urllib2.Request(login_url, post_data, headers)
        response = urllib2.urlopen(request)
        result = response.read().decode('gbk')
        self.getLoginResult(result)
    #打印登录结果
    def getLoginResult(self, result):
        if u"用户上线成功" in result:
            print self.getCurrentTime(),u"用户上线成功,在线时长为",self.overtime/60,"分钟"
        elif u"您已经建立了连接" in result:
            print self.getCurrentTime(),u"您已经建立了连接,无需重复登陆"
        elif u"用户不存在" in result:
            print self.getCurrentTime(),u"用户不存在,请检查学号是否正确"
        elif u"用户密码错误" in result:
            pattern = re.compile('<td class="tWhite">.*?2553:(.*?)</b>.*?</td>', re.S)
            res = re.search(pattern, result)
            if res:
                print self.getCurrentTime(),res.group(1),u"请重新修改密码"
        else:
            print self.getCurrentTime(),u"未知错误,请检查学号密码是否正确"
    #获取当前时间戳,13位
    def getNowTime(self):
        return str(int(time.time()))+"000"
    #获取本机无线IP
    def getIP(self):
        local_iP = socket.gethostbyname(socket.gethostname())
        if self.ip_pre in str(local_iP):
            return str(local_iP)
        ip_lists = socket.gethostbyname_ex(socket.gethostname())
        for ip_list in ip_lists:
            if isinstance(ip_list, list):
                for i in ip_list:
                    if self.ip_pre in str(i):
                        return str(i)
            elif type(ip_list) is types.StringType:
                if self.ip_pre in ip_list:
                    return ip_list
    #判断当前是否可以联网
    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"您好,欢迎使用模拟登陆系统"
        while True:
            nowIP = self.getIP()
            if not nowIP:
                print self.getCurrentTime(), u"请检查是否正常连接QLSC_STU无线网络"
            else:
                print self.getCurrentTime(),u"成功连接了QLSC_STU网络,本机IP为",nowIP
                self.login()
                while True:
                    can_connect = self.canConnect()
                    if not can_connect:
                        nowIP = self.getIP()
                        if not nowIP:
                            print self.getCurrentTime(), u"当前已经掉线,请确保连接上了QLSC_STU网络"
                        else:
                            print self.getCurrentTime(), u"当前已经掉线,正在尝试重新连接"
                            self.login()
                    else:
                        print self.getCurrentTime(), u"当前网络连接正常"
                    time.sleep(self.every)
            time.sleep(self.every)
login = Login()
login.main()

来,我们来运行一下,看下效果吧! 执行

1
pythonlogin.py

当前是可以联网的,我分别在网页上操作执行了断开,操作,程序自动检测到掉线,自动重新连接。

接下来我直接断开了QLSC_STU网络的链接,程序同样检测到QLSC_STU这个热点没有连接上,提示用户链接。

接下来我重新连接上了这个热点,由于刚才已经登录上线,且持续时间较短,网络自动恢复正常。

下面是运行结果:

嗯,这样我们就是实现了自动掉线的检测和模拟登录。

凯旋而归

咿呀伊尔哟,想约妹子上自习吗?那就赶紧来试试吧!一网在手,天下我有!追男神女神都不再是梦想!

如果有问题,欢迎留言讨论,代码肯定有不完善的地方,仅供参考。

转载请注明:静觅 » 自己动手实现山东大学QLSC_STU无线网络掉线后自动重连

自己动手实现山东大学QLSC_STU无线网络掉线后自动重连相关推荐

  1. shell 判断网线插拔_shell脚本自动检测网络掉线和自动重连

    在ppp移植成功后,有时会出现ppp掉线等情况.这篇文章写了一个自动检测连接网络的解决方法. 创建一个shell脚本,在里面添加一下内容.(记得给操作权限) #!/bin/sh //根据你自己的she ...

  2. linux脚本ping如何自动退出,shell脚本自动检测网络掉线和自动重连

    在ppp移植成功后,有时会出现ppp掉线等情况.这篇文章写了一个自动检测连接网络的解决方法. 创建一个shell脚本,在里面添加一下内容.(记得给操作权限) #!/bin/sh //根据你自己的she ...

  3. linux 网卡自动挂死,shell脚本自动检测网络掉线和自动重连

    在ppp移植成功后,有时会出现ppp掉线等情况.这篇文章写了一个自动检测连接网络的解决方法. 创建一个shell脚本,在里面添加一下内容.(记得给操作权限) #!/bin/sh //根据你自己的she ...

  4. shell脚本:自动检测网络掉线和自动重连。

    在ppp移植成功后,有时会出现ppp掉线等情况.这篇文章写了一个自动检测连接网络的解决方法. 创建一个shell脚本,在里面添加一下内容.(记得给操作权限) #!/bin/sh //根据你自己的she ...

  5. linux禁用网络连接wifi,禁用IPv6,解决Debian8系统无线网络掉线问题

    我的Debian系统经常出现无线网络连接掉线的情况,这也是很多Linux用户会遇到的问题,本文讲解如何禁用IPv6以解决Debian8系统WiFi掉线的问题. Wifi掉线具体症状 打开终端,使用pi ...

  6. 无线网络连接后总是提示可能需要其他登陆信息

    无线网络连接后总是提示可能需要其他登陆信息,但网络已连接可以上网. 运行(开始菜单键+R)输入 regedit 回车打开注册表编辑器. 找到注册表键值HKEY_LOCAL_MACHINE\SYSTEM ...

  7. Linux无线网络已经禁用,无线网络启用后还显示已禁用怎么办

    无线网络启用后还显示已禁用怎么办? 方法一: 1.检查是否禁用了网络适配器:控制面板-硬件和声音-设备管理器-网络适配器-右键-启用 2.检查有关服务是否开启:开始-搜索框直接输入"服务&q ...

  8. 网络克隆自动修改计算机名ip,关于 Ghost 网络克隆后自动修改 IP 及计算机名的方法.doc...

    关于 Ghost 网络克隆后自动修改 IP 及计算机名的方法 关于 Ghost 网络克隆后自动修改 IP 及计算机名的方法最近机房要大批量安装 XP 系统,考虑到种种因素,还是决定采用较成熟的 PXE ...

  9. drcom上网登录窗不弹出_无线网络连接后不能弹出浏览器登录页面是怎么回事?

    展开全部 1.浏览器问题: 尽量使用IE浏览器并关闭阻止窗口弹出功能. 打开浏览器,点击浏62616964757a686964616fe4b893e5b19e31333365633939览器上方工具栏 ...

最新文章

  1. Python之sklearn2pmml:sklearn2pmml库函数的简介、安装、使用方法之详细攻略
  2. linux中刻录iso到光盘
  3. ubuntu20.04的xfce4下面安装百度输入法linux版本
  4. 中介者模式java_图解Java设计模式之中介者模式
  5. 一个“老”程序员的思考
  6. Tensorflow--图
  7. python怎么另起一行阅读答案_使用Python+Dlib构建人脸识别系统(在Nvidia Jetson Nano 2GB开发板上)...
  8. c语言二维数组应该注意,第08天C语言(02):二维数组-注意点
  9. asp.net ajax updatepanel中textbox 乱码问题 解决方案
  10. 基于遗传算法优化极限学习机预测及其MATLAB实现-附代码
  11. win10台式机前置耳机无声音解决方案
  12. Java多线程面试题(面试必备)
  13. PGMIntro概率图模型
  14. Blender 粒子系统 调整粒子物理大小
  15. TK1刷机以及简单配置
  16. 经典的三角形软件测试用例
  17. 莱布尼兹普遍演算的定义注释--逻辑与算法之十八
  18. 基于TMS32F28035的CLA学习
  19. 黑苹果big sur版本安装安卓USB共享网络(100%成功)
  20. 出租屋路由器DHCP模式连接经常断网处理

热门文章

  1. 用RPython在云端运行可扩展数据科学
  2. 主成分分析(PCA)——以2维图像为例
  3. 高并发编程-Wait Set 多线程的“休息室”
  4. Spring Cloud【Finchley】实战-06使用/actuator/bus-refresh端点手动刷新配置 + 使用Spring Cloud Bus自动更新配置
  5. linkstack头文件 c语言,链式栈的基本操作——LinkStack(C语言版)
  6. 学习笔记Hadoop(八)—— Hadoop集群的安装与部署(5)—— Hadoop配置参数介绍、Hadoop集群启动与监控
  7. 数据结构与算法笔记(八)—— 插入排序
  8. windows经典地雷小游戏(C语言实现)
  9. SpringBoot微信公众号授权访问认证文件部署
  10. java在mac下开发环境_Java开发环境安装(MacOS、Windows)