很多软件都需要更新,而如何才可以让前台的程序受后台控制,可以更新呢?那么,今天就来教大家如何编写程序的更新程序。
搭建一个本地服务器
可以直接在cmd里cd到指定目录,然后py -m http.server 80。
创建好后,创建一个test.txt,先将其为空。
接着,放置一个xxx.exe。
代码走起
代码:
# coding:utf-8
import urllib
import chardet
try:
from urllib import request
response = request.urlopen("http://localhost/test.txt") #在这里的test.txt里注意填写的是最新版本的程序的下载链接。例如:http://localhost:5000/1.exe
html = response.read()
# charset = chardet.detect(html) # 查看编码类型
# print(charset)
html = html.decode('utf-8') # 对二进制码进行解码
if html == "":
exit()
else:
print("检测到当前版本过旧,有新版本啦!")
print("正在更新,请稍等哦~")
import os
try:
url = html
filename = url[url.rindex('/') + 1:] # 截取文件名
print('filename = ' + filename)
print("正在下载!")
downloaded = '0'
def download_listener(a, b, c):
per = 100.0 * a * b / c
if per > 100:
per = 100
new_downloaded = '%.1f' % per
global downloaded
if new_downloaded != downloaded:
downloaded = new_downloaded
print('download %s%% %s/%s' % (downloaded, a * b, c))
path = "C:/" #你可以自己设置
if not os.path.exists(path):
os.mkdir(path)
response = urllib.request.urlretrieve(url, path + filename, download_listener)
os.system("start C:/xxx.exe") #运行新版本程序
print("下载完成!正在关闭旧版本程序!")
exit()
except:
print("啊哦~出错啦!你的网络貌似不佳哦~")
except:
print("出错啦!")
运行后,发现:唉,怎么退出啦?
仔细观察,里面有:
if html == "":
exit()
因为test.txt等于空,所以程序退出了。
那么,怎么才能让它正确的运行呢?
修改test.txt
修改test.txt为xxx.exe的链接,例如:
http://localhost/xxx.exe/ 请务必填写上http头部,不然,就会出错。
接着,运行程序。
成功
程序运行成功,并且下载了xxx.exe到C:/下,然后,还运行了xxx.exe。并且退出了程序。
如何在后台控制前台程序?
你需要将内网的localhost映射到外网。
你可以试试花生壳等产品。
我用花生壳映射一个域名:myweb.imwork.net
那么,我们的代码就可以改为:
# coding:utf-8
import urllib
import chardet
try:
from urllib import request
response = request.urlopen("http://myweb.imwork.net/test.txt") #在这里的test.txt里注意填写的是最新版本的程序的下载链接。例如:http://localhost:5000/1.exe
html = response.read()
# charset = chardet.detect(html) # 查看编码类型
# print(charset)
html = html.decode('utf-8') # 对二进制码进行解码
if html == "":
exit()
else:
print("检测到当前版本过旧,有新版本啦!")
print("正在更新,请稍等哦~")
import os
try:
url = html
filename = url[url.rindex('/') + 1:] # 截取文件名
print('filename = ' + filename)
print("正在下载!")
downloaded = '0'
def download_listener(a, b, c):
per = 100.0 * a * b / c
if per > 100:
per = 100
new_downloaded = '%.1f' % per
global downloaded
if new_downloaded != downloaded:
downloaded = new_downloaded
print('download %s%% %s/%s' % (downloaded, a * b, c))
path = "C:/" #你可以自己设置
if not os.path.exists(path):
os.mkdir(path)
response = urllib.request.urlretrieve(url, path + filename, download_listener)
os.system("start C:/xxx.exe") #运行新版本程序
print("下载完成!正在关闭旧版本程序!")
exit()
except:
print("啊哦~出错啦!你的网络貌似不佳哦~")
except:
print("出错啦!")
这样,程序就会爬取那个txt文件的信息,接着,下载文件到C盘,并更新了。
但是你需要确保你的网站有足够的流量进行下载操作,不然,可能会导致你的网站流量超出!
改进程序——支持删除旧程序
如何支持删除旧程序?那就需要新程序的帮忙了。
新程序运行后,先检查全盘中有没有指定的特殊文件,例如xxx.exe.detailedinformation,如果有,那么就获取那个文件的目录,然后截取前面的内容,加上“xxx.exe”,然后,删除那个旧的xxx.exe。
此处,因为太简单了,本人就不贴代码了。大家自己看看吧,特别简单。
如何应对程序名称被更改?
那可能就需要结合内容了。你可以在全盘(除了Windows目录)进行读取,读取文件内容,如果里面包含一些主要的东西,那么,判定这个文件就是旧程序。也许你需要截取你的应用程序的部分特征,才可以识别。
或者,你可以给你的应用程序“加花”,自己写一个特殊的花指令。如果检测到这种花指令,那么,就判定。