Получить перенаправленный URL-адрес с помощью WinHttp в Excel VBA

Я хочу создать подпрограмму, которая может получить перенаправленный URL-адрес и поместить его в ячейку. У меня есть ряд ячеек, содержащих числа, которые завершают URL-адрес. Эта ссылка открывается с помощью WinHTTP, после чего файл сохраняется в формате PDF. Возвращаемая страница является перенаправлением, и мне нужно извлекать URL-адрес, чтобы изолировать важную информацию каждый раз, когда она открывается. Я видел функции, которые, по-видимому, способны на это, но не смогли заставить их работать, и у меня мало опыта работы с WinHTTP. Я пытался разобраться в опубликованных функциях, но пока не смог. Я бы предпочел сохранить его как вспомогательную функцию, если это возможно. Любая помощь будет оценена. Ниже приведена самая близкая вещь, которую я смог найти, которая может соответствовать моим требованиям, но у меня возникли проблемы с ее запуском в качестве подпрограммы.

Public Function testRedirect(oCell As Range) As String

 testRedirect = "not redirected"

 strURL = oCell.Hyperlinks(1).Address

 WinHttpRequestOption_EnableRedirects = 6

 Set oWinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
 oWinHttp.Option(WinHttpRequestOption_EnableRedirects) = False

 oWinHttp.Open "HEAD", strURL, False
 oWinHttp.send ""

 If oWinHttp.Status = 301 Then
  strResponseHeaders = oWinHttp.getAllResponseHeaders()
  For Each strResponseHeader In Split(strResponseHeaders, Chr(10))
   If Left(strResponseHeader, 9) = "Location:" Then
    testRedirect = "redirected to " & strResponseHeader
   End If
  Next
 End If

End Function

Следующий код — это то, что я использую для запроса файлов и их сохранения, что работает хорошо, но требует, чтобы где-то было установлено вышеперечисленное. Пожалуйста, извините за форматирование. Я только добрался до стадии, когда он работает, и еще не успел его отполировать. Также могут быть ненужные переменные и т.д.

Sub Printdrawings()


Dim WB As Workbook
Dim WS As Worksheet
Dim ROWS As Long
Dim IE As Object
Dim LINKS As Variant
Dim LINK As Variant
Dim RNG As Range
Dim URL As String
Dim CLL As Range

Dim FileNum As Long
Dim FileData() As Byte
Dim MyFile As String
Dim WHTTP As Object
Dim FileName As String


Set WB = ThisWorkbook
Set WS = WB.Sheets("Sheet1")

'Calculates the amount of used rows in column A
ROWS = WS.Cells(WS.ROWS.Count, "A").End(xlUp).Row
Debug.Print ROWS

'Sets a range based on the variable counted occupied rows from above
Set RNG = WS.Range("A1:A" & ROWS)

    
   For Each CLL In RNG
    
    On Error Resume Next
        Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5")
        If Err.Number <> 0 Then
            Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
        End If
    On Error GoTo 0
    
    
    
    MyFile = "http://URLBODY" & CLL
    
    WHTTP.Open "GET", MyFile, False
    WHTTP.Send
    FileData = WHTTP.ResponseBody
    Set WHTTP = Nothing
    
    If Dir("C:\MyDownloads", vbDirectory) = Empty Then MkDir "C:\MyDownloads"
    
    FileName = Right(MyFile, 12)
    Debug.Print FileName
    FileNum = FreeFile
    Open "C:\MyDownloads\" & FileName & ".pdf" For Binary Access Write As #FileNum
        Put #FileNum, 1, FileData
    Close #FileNum
    
    Next CLL
    
    
    MsgBox "Open the folder [ C:\MyDownloads ] for the downloaded file..."


End Sub

person Thejackal    schedule 20.12.2020    source источник
comment
Есть ли пример, на котором мы можем протестировать? Это выглядит как стартер для 10 или этот тот же подход   -  person QHarr    schedule 21.12.2020
comment
я попытаюсь найти что-то, но на самом деле это на серверах моей компании, доступ к электрическим чертежам. Я могу ввести URL-адрес с номером, и он возвращает PDF-файл с перенаправленным URL-адресом. Это не непрерывное перенаправление, как рекламные серверы в других местах, поэтому я думаю, что аналогичный эффект может быть связан с доступом к Google за пределами вашей страны, и он автоматически перенаправляет вас обратно в ваше местоположение?   -  person Thejackal    schedule 21.12.2020
comment
Есть ли причина для сбора этого URL-адреса перенаправления? Достаточно ли важно для компании указать это в ответе/документации?   -  person QHarr    schedule 21.12.2020
comment
CLL.Offset(0,1).Value = testRedirect(CLL) проверит каждую ячейку и поместит результат в следующий столбец справа.   -  person Tim Williams    schedule 21.12.2020
comment
Да, в идеальном мире для этого была бы система, но по какой-то причине ее нет, и что-то вроде этого устраняет пробел. Причина сбора перенаправленного URL-адреса заключается в том, что он показывает номер редакции документа. Для URL-адреса запроса требуется только номер чертежа, и он извлекает последнюю версию, которая отображается в перенаправленном URL-адресе. Автоматический способ отображения последней загруженной версии и проверки наличия более новой версии каждый раз экономил бы сотни часов. Это также позволяет чаще проводить проверки.   -  person Thejackal    schedule 22.12.2020
comment
Спасибо, Тим. Я попробую и посмотрю, что произойдет.   -  person Thejackal    schedule 22.12.2020
comment
Привет, Тим, я не смог заставить это работать. Есть ли ссылка, которую я пропустил? Ваше здоровье   -  person Thejackal    schedule 02.01.2021
comment
Я провел немного больше исследований, и я не думаю, что мне нужно беспокоиться обо всей этой переадресации. Есть ли способ, используя winhttp, получить исходный URL-адрес вообще. Я чувствую, что это абсолютно основная функция этого, но, похоже, не могу найти способ сделать это. Я как бы заставил его работать с перенаправлением netflix с использованием заголовков ответа, но он меняется от сайта к сайту и не работает для моего приложения.   -  person Thejackal    schedule 07.01.2021