工具主要功能说明:
可以让软件每次打开时,自动检测是否有更新,此功能无需软件作者具备服务器。
使用说明及实现原理:
1、蓝奏云网盘设置:网盘中要设置一个带密码的文件夹(假设为:HotUpdate)用于存放软件更新数据及更新说明(更新数据、更新说明文件不要设置密码);
2、设置更新说明:更新说明为txt文件,里面内容为新版本更新的主要内容,txt文件名需要设置为大写 V. + 最新版本号 + . dll (例如:V.1.0.1.dll ),上传到 HotUpdate文件夹;
3、设置更新数据:更新数据用压缩为zip格式,更新数据文件名需要设置为大写 U. +最新版本号+.zip(例如:U.1.0.1.zip ),上传到 HotUpdate文件夹 ;
4、初始化设置:(1)设置网址为 HotUpdate文件夹分享地址【必填】,例如:https://guoren.lanzouo.com/b00wvmvli
(2)密码为HotUpdate文件夹分享密码【必填】,例如:0000
(3)软件现行版本号为未更新的软件版本号【必填】,例如:1.0.0
(4)更新软件logo:用于设置更新程序左上角logo【选填】,例如:/小白点/xbd.png
(5)软件启动程序路径:要启动的程序填写相对本软件路径【必填】,例如:/小白点/小白点A股助手.exe
6、原理:获取HotUpdate所有文件名称,取第一个以 V. 开头 .dll 结尾的文件并取中间的版本号(V.1.0.1.dll 取1.0.1),获取软件现行版本号(1.0.0),两个版本号不一样,检查是否存在U.1.0.1.zip ,如果存在则获取更新内容,让用户选择是否更新。
2023/8/29 11:20 更新
V1.0.1
aardio重构,去除python代码,体积变小 17.8M ——> 789 k
软件链接:https://guoren.lanzouy.com/b00xj009c 密码:52pj
说下实现的思路,大家用的编程语言不一样,源码没有参考价值(我这边用的是aardio+python实现的)。
这个东西本质就是蓝奏云直链解析
本次用 https://guoren.lanzouy.com/b00wvmvli密码:0000 为例进行讲解,采用手机网页版访问(稳定),因此请求头设置手机浏览器请求头:Mozilla/5.0 (Linux; Android 7.1.2; PCT-AL10 Build/N2G47H; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.116 Mobile Safari/537.36 XWEB/5197 MMWEBSDK/20221109 MMWEBID/5104 MicroMessenger/8.0.31.2281(0x28001F39) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android
1、get请求:https://guoren.lanzouy.com/b00wvmvli 得到内容有这一段:
[JavaScript] 纯文本查看 复制代码
<script type="text/javascript">
var imzcbj ='HotUpdate';
document.title = imzcbj;
document.getElementById('sp_name').innerHTML=imzcbj; var pwd;
var pgs;
var ib2o7x = '1693209538';
var _h109q = 'a6fb8e273dd47b11b3fc800a2fcba9b3';
pgs =1;
function file(){
var pwd = document.getElementById('pwd').value;
$('#sub').val("提交中...");
$.ajax({
type : 'post',
url : '/filemoreajax.php',
data : {
'lx':2,
'fid':7417478,
'uid':'1162887',
'pg':pgs,
'rep':'0',
't':ib2o7x,
'k':_h109q,
'up':1,
'ls':1,
'pwd':pwd },
dataType : 'json',
然后截取一下字符串,整理一下得到下次post请求的data,把data带入第二次请求
post 请求 https://guoren.lanzouy.com/filemoreajax.php
[JavaScript] 纯文本查看 复制代码
data = {lx: 2,
fid: 7417478,
uid: 1162887,
pg: 1,
rep: 0,
t: 1693209538,
k: a6fb8e273dd47b11b3fc800a2fcba9b3,
up: 1,
ls: 1,
pwd: 0000}
得到:[JavaScript] 纯文本查看 复制代码
{"zt":1,"info":"sucess","text":[{"icon":"dll","t":0,"id":"ibVKf16ft28h","name_all":"V.1.0.1.dll","size":"81.0 B","time":"\u524d\u592922:01","duan":"i16ft28","p_ico":0},{"icon":"zip","t":0,"id":"ieQ8U16ft27g","name_all":"U.1.0.1.zip","size":"39.4 M","time":"\u524d\u592922:01","duan":"i16ft27","p_ico":0}]}
把文件的id进行拼接 得到下次请求url ,(例如,"id":"ibVKf16ft28h")拼接文件详情链接(手机版)---> https://guoren.lanzouo.com/ + tp/ + ibVKf16ft28h
第三次请求,get 请求 https://guoren.lanzouo.com/tp/ibVKf16ft28h
得到网页中有[JavaScript] 纯文本查看 复制代码
<script type="text/javascript">var cppat = 'as';
var tedomain ='c';
var vkjxld = 'https://developer-oss.lanzouk.com/file/';
var tedomaina = '';
var hyggid = '?UjRXaQ08VGUIAQU9BDFRPVZpBz8DKldkBy5XYVQmUWEGKAEyDj9UbFEhCjpRbFM+AzxQCldhBGIDOVptBWgBMFJlVzENZVQ2CGYFagR2UTZWfwc/A2RXZAcmVyFUeFFtBjQBZg5hVDNRKApsUTFTfQNoUGZXJwQxAzxaPQVgATZSMFdmDWZUMgg8BWMEZlE2VjkHZwNsVzEHMFdjVDpRYgZgAWYOMlQ1UWQKPVE0UzQDOFA3VzEEKANgWjAFNQEmUidXcw01VHIINwU3BG1RYVY9BzQDbldtBzhXZlQuUSQGbwE7DjZUZlE6Cm1RM1NrA2tQbFc9BDUDNVppBWsBJlI0V2wNJ1Q9CG8FZQRoUWJWPAc3A2hXZwcwV2ZULlElBnYBIQ5uVDFRMQpkUTRTYQNuUGVXOAQyAzJaegUsAWlSIlc9DWFUOAhuBX0EYVFgVjUHLANtV2EHMFd/VDtRYAYgATIOP1Q9UTc=';
var domianload = 'c';
//var subtis = 'sa';
(function(document) {
var submit = document.getElementById('submit');
submit.onfocus = submit.onmousedown = function() {
submit.href = vkjxld + hyggid
}
取 vkjxld + hyggid 得到下次请求url ,这里可以进行判断(vkjxld 、 hyggid 这两个变量名有可能会变),用 = 分割为列表listone ,遍历listone ,listone前几个字符串为“https 且同时存在 lanzou 那 listone 切割 ‘ 得到 https://developer-oss.lanzouk.com/file/ , listone[i-1]切割 var 得到变量名称(注意去除空格),hyggid 变量名及他的值同理亦可得。
第四次请求,这次比较特殊, vkjxld + hyggid得到的链接实际上是重定向的,要用head方法进行请求,解析取Location的值就是文件直链
剩下的事情就简单了,按照 6、原理就可以实现本软件功能。
7、探讨
之前有朋友提出强制更新问题,但是前段时间一直比较忙,今天闲下来主要探讨一下强制更新的思路。
假设我现在提供更新检测和更新服务的软件为A,需要更新的软件为B,目前软件运行模式是这样的:先运行A检测软件是否需要更新,然后通过软件A启动软件B,抛开A,用户是可以直接启动B的,一样可以运行,这种情况下无法对原软件进行约束强迫其进行更新。
因此我设想通过时间戳加密来规避这个问题,先运行A联网检测然后产生时间戳C,A对时间戳C加密得到密文D保存在本地,A运行完成后启动B,B需要做下面的事情:在启动主程序前获取当前时间戳E并检测获取本地密文D,如果获取到D,则解密D得到时间戳C,判断E-C是否大于5分钟,大于则自动关闭。实际上要做的是把时间戳解密方式给到软件开发者,用于比较两个软件启动时间差。时间差太大,说明没有启动更新程序,那么中止软件功能运行,这样变相实现强制更新。