VBA для скачивания csv файла с сайта с логином и паролем

Оле Хенрик Скогстрём любезно опубликовал ответ в теме: «Как загрузить файл с помощью VBA (без Internet Explorer)».

Я использовал его код, так как хочу загрузить файл csv с www.ft.com и сохранить его во временном файле на моем диске c. Это бывает не так часто, поэтому я решил использовать простой Excel VBA. Я создал временную учетную запись тестовой подписки на www.FT.com, чтобы проиллюстрировать, что я хочу загрузить, имя пользователя - [email protected], пароль - fttestpassword.

После входа в систему ссылку «экспорт данных» можно увидеть в правом верхнем углу страницы:

http://portfolio.ft.com/holdings/overview/3415c458-40bf-4e63-903a-37302a88bd83?popout=true&..wsod..=off

При нажатии на эту ссылку передается следующий URL:

/portfolio.ft.com/PortfolioAPI/ExportToCSV?containerID=3415c458-40bf-4e63-903a-37302a88bd83&type=Holdings&customName=suggested__0YourPortfolio&duration=15&startDate=undefined&endDate=undefined

Следующий код возвращает файл, но в нем есть только "{" json ": {" triggerLogin ": true}}".

Sub downloadingpositions()
Dim myURL As String
myURL = "http://portfolio.ft.com/PortfolioAPI/ExportToCSV?containerID=3415c458-40bf-4e63-903a-37302a88bd83&type=Holdings&customName=suggested__0YourPortfolio&duration=15&startDate=undefined&endDate=undefined"

Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", myURL, False, "[email protected]", "fttestpasword"
WinHttpReq.Send

myURL = WinHttpReq.responseBody
If WinHttpReq.Status = 200 Then
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1
oStream.Write WinHttpReq.responseBody
oStream.SaveToFile "c:\temp\testing.csv ", 2 ' 1 = no overwrite, 2 = overwrite
oStream.Close
End If
End Sub

Может ли кто-нибудь указать мне в правильном направлении, почему я не вхожу в систему / не получаю полный файл csv ??


person Mark    schedule 27.03.2014    source источник
comment
Я пытаюсь сделать что-то подобное, то есть использовать VBA / Excel для входа на www.ft.com и загрузки рыночных данных. Приведенный выше код, похоже, вообще не работает, поскольку вход на ft.com изменился. У вас случайно нет ничего более современного?   -  person drb01    schedule 06.07.2021
comment
Привет, давно не делал этого, но похоже, что базовый URL-адрес изменился в соответствии с: developer.ft.com/portal/docs-api-reference. удачи ????   -  person Mark    schedule 07.07.2021
comment
Спасибо, но для использования API требуется покупка лицензии. Я надеялся избежать этого, поскольку все, что мне нужно, - это простой способ превратить портфолио в электронную таблицу, которая, к сожалению, требует, чтобы Excel / VBA входил в ft.com.   -  person drb01    schedule 08.07.2021
comment
Я посмотрю, смогу ли я взглянуть на него сегодня, но пока вы не думали о Квандле? quandl.com/tools/api   -  person Mark    schedule 09.07.2021
comment
Никогда не видел этот сайт, и он выглядит потрясающе. Проблема в том, что, как и у большинства поставщиков данных, например yahoo finance, google finance, в том, что у них нет такого разнообразия цен, как у ft.com. Например. у них нет британских паевых инвестиционных фондов, а в случае Quandl для британских акций требуется премиальный счет. Поэтому я пытаюсь автоматизировать доступ к ft.com. У меня были некоторые успехи с копированием и вставкой веб-страниц в Excel (через VBA), но это не лучший способ сделать это ...   -  person drb01    schedule 09.07.2021
comment
FWIW www.morningstar.co.uk тоже неплохой   -  person drb01    schedule 09.07.2021


Ответы (1)


Первое, что я заметил в вашем коде, это то, что в пароле отсутствует буква «s». Тогда, когда у вас есть странное длинное число в URL-адресе, это связано с тем, что для создания URL-адреса требуется какая-то аутентификация "3415c458-40bf-4e63-903a-37302a88bd83"

Когда это происходит, вам нужно найти URL-адрес входа, а затем использовать метод «POST» для проверки данных. Как только вы это сделаете, вы можете отправить обычный запрос «GET», и данные будут отображаться.

Sub downloadingpositions()

    Const strLOGING_URL As String = "https://registration.ft.com/registration/barrier/[email protected]&password=fttestpassword"
    Const strPORTFOLIO_URL As String = "http://portfolio.ft.com/PortfolioAPI/ExportToCSV?containerID=3415c458-40bf-4e63-903a-37302a88bd83&type=Holdings&customName=suggested__0YourPortfolio&duration=15&startDate=undefined&endDate=undefined"
    Const strINCORRECT_CREDENTIALS As String = "Your email address and password do not match our records"
    Const strFILE_NAME As String = "c:\temp\testing.csv"

    Dim WinHttpReq As Object
    Dim oStream As Object

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

    ' Post to the url to set the credentials
    WinHttpReq.Open "POST", strLOGING_URL, 0
    WinHttpReq.Send


    ' Make sure authetication went through
    If Not UCase$(WinHttpReq.ResponseText) Like "*" & UCase$(strINCORRECT_CREDENTIALS) & "*" Then

        ' Get the information.
        WinHttpReq.Open "GET", strPORTFOLIO_URL, 0
        WinHttpReq.Send

        ' If we have succedeed then write the response to the file.
        If WinHttpReq.Status = 200 Then
            Set oStream = CreateObject("ADODB.Stream")
            oStream.Open
            oStream.Type = 1
            oStream.Write WinHttpReq.ResponseBody
            oStream.SaveToFile strFILE_NAME, 2    ' 1 = no overwrite, 2 = overwrite
            oStream.Close
        End If

    Else
        MsgBox strINCORRECT_CREDENTIALS, vbOKOnly + vbCritical, "Error"
    End If

End Sub

Надеюсь, это поможет :)

person Community    schedule 21.10.2015