因为一些原因对一键上网认证程序进行了升级,加了些小功能,分别是:
1.点击一键上网认证的时候自动弹出浏览器打开一个网站,
2.检测是否联网成功
详细
1.点击一键上网认证的时候自动弹出浏览器打开一个网站
主要是用windows系统自带的ping功能,这里我参考了一些资料写的两个方法:
import os #open the IE windows os.system('"C:/Program Files/Internet Explorer/iexplore.exe" www.baidu.com')
以及:
#-*- coding:UTF-8 -*- import sys import webbrowser sys.path.append("libs") #系统的默认浏览器中访问url地址 url = 'http://www.baidu.com' webbrowser.open(url) print (webbrowser.get())
前者不如用后者(webbrowser模块)的方法,前者会先用cmd再打开ie浏览器,会出现黑框,而且比较慢。后者是打开默认浏览器再打开网址。
这里有一点奇怪的地方,我用后者的方法打开百度就是用我的qq浏览器(默认),但是打开学校的内网就会开启ie浏览器。搞不懂。。。
2.检测是否联网成功
这里包括两部分:检测联网,提示信息
# -*- coding: utf-8-*- import os import re import tkinter.messagebox #打开cmd并填入参数,这里是ping www.baidu.com,然后用text存储cmd返回的结果 def execCmd(cmd): r = os.popen(cmd) text = r.read() r.close() return text if __name__ == '__main__': cmd = 'ping www.baidu.com' result = execCmd(cmd) #用result储存cmd返回的结果 print (result) #用三个正则提取出返回的结果中的丢包数,一般发送四个包用来测试丢包率 diubao1 = re.search('\n 数据包:(.*)',result).group(0) diubao2 = re.search('丢失 = (\d)',diubao1).group(0) diubao = re.search('(\d)',diubao2).group(0) print (diubao) #如果丢包数小于2,则连接成功,否则失败 if int(diubao) < 2: tkinter.messagebox.showinfo(u'提示',u'联网成功') #成功的提示框 else: tkinter.messagebox.showinfo(u'提示',u'联网失败请重试')
就是用代码通过电脑的cmd窗口ping www.baidu,com
然后读取返回的信息,用正则提取出丢包数。
这后面的通过丢包数来检测是否联网成功是自己想的,不知道这样判断准不准确
这里正则我还纠结了一下,注意re.search是返回引号里的所有内容的
然后上终极整合版代码:
#-*- coding: utf-8-*- #by allenc 2018.5.15 import requests #用来发送请求的库 import re #正则表达式的库 import socket #获取ip的库 import os #用于网络测试部分 import sys #系统库 import webbrowser #自动打开浏览器部分 from tkinter import * #创建gui的库 sys.path.append("libs") #创建GUI root = Tk() #创建主窗口 root.title(u"华立一键上网工具") root.geometry('300x280') label=Label(root,text='华 立 专 用 一 键 上 网 工 具',font='Helvetica -12 bold') #设置标签字体的初始大 小 label.pack() #创建问题及文本框 l1=Label(root,text="请输入你的上网账号") l1.pack() #指定包管理器放置组件 q1_text = StringVar() #文本框 q1 = Entry(root, textvariable = q1_text) q1_text.set(" ") q1.pack() l2 = Label(root, text="请输入你的密码") l2.pack() #这里的side可以赋值为LEFT RTGHT TOP BOTTOM q2_text = StringVar() q2 = Entry(root, textvariable = q2_text) q2_text.set(" ") q2.pack() #测试网络,打开cmd并填入参数,这里是ping www.baidu.com,丢包数小于2即成功,否则失败 def execCmd(): r = os.popen('ping www.baidu.com') result = r.read() diubao1 = re.search('\n 数据包:(.*)',result).group(0) #正则提取丢包数 r.close() diubao2 = re.search('丢失 = (\d)',diubao1).group(0) diubao = re.search('(\d)',diubao2).group(0) if int(diubao) < 2: label=Label(root,text='联网成功') label.pack(side = 'bottom') #成功的标题 else: label=Label(root,text='联网失败') label.pack(side = 'bottom') #失败的标题 #创建储存账号密码的文本 def getpd_num(): f = open(r'data.txt','w') q1 = q1_text.get() q2 = q2_text.get() data = [q1,q2] for each in data: f.write(each + '\n') f.close() # print(u"储存账号密码成功") #一键上网认证 def shangxian(): post_addr="http://219.136.125.139/portalAuthAction.do" #构造头部信息 my_headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko', 'Accept': 'text/html, application/xhtml+xml, image/jxr, */*', 'Accept-Language': 'zh-CN', 'Accept-Encoding': 'gzip, deflate', 'Host':'219.136.125.139', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache', 'Content-Length': '511',#这个不同甚至没有无伤大雅 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': 'JSESSIONID=19AE14CB4E83F1342FE36944A6609E86.worker4', 'Referer': 'http://219.136.125.139/portalReceiveAction.do?wlanuserip=10.110.75.3&wlanacname=gzhlxy&wlanacip=183.56.17.19' } #构造登录数据 post_data={ 'passwd': str(pw),#不同 'userid': str(num) + '@GDHLXY',#不同 'useridtemp': str(num),#不同 'wlanacIp': '183.56.17.19', 'wlanacname': 'gzhlxy', 'wlanuserip': str(ipaddr)#不同 } # print (post_data) #发送post请求上网认证 z=requests.post(post_addr,data=post_data,headers=my_headers) #系统的默认浏览器中访问url地址 url = '10.110.2.15' #荔香站的首页 webbrowser.open(url) #通过ping www.baidu.com测试网络 execCmd() #一键下线 def xiaxian(): post_addr="http://219.136.125.139/portalDisconnAction.do" #构造头部信息 my_headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko', 'Accept': 'text/html, application/xhtml+xml, image/jxr, */*', 'Accept-Language': 'zh-CN', 'Accept-Encoding': 'gzip, deflate', 'Host':'219.136.125.139', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache', 'Content-Length': '571',#这个字符长度感觉有没有都可以 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': 'JSESSIONID=AFC7D6719362D1B0B120147B709F608D.worker4',#每次请求的cookie都不一样,但是同一个cookie应该可以重复使用 'Referer': 'http://219.136.125.139/portalReceiveAction.do'#referer的意思应该是请求时的界面的地址 } #构造登录数据 post_data={ 'act': 'DISCONN',#下线的统一是这个 'message': '%C4%FA%B5%C4%BF%C9%D3%C3%CC%EC%CA%FD%CE%AA%28%CC%EC%29%3A20.0',#下线的统一是这个 'url': 'http%3A%2F%2Fabout%3Ablank',#下线的统一是这个 'userid': str(num) + '@GDHLXY',#不同 'wlanacIp': '183.56.17.19', 'wlanacname': 'gzhlxy', 'wlanuserip': str(ipaddr)#不同 } # print(post_data) #发送post请求登录网页 z=requests.post(post_addr,data=post_data,headers=my_headers) if __name__ == '__main__': Button(root,text="提交",command = getpd_num).pack() #提交数据的按钮 #用正则表达式获取txt中储存的账号和密码 f = open(r'data.txt','r') data = f.read() num1 = re.search('(.*)\n',data).group(0) num = re.search('(\S+)',num1).group(0) print (num) f.close() f = open(r'data.txt','r') data = f.read() pw1 = re.search('\n(.*)',data).group(0) pw = re.search('(\S+)',pw1).group(0) print (pw) f.close() #获取本机ip地址 hostname = socket.gethostname() #获取主机名 ipaddr = socket.gethostbyname(hostname) #获取ipv4地址 #一键上线的按钮 Button(root,text="一键上网",command = shangxian).pack(side='left', padx=25, pady=10) #一键上网按钮 #一键下线的按钮 Button(root,text="一键下线",command = xiaxian).pack(side = 'right',padx=25, pady=10) #一键下线按钮 #作者注释 label=Label(root,text='---by 荔香') label.pack(side = 'bottom') root.mainloop()
这里整合的检测联网部分用了底部标题来提示是否联网成功
不知道为什么,我未打包的时侯是可以出现提示框的,打包了以后就失效了,所以换成这个底部标题来提示。但是这并没有解决问题,还是同样的问题出现,于是我用pyinstaller -D -w 文件名.py的方法打包(依赖文件夹中的文件的exe),就解决了。
还有检测联网部分,要是没有网络或者网络差的情况下运行,他的响应速度比较慢,因为需要时间去判断是否丢包,
因为这点不太想做这个功能,但是秉承完善的思路还是做了。
本来准备做异常处理的,但是异常这么多,不知道应该如何在我的代码的基础上加上完整的异常处理,所以就先不做这个功能,还是以后有机会再弄
这个界面感觉有点丑,是用thinker做的,我发现有个叫pyqt5的模块很适合做GUI界面,但是这里面水挺深的,之前安装了两次都失败了,下载速度极慢,所以就先算了。以后有机会再弄
pyqt5可以完成的效果:
保持永远学习上进的状态QAQ
--by allenc