Используйте powershell для автоматизации загрузки файлов с веб-сайта (не знаю URL файла) - PullRequest
4 голосов
/ 09 февраля 2010

Я хочу автоматизировать ежедневную загрузку отчета с веб-сайта нашего поставщика кредитных карт.

Файл генерируется динамически, поэтому я не знаю фактического URL для самого файла.

Я могу использовать powershell для навигации и входа на веб-страницу, а также для нажатия кнопки «Загрузить отчет». Но затем появляется диалоговое окно «Загрузка файла», и я не могу понять, как нажать кнопку «Сохранить» в этом диалоговом окне.

Похоже, мои варианты:

  • Каким-то образом найдите это окно и попробуйте отправить нажатия клавиш

  • Каким-то образом найдите URL-адрес файла при появлении диалогового окна, а затем загрузите его напрямую.

  • Найдите способ отключить окно «Загрузка файла» в ie. (размещение на доверенных сайтах не работает)

Я использую:

$ie = New-Object -com "InternetExplorer.Application"

Что бы вы предложили, это лучший подход?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2010

Для этой цели лучше всего попросить поставщика (если это возможно) опубликовать какой-либо API.

Для этого отправка клавиш очень хрупкая. Что после нажатия Сохранить? Откроется диалоговое окно, и вам нужно перейти к папке и нажать ОК. Это означает, что вам нужно снова найти окно. А что если открылось какое-то подобное окно? Сможет ли ваш скрипт найти правильное окно? (для других сценариев, где вам нужно скрыть / показать / найти окна и отправить нажатия клавиш, я бы порекомендовал Autohotkey .)

Другие возможности зависят от того, на каком сайте он находится. Кажется, что файл генерируется в ответ на команду POST. Это означает, что нет прямой ссылки, которую вы могли бы скачать. И даже если бы была ссылка, скорее всего, ее нельзя было загрузить через Net.WebClient, потому что вы не отправляли бы какую-либо информацию для аутентификации (куки-файлы сессии или идентификатор сессии в строке запроса). Вам нужно будет разобрать, например, куки от $ie.Document.cookie и добавьте их в запрос.

Однако в некоторых случаях вы можете использовать [System.Net.WebRequest]$webRequest = [System.Net.WebRequest]::Create($url); и указать метод POST и данные и дождаться ответа (который будет файлом). Это имитирует нажатие на кнопку отправки. Но опять же, без учетных данных, это, вероятно, не удастся.

Без доступа к сайту сложно сказать что-то еще.

2 голосов
/ 10 февраля 2010

Если вам абсолютно НУЖНО для программного взаимодействия с приложением, я бы предложил использовать что-то вроде http://www.codeplex.com/white

Эта библиотека предоставляет оболочку для некоторых функций автоматизации, предоставляемых .NET 3.5

Как указано выше, лучший подход - использовать Net.WebClient вместо экземпляра IE. Если вам нужно восстановить запрос GET или POST, вы можете использовать Firebug для проверки страницы, предоставленной вашим поставщиком.

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