Скачать файл через прокси в VBA - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть массив URL-ссылок на файлы. Эти файлы могут быть загружены только через соединение через прокси. Для этого я использую следующую функцию в цикле (а также для получения http-кода веб-страницы для получения массива файлов):

Public Function GetRequest(ByVal UrlStr As String, Optional ByVal ProxyStr As Boolean, Optional SaveFilePath As String) As Object
dim XMLHTTP         As Object
Dim oStream         As Object
Dim xmlDoc          As New HTMLDocument
Dim ret             As String
On Error GoTo 0

k= 0
0:
Set XMLHTTP = Nothing
Set XMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")

'here there was a cycle to get working proxy, I threw it off when paste code to the forum
'the result of cycle was ProxyString, e.g. "165.227.23.166:8080"

XMLHTTP.setProxy 1, ProxyString
'the function is working in 2 modes:
' mode 1 (SaveFilePath="") - to get http code of the web page (also via proxy) - no problems with that part
' mode 2 (SaveFilePath<>"") - to download file from UrlStr to SaveFilePath
With XMLHTTP
    If SaveFilePath = "" Then
'------------ here is mode 1, no problems ---------------------------------
        .Open "GET", UrlStr, True
        .setRequestHeader "Content-Type", "text/html; charset=utf-8"
        .setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
        If ProxyStr Then .setRequestHeader "Proxy-Connection", "Keep-Alive"
'---------------------------------------------------------------------------
    Else
        .Open "GET", UrlStr, True
' the following 2 strings (requestheaders) have no changes on error 
'        .setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
'        If ProxyStr Then .setRequestHeader "Proxy-Connection", "Keep-Alive"
    End If
    .send

'after .send method I've got either different errors (is request is sync),
'or constantly .readystate=1 (if request is asynchronous)

Time1 = Now
Do Until .readyState = 4
    Application.Wait (Now() + 2 / 24 / 60 / 60) 'wait for 2 sec and check again
    DoEvents
    If Now - Time1 > 10 / 24 / 60 / 60 Then     'wait for 10 sec, abort request and try all code again - not all proxies can get access to webpage
        .abort
        GoTo 0
    End If
Loop


If .Status = 200 Then
    If SaveFilePath <> "" Then
        Set oStream = CreateObject("ADODB.Stream")
        oStream.Open
        oStream.Type = 1
        oStream.Write .responseBody
        oStream.SaveToFile SaveFilePath, adSaveCreateOverWrite
        oStream.Close
        Set xmlDoc = Nothing
    Else
        xmlDoc.body.innerHTML = .responseText
    End If
Else
    GoTo 0
End If
End With
Set GetRequest = xmlDoc
End Function

Я также пытался отключить брандмауэр, но безуспешно. Ошибки в методе .send с синхронизированным запросом: ошибка времени выполнения -2147012739: «произошла ошибка в поддержке безопасного канала». После отладки и попытки запустить этот шаг снова у меня есть что-то вроде «не могу вызвать этот метод после вызова метода send» (для метода .send).

массив файлов содержит ссылки на mp3, например: https://some_very_long_url / 092f57537047fcd24a6fcb5d3cff57f2 / 6004767

Возможно, у меня ошибка, поскольку в URL-адресе отсутствует расширение файла? Но когда я вставляю эту ссылку в браузер, он предлагает мне сохранить файл самопроизвольно.

Кто-то знает, что не так? Может быть, есть другой способ загрузки файлов по URL через прокси? Ранее я использовал URLDownloadToFile, но он не может использовать прокси.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...