Базовая аутентификация с помощью Excel VBA WebQuery?

В VBA я пытаюсь использовать WebQuery для инструмента, который я пишу, который извлекает финансовые данные.
Я создаю WebQuery с подобным кодом:

    url = "URL;http://my.url.com/"
    With Worksheets("Sheet1").QueryTables.Add(Connection:=url, Destination:=Worksheets("Sheet1").Range("A1"))
    .PostText = "Param1=Foo&Param2=Bar"
    .Name = "My Query"
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlOverwriteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 1
    .WebSelectionType = xlEntirePage
    .WebFormatting = xlWebFormattingNone
    .WebPreFormattedTextToColumns = True
    .WebConsecutiveDelimitersAsOne = True
    .WebSingleBlockTextImport = False
    .WebDisableDateRecognition = False
    .WebDisableRedirections = False
    .Refresh BackgroundQuery:=False
End With

Проблема, с которой я сталкиваюсь, заключается в том, что для my.url.com требуется базовая аутентификация идентификатор пользователя и пароль.
Если я просто запущу этот код, я получу ошибку выполнения 1004; он не запрашивает учетные данные аутентификации.

Но если я перейду на ленту «Данные» Excel, выберу «Из Интернета», а затем перейду на http://my.url.com/ в их мини-веб-браузере у меня запрашивают идентификатор пользователя и пароль.
После закрытия этого окна и повторного запуска моего кода VBA без каких-либо изменений запрос работает. Но после закрытия Excel и повторного запуска он снова терпит неудачу, если я не пройду этот чрезвычайно уродливый шаг ручной аутентификации. Даже если я сказал Internet Explorer сохранить эти учетные данные навсегда.

Как я могу заставить VBA программно аутентифицировать WebQuery с помощью базовой аутентификации, чтобы мне не нужно было делать этот дополнительный шаг?

(Редактировать: Либо это, либо в Excel есть параметр, который заставляет это приглашение появляться независимо от того, как был инициирован WebQuery?)

Я использую Excel 2010 (32-разрядная версия) в Windows 7, но мои целевые пользователи могут использовать различные версии Excel (все в Windows).


person Josh    schedule 15.12.2015    source источник


Ответы (3)


Вы должны войти в исходный код и найти идентификатор для кнопки, текстовое поле имени пользователя и текстовое поле пароля, а затем что-то вроде:

 If objExist("LoginButton id", IE) Then
                    .Document.getElementById("username textbox id").Value = "username"
                    .Document.getElementById("password textbox id").Value = "password"
                    .Document.getElementById("LoginButton id").Click 
 End If
person justkrys    schedule 15.12.2015
comment
Ик. Действительно? Нет прямого способа сделать это и сохранить постоянную аутентификацию даже при перезагрузке электронной таблицы? Я думаю, что мне придется выбрать свой альтернативный вариант, который заключается в том, чтобы написать глупый PHP посередине, который принимает пользователя и пароль в качестве аргументов POST, общается с реальным скриптом с помощью curl, используя базовую аутентификацию, и возвращает результаты обратно в Веб-запрос. Разочаровывает. - person Josh; 16.12.2015
comment
Я уверен, что есть много других способов сделать это, но VBA не славится своим красноречием. Просто так получилось, что это довольно простой способ включить макрос для вас. - person justkrys; 16.12.2015

Если вы хотите использовать QueryTables, аутентификация будет сложной. Настолько, что оно того не стоит, имхо. Excel использует другие файлы cookie, чем IE. Таким образом, даже если вы аутентифицируетесь через IE, QueryTable не распознает его. Если вы проходите аутентификацию через интерфейс веб-запроса, он устанавливает правильный файл cookie, и вы можете автоматизировать.

Правильный способ - избегать QueryTable и делать все это самостоятельно с помощью библиотеки объектов MS XML. Создайте объект HTTP-запроса, отправьте запрос POST и т. д. Если он не RESTFUL, я думаю, вам нужно использовать объект HTTPServer. См. комментарий JP по адресу http://dailydoseofexcel.com/archives/2011/03/08/get-data-from-website-that-requires-a-login/ для получения дополнительной информации об использовании XML.

Конечно, это намного больше работы, потому что вы должны делать все то, что обычно делает таблица запросов. И вы должны обрабатывать обновления, если вам нужна эта функция.

person Dick Kusleika    schedule 15.12.2015
comment
Да, это то, что я делаю, чтобы иметь возможность обновлять простые запросы в фоновом режиме, не переписывая их в VBA и, возможно, что-то напортачивая. Это часть более крупной кодовой базы, которая уже использует MSXML для необновляемых запросов, которые отлично работают. - person Josh; 16.12.2015

Судя по другим ответам, я думаю, что мой правильный курс действий состоит в том, чтобы даже не пытаться заставить WebQuery аутентифицироваться, а использовать серверный скрипт посередине, который принимает идентификатор пользователя и пароль в качестве аргументов POST и связывается с "настоящим" серверная часть через Basic Auth.

Я уже написал и протестировал один, и это, кажется, решает реальную проблему, которую я пытаюсь решить.

person Josh    schedule 15.12.2015