• 欢迎访问奇跡の海网站,本站不上传任何资源,所有资源均来自于网络,欢迎加入奇跡の海~!奇跡の海-WordPress QQ群
  • 本站下载资源为网络上收集整理而来,并且以计算机技术研究交流为目的,版权归原作者所有,仅供大家参考,学习,不存在任何商业目的与商业用途.
  • 本站系统镜像均来自于官方原版,ed2k可视为P2P下载链接。所有操作系统默认均为试用版,如有正版密钥可以有效激活,本站不提供任何激活和相关服务。

AutoIt3(au3)源码-带进度条的软件下载器

AutoIT3 奇跡の海 2年前 (2017-12-05) 1279次浏览 已收录 0个评论 扫描二维码

源码简介

AutoIt3(au3)源码-带进度条的软件下载器
从指定URL下载文件并校验hash值(MD5、SHA1),下载进度可使用进度条显示

#NoTrayIcon
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "lib.au3"

Opt("MustDeclareVars", 1) ;变量必须先定义,再使用

        Global $Download_Form1 = GUICreate("软件下载器", 339, 144, -1, -1)
        Global $Download_Group1 = GUICtrlCreateGroup("", 16, 8, 305, 45)
        Global $Download_Label1 = GUICtrlCreateLabel("软件名称:", 32, 28, 55, 17)
        Global $Download_Combo1 = GUICtrlCreateCombo("", 96, 24, 209, 25)
        GUICtrlSetData($Download_Combo1, "请选择要下载的软件|QQ8.5电脑版|ADSafe5.0电脑版", "请选择要下载的软件")
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        Global $Download_Group2 = GUICtrlCreateGroup(" 下载进度 ", 16, 64, 305, 41)
        Global $Download_Progress1 = GUICtrlCreateProgress(24, 80, 289, 17)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        Global $Download_Button1 = GUICtrlCreateButton("下  载", 128, 114, 65, 25)

_main()
Exit

Func _main()
        GUISetState(@SW_SHOW, $Download_Form1)
        Local $Download_Url
        Local $Download_Path
        Local $nMsg

        While 1
                $nMsg = GUIGetMsg()
                        Switch $nMsg

                                Case $Download_Combo1

                                        If GUICtrlRead($Download_Combo1) = "QQ8.5电脑版" Then
                                                $Download_Url = "https://proxy.now.qq.com/tx_tls_gate=dldir1.qq.com/qqfile/qq/QQ8.5/18600/QQ8.5.exe" ;这里填QQ下载地址
                                                $Download_Path = "QQ8.5.exe"
                                        ElseIf GUICtrlRead($Download_Combo1) = "ADSafe5.0电脑版" Then
                                                $Download_Url = "http://dl.ad-safe.com/adsafe_v4/download/adsafe.v5.0.729.1800.exe" ;这里填ADSafe下载地址
                                                $Download_Path = "adsafe.v5.0.729.1800.exe"
                                        EndIf

                                Case $Download_Button1

                                        DownLoadFile($Download_Url, $Download_Path, -1, -1, $Download_Progress1)

                                Case $GUI_EVENT_CLOSE
                                        Exit

                EndSwitch
        WEnd
EndFunc ;===>_main()

Lib.au3

