URL-адрес формы загрузки VBA с логином, который перенаправляет на другой

веб-сайт требует входа в систему, затем перенаправляет вас на другой URL-адрес, а затем загружает файл

эта функция отлично работает с URL-адресом без перенаправления, но не в моем случае

Function DownloadFile(URL As String, Path As String, UserName As String, Password As String) As Boolean

    DownloadFile = False

    Dim WinHttpReq As Object
    Set WinHttpReq = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    WinHttpReq.Open "GET", URL, False, UserName, Password
    WinHttpReq.send

    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write WinHttpReq.responseBody
    oStream.SaveToFile Path, 2
    oStream.Close
    DownloadFile = True

End Function

когда я пробую этот код, статус 401, даже если я использую имя пользователя и пароль?

Function CheckStatus(ByVal strUrl As String, ByVal UserName As String, ByVal Password As String) As String


    Const WinHttpRequestOption_EnableRedirects = 6
    Dim oHttp As Object

    Set oHttp = CreateObject("WinHttp.WinHttpRequest.5.1")


    oHttp.Option(WinHttpRequestOption_EnableRedirects) = True
    oHttp.Open "GET", strUrl, False, UserName, Password
    oHttp.send
    CheckStatus = oHttp.Status


End Function


person mzoon    schedule 05.01.2020    source источник
comment
Отвечает ли это на ваш вопрос? Можете ли вы обнаружить перенаправление 301 с помощью объекта Microsoft.XMLHTTP?   -  person Tomalak    schedule 05.01.2020
comment
Более связанный код здесь: stackoverflow.com/questions /11647297/   -  person Tomalak    schedule 05.01.2020
comment
В итоге вместо этого используйте WinHttp.WinHttpRequest и включите опцию Follow-Redirects. Либо так, либо продолжайте работать с объектом MSXML2.ServerXMLHTTP и смотрите статус ответа (301 или 302) и заголовки ответа (Location), т.е. следуйте перенаправлениям вручную.   -  person Tomalak    schedule 05.01.2020
comment
@ Томалак, это 302.   -  person mzoon    schedule 05.01.2020
comment
...и? Вот как работает HTTP-аутентификация. Каждый отдельный запрос должен иметь имя пользователя и пароль.   -  person Tomalak    schedule 05.01.2020
comment
@ Томалак, так что мне делать?   -  person mzoon    schedule 05.01.2020
comment
Я не понимаю. Какая часть каждого отдельного запроса должна содержать имя пользователя и пароль неясна?   -  person Tomalak    schedule 05.01.2020
comment
@ эта часть ясна. но можете ли вы выяснить, почему код не работает, даже код, который вы мне предоставляете, кажется, что он не может войти в систему, статус 401   -  person mzoon    schedule 05.01.2020
comment
Я не вижу смысла в функции CheckHyperlink? Кроме того, я не вижу, чтобы вы использовали там UserName и Password, поэтому неудивительно, что вы получаете ответ 401 Unauthorized. Очередной раз. В каждом отдельном запросе должны быть имя пользователя и пароль. (Кроме того, похоже, что это код копирования и вставки, а не код, который вы написали сами.)   -  person Tomalak    schedule 05.01.2020
comment
хахаха мой плохой. это копирование и вставка по ссылке, которую вы мне дали, но я меняю ее и использую имя пользователя и пароль с тем же статусом 401? любой совет   -  person mzoon    schedule 05.01.2020
comment
Ссылка, которую я вам дал, предназначена для того, чтобы вы поняли, что делать, а не копировать и вставлять код и скрещивать пальцы. Установка имени пользователя и пароля работает по-разному в WinHttpRequest .   -  person Tomalak    schedule 05.01.2020
comment
@Tomalak да, конечно, я изменил код, чтобы попробовать его в моем случае, у меня нет проблем с аутентификацией при использовании MSXML2.ServerXMLHTTP.6.0, но он не перенаправлялся. с WinHttp.WinHttpRequest.5.1 есть проблема с аутентификацией. Я увижу ссылку и вернусь к вам. благодарю вас   -  person mzoon    schedule 05.01.2020


Ответы (1)


WinHttp будет следовать перенаправлению по умолчанию. вот как работать с именем пользователя и паролем с помощью WinHttp.

Function DownloadFile(ByVal URL As String, ByVal path As String, ByVal UserName As String, ByVal Password As String) As Boolean

    DownloadFile = False

    Const HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0
    Dim WinHttpReq As Object
    Dim oStream As Object

    Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
    WinHttpReq.Open "GET", URL, False
    WinHttpReq.SetCredentials UserName, Password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
    WinHttpReq.send

    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write WinHttpReq.responseBody
    oStream.SaveToFile path, 2
    oStream.Close

    DownloadFile = True


End Function
person mzoon    schedule 06.01.2020
comment
Престижность за то, что вы продолжили, выяснили это и опубликовали свой рабочий результат. (Хотя я не вижу там ничего, связанного с редиректами... это больше не нужно?) - person Tomalak; 06.01.2020
comment
@Tomalak да, нет необходимости в дополнительном коде, WinHttp по умолчанию будет следовать перенаправлению - person mzoon; 06.01.2020
comment
Ааа. Хорошо, я думал, что это должно быть включено. - person Tomalak; 06.01.2020