python3一键上网认证的图形化exe程序(下篇)

因为一些原因对一键上网认证程序进行了升级,加了些小功能,分别是:

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


猜你喜欢

转载自blog.csdn.net/qq_42193971/article/details/80325632