下面是需要的了

    #include-once

    Global Const $CALG_MD5 = 0x8003
    Global Const $CALG_SHA1 = 0x8004

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: DownLoadFile
    ; Description ...: 从指定URL下载文件并校验hash值(MD5、SHA1),下载进度可使用进度条显示
    ; Syntax ........: DownLoadFile($sUrl, $sFilePath[, $sFileMD5 = -1[, $sFileSHA1 = -1[, $idProgress = -1]]])
    ; Parameters ....: $sUrl                - 文件下载的网址
    ;                  $sFilePath           - 保存到本地的路径
    ;                  $sFileMD5            - 文件MD5值,若$sFileMD5 = -1(默认),则不校验文件MD5值
    ;                  $sFileSHA1           - 文件SHA1值,若$sFileSHA1 = -1(默认),则不校验文件SHA1值
    ;                  $idProgress          - 进度条控件ID,若$idProgress = -1(默认)则不使用进度条
    ; Return values .: 成功返回 保存到本地的文件路径
    ;                                   失败返回并设置@error的值:
    ;                                        1                                        - 下载文件发生错误,可能是下载地址无效
    ;                                        2                                        - 下载时发生错误,可能是网络未连接
    ;                                        3                                        - 文件校验不成功
    ; ===============================================================================================================================
    Func DownLoadFile($sUrl, $sFilePath, $sFileMD5 = -1, $sFileSHA1 = -1, $idProgress = -1)
            Local $hDownload = InetGet($sUrl, $sFilePath, 1, 1)
            If @error Then Return SetError(1, 1, 1)
            
            Local $sFileSize = InetGetSize($sUrl)
            Local $aDownData
            Do
                    $aDownData = InetGetInfo($hDownload)
                    If @error Then ExitLoop
                    If $aDownData[4] <> 0 Then Return SetError(2, 2, 2)
                   
                    If $idProgress <> -1 Then GUICtrlSetData($idProgress, $aDownData[0] / $sFileSize * 100)
            Until $aDownData[3] = "false"
            InetClose($hDownload)
            
            Sleep(500);实际测试发现进度条显示比实际下载进度稍慢,所以延迟500ms以平衡时间
            
            ;校验hash值(MD5、SHA1),若不一致则删除下载的文件
            If $sFileMD5 = -1 And $sFileSHA1 <> -1 Then
                    Local $sFileHashSHA1 = FileHash($sFilePath, $CALG_SHA1)
                   
                    If $sFileHashSHA1 <> $sFileSHA1 Then
                            FileDelete($sFilePath)
                            Return SetError(3, 3, 3)
                    EndIf
            ElseIf $sFileMD5 <> -1 And $sFileSHA1 = -1 Then
                    Local $sFileHashMD5 = FileHash($sFilePath, $CALG_MD5)
                    If $sFileHashMD5 <> $sFileMD5 Then
                            FileDelete($sFilePath)
                            Return SetError(3, 3, 3)
                    EndIf
            ElseIf $sFileMD5 <> -1 And $sFileSHA1 <> -1 Then
                    Local $sFileHashMD5 = FileHash($sFilePath, $CALG_MD5)
                    Local $sFileHashSHA1 = FileHash($sFilePath, $CALG_SHA1)
                   
                    If $sFileHashMD5 <> $sFileMD5 Or $sFileHashSHA1 <> $sFileSHA1 Then
                            FileDelete($sFilePath)
                            Return SetError(3, 3, 3)
                    EndIf
            EndIf
            
            Return $sFilePath
    EndFunc   ;==>DownLoadFile


    ;$sFile 指定要验证的文件
    ;$cAlgid 指定验证方式
    Func FileHash($sFile, $cAlgid = 0x8003)
            ; Win32 API - CryptHashCertificate验证文件MD5
            ; CryptHashCertificate,定义于Crypt32.dll中,函数原型如下:
            #cs
                    BOOL WINAPI CryptHashCertificate(
                    __in     HCRYPTPROV_LEGACY hCryptProv,
                    __in     ALG_ID Algid,
                    __in     DWORD dwFlags,
                    __in     const BYTE *pbEncoded,
                    __in     DWORD cbEncoded,
                    __out    BYTE *pbComputedHash,
                    __inout  DWORD *pcbComputedHash
                    );
            #ce
            ; 返回值为布尔型,对应au3中的int。
            ; hCryptProv - 没有用处,留空。
            ; Algid - 指定验证方式,可以是MD5或者是SHA1或其他验证方式,如果是MD5,此处添$CALG_MD5 (0x8003)。
            ; dwFlags - 留空。
            ; *pbEncoded - 指针型,指向要验证的数据。
            ; cbEncoded - 要验证的数据的长度。
            ; *pbComputedHash - 指向一个缓存区,用于存放验证结果。
            ; *pcbComputedHash - 输入输出型参数,作为输入时,指定pbComputedHash结构的长度,作为输出时,此值被设为所需要的缓存区域的长度。
            Local $hFile = FileOpen($sFile, 16)
            Local $bData = FileRead($hFile) ; 读取文件中的数据。
            Local $iLength = BinaryLen($bData) ; 数据长度
            FileClose($hFile)
            ; NOTE: 此处必须先要用FileOpen以2进制模式打开文件,否则编译后或者在SCITE中运行得到的结果将不正确。

            Local $tBuffer = DllStructCreate("byte[" & $iLength & "]")
            Local $pBuffer = DllStructGetPtr($tBuffer)
            DllStructSetData($tBuffer, 1, $bData)

            Local $iResult = DllCall("Crypt32.dll", "int", "CryptHashCertificate", _
                            "hWnd", 0, _        ; 留空。
                            "dword", $cAlgid, _        ; 验证方式。
                            "dword", 0, _        ; 留空。
                            "ptr", $pBuffer, _                ; 要验证的数据指针。
                            "dword", $iLength, _        ; 数据长度。
                            "ptr", 0, _                        ; 输出结果,第一次调用传递空值,$iResult[7]被设为所需长度。
                            "dword*", 0) ; 此值被设为所需要的结构大小,因为也用作输出,所以加*。

            Local $tResult = DllStructCreate("byte[" & $iResult[7] & "]") ; 定义一个如此长度的缓冲区,用于存放验证结果。
            Local $pResult = DllStructGetPtr($tResult)

            $iResult = DllCall("Crypt32.dll", "int", "CryptHashCertificate", _; 第二次调用,函数将结果填充到$tResult中。
                            "hWnd", 0, _
                            "dword", $cAlgid, _
                            "dword", 0, _
                            "ptr", $pBuffer, _
                            "dword", $iLength, _
                            "ptr", $pResult, _
                            "dword*", $iResult[7])
            If $iResult[0] <> 0 Then
                    Local $rResult = StringTrimLeft(DllStructGetData($tResult, 1), 2)
            EndIf
            $tBuffer = 0
            $tResult = 0
            Return $rResult
    EndFunc   ;==>FileHash

版权声明:本站所有文章和资源使用CC BY-NC-SA 4.0协议授权发布 , 转载应当以相同方式注明文章来自“SeaOMC.COM->AutoIt3(au3)源码-带进度条的软件下载器!在下边可以分享本文哦!
喜欢 (0)
[]
分享 (0)
奇跡の海
关于作者:
一个WordPress菜鸟!
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址