Добрый день. Столкнулся с проблемой. Написал скрипт выгрузки и сохранения файлов с внутреннего сайта компании. Структура кода следующая:
Код
Public Function GetResult_Get_Save(sUrl As String, sFileName As String)
Dim httpObject1 As New MSXML2.ServerXMLHTTP60 'Object
Set httpObject1 = CreateObject("Msxml2.ServerXMLHTTP.6.0")
Set httpObject = Nothing
httpObject1.Open "GET", sUrl, False
httpObject1.setRequestHeader "accept", "*/*" '"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
httpObject1.setRequestHeader "accept-Encoding", "gzip , deflate, br"
httpObject1.setRequestHeader "accept-language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"
httpObject1.setRequestHeader "cache-Control", "no-cache"
httpObject1.setRequestHeader "cookie", ".........."
httpObject1.setRequestHeader "pragma", "no-cache"
httpObject1.setRequestHeader "referer", "...."
httpObject1.setRequestHeader "sec-ch-ua", """ Not A;Brand"";v=""99"", ""Chromium"";v=""98"", ""Google Chrome"";v=""98"""
httpObject1.setRequestHeader "Sec-ch-ua-mobile", "?0" '"Print 0"
httpObject1.setRequestHeader "sec-ch-ua-platform", """Windows"""
httpObject1.setRequestHeader "Sec-fetch-dest", "document"
httpObject1.setRequestHeader "Sec-fetch-Mode", "navigate"
httpObject1.setRequestHeader "Sec-fetch-site", "same-origin"
httpObject1.setRequestHeader "Sec-fetch-user", "?1" ' "Print 1"
httpObject1.setRequestHeader "upgrade-insecure-requests", "1"
httpObject1.setRequestHeader "user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
httpObject1.sEnd
'httpObject1.waitForResponse (100)
Set ADOStream = CreateObject("ADODB.Stream")
Debug.Print httpObject1.responseText
ADOStream.Type = 1: ADOStream.Open
ADOStream.Write httpObject1.responseBody
ADOStream.SaveToFile "C:\_Project_\_tmp_\1\1\" & sFileName, 1
ADOStream.Close:
Set ADOStream = Nothing
Set httpObject1 = Nothing
sTest = "Ok"
End Function
В целом код работает, но есть ограничение по размеру файла. Файлы грузятся размером менее 80Мб. У меня же есть необходимость грузить файлы без ограничения по размеру. Я не исключаю, что эта проблема не совсем Excel, а взаимодействия с конкретной информсистемой, откуда я качаю информацию. Кто что может посоветовать? Что можно попробовать? и куда посмотреть?
Помимо прочего пробовал WinHttp.WinHttpRequest.5.1 и MSXML2.XMLHTTP. Для первого ситуация та же, для второго не получается загрузить файл.
В дополнение, Ошибка возникает на Send. Код ошибки 2147012744 "Сервер вернул недопустимый или нераспознанный ответ". Ошибка появляется на одном и том же закачиваемом файле через разное время...иногда это 3 мин, иногда 6 мин. Chrom загружает файлы существенно быстрее чем мой код.
Проще использовать специализированные средства, например curl (входит в последние версии Windows, иначе можно установить с сайта разработчика).
Код
Function Curl_Download(ByVal url As String, fileName As String)
Dim retval
With CreateObject("WScript.Shell")
Curl_Download = .Run("%comspec% /c curl.exe " & url & " -s -o " & fileName, 0, True)
End With
End Function
написал: Проще использовать специализированные средства, например curl (входит в последние версии Windows, иначе можно установить с сайта разработчика).
Спасибо за ответ.
Пошел в этом направлении, но никак не могу написать корректный запрос в cUrl.
У меня есть минимальный запрос через MSXML2.ServerXMLHTTP60, который работает для небольших файлов:
Код
Sub test ()
Dim httpObject1 As MSXML2.ServerXMLHTTP60 'Object
Set httpObject1 = New MSXML2.ServerXMLHTTP60
httpObject1.Open "GET", "https://...../attachment/allByType?attachmentId=841817&documentTypeId=19", False
httpObject1.setRequestHeader "cookie", "JSESSIONID=C2DCA44E546D620399055A0912C75085;"
httpObject1.sEnd
Set ADOStream = CreateObject("ADODB.Stream")
ADOStream.Type = 1: ADOStream.Open
ADOStream.Write httpObject1.responseBody
ADOStream.SaveToFile "C:\_Project_\_tmp_\1\1\dd.zip", 1
ADOStream.Close:
End sub
Поскольку у меня есть еще элементы авторизации, то пробую то же реализовать через командную строку (для начала) что бы понять как работает данная утилита. К сожалению у меня ничего не выходит, явно где-то хромает синтаксис.
написал: Проще использовать специализированные средства, например curl (входит в последние версии Windows, иначе можно установить с сайта разработчика).
Владимир, спасибо огромное. Полдня провозился, но настроил загрузчик.
Теперь планирую разобраться с получением x-csrf-token и JSESSIONID через curl