因为一些原因对一键上网认证程序进行了升级,加了些小功能,分别是:
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