Как загрузить файл с защищенного веб-сайта с помощью WinHTTPRequest.5.1 - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь скачивать файлы (PDF) без вывода сообщений с веб-сайта с VBA. До сих пор я без проблем захожу в систему, вводя имя пользователя и пароль на первом экране, перехожу на страницу отчетов на сайте, успешно получаю список файлов в таблице. Я получаю URL файла без вопросов. Вот где я врезался в стену. Я действительно загружаю файл, но когда открываю его, я получаю предупреждение о том, что для его просмотра необходимо войти в систему. Я могу смоделировать это предупреждение, вставив URL в любой браузер, когда я не вошел в систему, и они выглядят одинаково. Поэтому я загружаю, но не проверяю подлинность.

Код только по вопросу загрузки:

Dim strCookie As String
Dim strResponse As String
Dim xobj As Object
Dim WinHttpReq As Object
Dim WinHttpReq2 As Object
Dim oStream As Object

' Set xobj = New WinHttp.WinHttpRequest
strDocLink = "https://atlasbridge.com" & strDocLink & "&RT=PREVMAIL"
Debug.Print strDocLink
' launch tab & goto url/doc
' try to download the link(this is the url of the file)
' strDocLink
Set WinHttpReq = CreateObject("WINHTTP.WinHTTPRequest.5.1")
strUrl = "https://atlasbridge.com/search/AgencyReports.aspx"
WinHttpReq.Open "GET", strUrl, False
WinHttpReq.Option(WinHttpRequestOption_EnableRedirects) = False
WinHttpReq.setRequestHeader "Referer", "https://atlasbridge.com/search/AgencyReports.aspx"
WinHttpReq.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
WinHttpReq.setRequestHeader "Connection", "keep-alive"
WinHttpReq.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
WinHttpReq.setRequestHeader "Accept-Language", "en-US,en;q=0.5"
WinHttpReq.Send
If WinHttpReq.Status = 200 Then
    strResponse = WinHttpReq.responseText
    Debug.Print strResponse
    strCookie = WinHttpReq.getResponseHeader("Set-Cookie") ' this only gets the cookie; cookie seems include the session id
    resp = WinHttpReq.getAllResponseHeaders
    ' resp = WinHttpReq.responseBody
    ' strCookie = WinHttpReq.getResponseHeader("Cookie") ' doesnt find the requested header
    Debug.Print strCookie
    Debug.Print resp
    End If
' then open second session & try to get document
Set WinHttpReq2 = CreateObject("WINHTTP.WinHTTPRequest.5.1")
WinHttpReq2.Open "GET", strDocLink, False
WinHttpReq2.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
WinHttpReq2.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
WinHttpReq2.setRequestHeader "Accept-Language", "en-US,en;q=0.5"
WinHttpReq2.setRequestHeader "Referer", "https://atlasbridge.com/search/AgencyReports.aspx"
WinHttpReq2.setRequestHeader "Connection", "keep-alive"
WinHttpReq2.setRequestHeader "Host", "atlasbridge.com:443" '
WinHttpReq2.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
' WinHttpReq2.setRequestHeader "Transfer-Encoding", "chunked"
' doesnt like this one causes error on the .send
WinHttpReq2.setRequestHeader "Cache-Control", "private"
WinHttpReq2.setRequestHeader "Upgrade-Insecure-Requests", "1"
WinHttpReq2.setRequestHeader "Content-Type", "application/pdf"
WinHttpReq2.setRequestHeader "Cookie", strCookie
WinHttpReq2.Send
If WinHttpReq2.Status = 200 Then
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write WinHttpReq2.responseBody
    oStream.SaveToFile "C:\Users\MyUserName\Desktop\DownloadedMail\atlasreportdownload.ashx.pdf", 1 ' 1 = no overwrite, 2 = overwrite
    oStream.Close
End If

Я пробовал несколько разных вещей, но я не верю, что получаю полный cookie и идентификатор сессии.

Файл cookie, который я получаю в WinHttpReq.getResponseHeader("Set-Cookie") или getAllResponseHeaders, выглядит следующим образом:

NSC_bumbtcsjehf.dpn_TTM_443_MCWT = ffffffffc3a00a0a000000000005e445a4a423660, Version = 1; Max-age = 2400; путь = /; обеспечение; HttpOnly

Но когда я использую LiveHeaders в Firefox, я вижу:

Cookie: ASP.NET_SessionId = z2e4adilfjgiyynx2mntnh1k; NSC_bumbtcsjehf.dpn_TTM_443_MCWT = ffffffffc3a00a0a000000000005e445a4a423660; AuthToken = 0be22946-a97a-442e-bd93-c80f0c96a525; AtlasLastMessage = 1173; lc_sso7549731 = 1546651094987; __lc.visitor_id.7549731 = S1546651090.26728e19e6

Но я не могу представить этот полный cookie с AuthToken & Session ID и т. Д., Когда я Debug.Print отвечаю. Может ли кто-нибудь указать мне правильное направление, чтобы я мог проверить вариацию того, что я делаю? Заранее спасибо.

Обновление: заголовки ответа от первого запроса:

 Cache-Control: private
 Date: Wed, 16 Jan 2019 22:04:54 GMT
 Content-Length: 164
 Content-Type: text/html; charset=utf-8
 Location: /default.aspx?err=Expired&dest=%2fhome.aspx
 Server: Microsoft-IIS/7.0
 Set-Cookie: ASP.NET_SessionId=mo0owzztbul5of0litxox5kx; path=/; secure; HttpOnly
 Set-Cookie: NSC_bumbtcsjehf.dpn_TTM_443_MCWT=ffffffffc3a00a1a45525d5f4f58455e445a4a423660;Version=1;Max-Age=2400;path=/;secure;httponly
 X-AspNet-Version: 4.0.30319
 X-UA-Compatible: IE=edge
 X-Powered-By: ASP.NET

Сейчас я работаю над загрузкой тела ответа.

...