1 (изменено: svoboden, 2022-05-08 07:18:48)

Тема: AHK: Загрузка файла из интернета

Удалось загрузить файл из гугл диска, используя функцию из файла Installer.ahk (оно же файл установки автохоткея):

url  := "https://drive.google.com/uc?id=свой id&authuser=0&export=download" ; свой запрос (в примере загружает exe) для разных типов файлов расширения разные.
file := "путь загрузки файла/Backup.exe"

Download(url, file)

Download(url, file)
{
    static vt
    if !VarSetCapacity(vt)
    {
        VarSetCapacity(vt, A_PtrSize*11), nPar := "31132253353"
        Loop Parse, nPar
            NumPut(RegisterCallback("DL_Progress", "F", A_LoopField, A_Index-1), vt, A_PtrSize*(A_Index-1))
    }
    global _cu
    SplitPath file, dFile
    SysGet m, MonitorWorkArea, 1
    scale := A_ScreenDPI ? A_ScreenDPI/96 : 1, y := mBottom-52*scale-2, x := mRight-330*scale-2
    , VarSetCapacity(_cu, 100), VarSetCapacity(tn, 520)
    , DllCall("shlwapi\PathCompactPathEx", "str", _cu, "str", url, "uint", 50, "uint", 0)
    Progress Hide CWFAFAF7 CT000020 CB445566 x%x% y%y% w330 h52 B1 FS8 WM700 WS700 FM8 ZH12 ZY3 C11,, %_cu%, AutoHotkeyProgress, Tahoma
    if (0 = DllCall("urlmon\URLDownloadToCacheFile", "ptr", 0, "str", url, "str", tn, "uint", 260, "uint", 0x10, "ptr*", &vt))
        FileCopy %tn%, %file%, 1
    else
        ErrorLevel := 1
    Progress Off
    return !ErrorLevel
}
DL_Progress( pthis, nP=0, nPMax=0, nSC=0, pST=0 )
{
    global _cu
    if A_EventInfo = 6
    {
        Progress Show
        Progress % P := 100*nP//nPMax, % "Downloading:     " Round(np/1024,1) " KB / " Round(npmax/1024) " KB    [ " P "`% ]", %_cu%
    }
    return 0
}

Вопрос такой: "нормальный ли это метод загрузки файлов из интернета? Или же лучше использовать UrlDownloadtoFile?
Вариант с wget и подобными утилитами не очень (часто выдавало ошибки). И как можно улучшить эту функции, т.к. много функций из файла мне непонятны. И вообще работает ли у вас этот способ загрузки файла?

2

Re: AHK: Загрузка файла из интернета

В UrlDownloadtoFile в отличии от URLDownloadToCacheFile не удастся прописать  BINDF_GETNEWESTVERSION.

DllCall("urlmon\URLDownloadToCacheFile", "ptr", 0, "str", url, "str", tn, "uint", 260, "uint", 0x10, "ptr*", &vt)

3 (изменено: svoboden, 2020-03-01 14:51:25)

Re: AHK: Загрузка файла из интернета

Значит URLDownloadToCacheFile лучше использовать? А насколько правильна функция выше, т.к. много функций из того файла пропущены. И почему в Installer.ahk не использовать urldownloadtofile тогда, если отличия не большие.

4

Re: AHK: Загрузка файла из интернета

Malcev пишет:

В UrlDownloadtoFile в отличии от URLDownloadToCacheFile не удастся прописать  BINDF_GETNEWESTVERSION.

А откуда тут эта константа взялась?

HRESULT URLDownloadToCacheFile(
  _In_       LPUNKNOWN           lpUnkcaller,
  _In_       LPCSTR              szURL,
  _Out_      LPTSTR              szFileName,
  _In_       DWORD               cchFileName,
  _Reserved_ DWORD               dwReserved,
  _In_opt_   IBindStatusCallback *pBSC
);
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Malcev, 2020-03-01 17:46:58)

Re: AHK: Загрузка файла из интернета

С интернета.
Кстати автохоткивская команда urldownloadtofile использует эту же константу (INTERNET_FLAG_RELOAD) + INTERNET_FLAG_NO_CACHE_WRITE через wininet.

svoboden пишет:

И почему в Installer.ahk не использовать urldownloadtofile тогда, если отличия не большие

Как же небольшие -  или каждый раз заново скачивается или берется с кеша.

6

Re: AHK: Загрузка файла из интернета

По какой причине не скачивается файл через UrlDownloadToFile, хотя в браузере открывается?

UrlDownloadToFile, https://vk.com/doc3260116_654218993?hash=9uXtHHpoQoROguesZgflOXaYZzBVGGFEygnUkQSzPPD, %a_scriptdir%\1111111111111.pdf

7

Re: AHK: Загрузка файла из интернета

Всё прекрасно скачивается.
Может cкачивается не то, что вы хотели...
А почему такое происходит - додумайтесь сами.

8 (изменено: john_dease, 2023-04-19 01:40:05)

Re: AHK: Загрузка файла из интернета

У меня скачивается HTML-страница с расширением PDF, внутри которой есть ссылка на PDF:

https:\/\/psv4.userapi.com\/c235131\/u3260116\/docs\/d8\/36b926714245\/Beregis_shpionov_Sheynin_L.pdf?extra=ZWlUw7eqI5e-eFzWz71Ghbm7JHM-_SP_RuAu1JGs05AT0nWK25CcsQU_nGt19y7F2dAlimWVBWiath91EAHlB18cnRnn0zYaP_fuQgi_TW-vmVSK8TFDERANTbrdIrsX6E5c2jJE_ZM

Но сам файл не скачивается. Значит, UrlDownloadToFile не подходит для подобной загрузки?

9 (изменено: Malcev, 2023-04-19 02:46:00)

Re: AHK: Загрузка файла из интернета

Если вы можете скачать файл через интернет эксплорер, то и UrlDownloadToFile теоретически должен работать (хотя не факт), так как autohotkey использует "AutoHotkey" как user-agent:
https://github.com/AutoHotkey/AutoHotke … .cpp#L1024

10 (изменено: EV, 2023-04-20 04:23:55)

Re: AHK: Загрузка файла из интернета

UrlToFile := "https:?"
SaveFileAs := A_ScriptDir . "\1.Расширения файла"
Overwrite := True
If (FileExist(SaveFileAs)) {
    If (Overwrite)
        FileDelete, %SaveFileAs%
    Else
        Return
}

WinHttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpObj.Open("GET", UrlToFile)
WinHttpObj.SetRequestHeader("Cookie","bb_ssl=1; bb_session=?")
WinHttpObj.Send()
ADODBObj := ComObjCreate("ADODB.Stream")
ADODBObj.Type := 1
ADODBObj.Open()
ADODBObj.Write(WinHttpObj.ResponseBody)
ADODBObj.SaveToFile(SaveFileAs, Overwrite ? 2:1)
ADODBObj.Close()