VBA скачать файл с сайта - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь автоматизировать загрузку файлов с веб-сайта. Когда я делаю загрузку вручную, все, что мне нужно сделать, это нажать на значок «сохранить» (дискета), затем на секунду появляется другое окно, и начинается загрузка (пока исчезает всплывающее окно).

Что я обычно делаю (когда автоматизирую загрузку), чтобы найти URL-адрес файлов, то использую функцию URLDownloadToFile. Но в этом случае я не могу найти URL в HTML. Я пытался использовать .click и FireEvent на объекте, но ничего не получалось.

Итак, я начал думать (основываясь на похожем вопросе на этом сайте), что скрипт генерирует URL, когда я нажимаю значок «Сохранить». К сожалению, я не знаком с javascript или с тем, как он работает. Сейчас я пытаюсь использовать консоль инструментов разработчика моего браузера, чтобы выяснить, что происходит, когда я нажимаю на объект. Кстати: этот объект является <img> объектом.

Я искал в Интернете ответы, и я думаю, что каким-то образом мне придется самому вызывать javascript, если я захочу скачать файл, с чем-то вроде execScript. Но как узнать, какой скрипт вызывается, когда я нажимаю на значок? И что еще более важно, я смогу понять ваш ответ, не понимая полностью, как работает веб-страница? :)

П.С .: Я знаю, что было бы намного проще, если бы я мог дать вам адрес сайта, но для того, чтобы увидеть то, о чем я говорю, требуется войти в систему ...

Редактировать № 1:

Это HTML-код указанного объекта:

<img src="https://mek.mavir.hu/mek/mek/clear.cache.gif" style="width: 16px; height: 16px; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB6klEQVR42pWT204aURSGd+JbSKw4Iow4lFFgBmaU8dCiyIQWkz5FD8/Qt2gfwMRbjY9gDGoPXkDRRrlo4gWOBg9RYzImf9faIEUuTLn4stYe1vevgRnEslsqW9OzyDoL4EpnrG1uPsuL4SDPlQuFkiYs28H7D5+QztgygPvTuzuc3d/DIxrUn9ze4s/NDRbzLn5fXkIZDYG9/PKbsshYWeTog+LbFRmwuOTi6PoadYJr7eoKlWYT3zxPBmw1Goio49Kx7CxE2prGwus83GJJBrzK5VGlLUzl4gL75+f4TtIO8RigxeJyziRXmKaNufkcCm5RBjA/adsPhoZ3ia02BxTKdXIqhVlyDHJF0khjxplHaeWdDOHfQmLZ//ouzIyFlJGRDrsikTTld2nhdFWn53ovWbAr4nQ7fCtfV9dxePbwX3yhWSNtQydXxPQpSjJQr26jXtmW9bjaqs+RSJl4qU9CaFocup7AASV38HiTT73/5Pqh164EOxP0NIQa1WRzRNuZ45762Pee2VGjMYgwvRRqdAK/Tn3ioQVtqrXhc83rxpeVHXZFKBzBWERFhQarT/Bl7QR7fiece3bYFSP0XiujYTQ/D/SFEhoDu2JYUehxJPsOYCdIrhgMDG3w33Pvo+iL4IiCwUBg4y/mf5J5tS4fFwAAAABJRU5ErkJggg==&quot;) 0px 0px no-repeat; margin: 0px 5px 0px 0px;" border="0" class="gwt-Image pointerCursor x-component" id="x-auto-206">

И когда я смотрю его на eventListener, я вижу, что у него есть событие "click". Это говорит это:

EventListener:

EventListener

EventListener Unwrapped:

EventListener Unwrapped

GIF из меня бездельничать на сайте (загрузка файла):

downloading the file

Редактировать # 2:

Извините, ребята, я работал несколько дней над этим "проектом", и я полностью забыл, что если я просто найду объект <img> и сделаю .Click, он загрузит файл. НО! IE создает всплывающее окно с такими опциями, как " Сохранить, Сохранить как, Отмена ". Я знаю, что есть много вопросов о том, как справиться с этим всплывающим окном, но я думаю, что мой вопрос все еще остается в силе. Потому что лучшим решением было бы найти сгенерированный URL и загрузить эту ссылку, например, с помощью. URLDownloadToFile. Таким образом, мне не придется взаимодействовать с всплывающим окном IE. Я надеюсь, что это прояснит немного.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Помогает ли это?

Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
  "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
    szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Sub DownloadFilefromWeb()
    Dim strSavePath As String
    Dim URL As String, ext As String
    Dim buf, ret As Long
    URL = Worksheets("Sheet1").Range("A2").Value
    buf = Split(URL, ".")
    ext = buf(UBound(buf))
    strSavePath = "C:\Users\rshuell\Desktop\Downloads\" & "DownloadedFile." & ext
    ret = URLDownloadToFile(0, URL, strSavePath, 0, 0)
    If ret = 0 Then
        MsgBox "Download has been succeed!"
    Else
        MsgBox "Error"
    End If
End Sub

Или ....

Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
  "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
    szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Private Sub pMain()
  Dim sURL As String
  Dim sDestination As String
  Dim bSuccess As Boolean
  Dim lRow As Long
  Dim ws As Excel.Worksheet
  Dim strSavePath As String
  Dim URL As String, ext As String
  Dim buf, ret As Long

  'Change to suit
  Set ws = ThisWorkbook.Worksheets("Sheet1")

  With ws
    For lRow = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
      sURL = .Cells(lRow, "A")
      sDestination = .Cells(lRow, "B")

      buf = Split(sURL, ".")
      ext = buf(UBound(buf))

        pos = InStrRev(sURL, "/", -1)
        file = Mid(sURL, pos + 1, 99)
        strSavePath = sDestination & file
        ret = URLDownloadToFile(0, sURL, strSavePath, 0, 0)
            If ret = 0 Then
                .Cells(lRow, "C") = "File download successfully!"
            Else
                .Cells(lRow, "C") = "Couldn't download the file!"
            End If

      DoEvents
    Next lRow
  End With
End Sub

enter image description here

0 голосов
/ 06 мая 2018

Предполагается, что вы пытаетесь загрузить изображение -
Взгляните на Как эффективно кодировать строку base64 с помощью Excel VBA? Там вы найдете метод декодирования. Используйте это в части base64 url, то есть текста между &quot;data:image/png;base64, и &quot;. Сохраните это как двоичный файл, и у вас будет ваше изображение.

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