2016-08-10 4 views
0

Я хочу использовать PowerShell для автоматизации входа на сайт и загрузки PDF-файла. В Интернете есть множество примеров, которые показывают, как это сделать (используя Invoke-WebRequest, WebClient, HttpWebRequest или InternetExplorer.Application), но для большинства из них не требуется сначала вход в систему. Некоторые показывают его с помощью логина, но я не могу заставить их работать. Я рядом с помощью InternetExplorer.Application:Используйте PowerShell для автоматизации входа в систему и загрузки файлов

$username = "xxxxx" 
$password = "yyyyy" 
$url = "https://example.com/login.aspx" 
$usernameElementId = "aaaaa" 
$passwordElementId = "bbbbb" 
$submitButtonElementId = "ccccc" 

$ie = New-Object -com InternetExplorer.Application 
$ie.Visible = $true 
$ie.Navigate($url) 

while($ie.ReadyState -ne 4 -or $ie.Busy) {Start-Sleep -m 100} 

$ie.Document.getElementById($usernameControlId).value = $username 
$ie.Document.getElementById($passwordControlId).value = $password 
$ie.Document.getElementById($submitButtonElementId).click() 

while($ie.ReadyState -ne 4 -or $ie.Busy) {Start-Sleep -m 100} 
Start-Sleep -m 2000 

$url = "https://example.com/statements/201607.pdf" 
$outFilePath = "C:\Downloads\Statement_201607.pdf" 
$ie.Navigate($url) 

while($ie.ReadyState -ne 4 -or $ie.Busy) {Start-Sleep -m 100} 

# Script works up to this point--the pdf document is shown in IE. 
#The file downloaded in the next step is empty. 

$ie.Document.body | Out-File -FilePath $outFilePath 

Мой вопрос: как я могу получить PDF документ, загруженный на последнем шаге сценария?

Я попытался выполнить эту же задачу с WebClient и Invoke-WebRequest, но я продолжаю получать ошибки из-за части аутентификации. Я попытался захватить файлы cookie после входа в систему и передать их со следующим запросом, но ничего. Если у кого-то есть рабочий пример этого, используя другое средство, я все уши. На самом деле, я предпочел бы избежать автоматизации IE, если это возможно, но я возьму любое рабочее решение.

+1

В теории так же просто, как 'Invoke-WebRequest -Uri $ pdfuri -Credential $ cred -OutFile $ outpath', я использую это все время, но, возможно, веб-сайт не позволяет вести журнал таким образом. –

+0

@ Deadly-Bagel Я это видел, но как мне создать объект '$ cred'? Обратите внимание, что я вхожу на внешний веб-сайт. Это не учетная запись входа в систему Active Directory или удаленного сервера с использованием учетных данных AD. Мне бы хотелось сделать это с помощью 'Invoke-WebRequest', если я могу получить учетные данные. – neizan

+0

@neizan, вы можете запустить его, как сначала проверить, что он будет работать с примером сайта. Если для параметра unset переменной $ cred будет запрашиваться учетная запись. Хотя это стандартное приглашение учетных данных Windows, тот же метод часто используется для вещей, не связанных с AD или даже с входами в Windows. –

ответ

2

В идеале вы могли бы использовать Invoke-WebRequest, как вы уже сказали, однако это действительно зависит от того, как настроен веб-сайт. Если это просто запрашивая базу данных для входа в систему и получения куки от этого, это, вероятно, не представляется возможным (но все-таки стоит выстрел):

$url = "https://example.com/statements/201607.pdf" 
$outFilePath = "C:\Downloads\Statement_201607.pdf" 

# Prompt for password 
Invoke-WebRequest -Uri $url -Credential MyUser -OutFile $outFilePath 
# MyUser can be substituted with a credential object but it's complex, Google it 

Heck, попробуйте без Credential параметра вообще, опять же в зависимости от сайт может быть общедоступным (просто недоступным).

В зависимости от места, они могут иметь некоторые API, чтобы загрузить его, связаться с ними по своему усмотрению:

$proxy = New-WebServiceProxy -Uri "https://example.com/webservices.asmx" -Credential MyUser 
# Again MyUser can be substituted with a credential object 
$proxy.GetMyStatement("201607") | Out-File $outFilePath 
# Name and syntax depend on how it is designed and may vary wildly from example 

И в крайнем случае ...

#Wait for Download Dialog box to pop up 
Sleep 5 
while($ie.Busy){Sleep 1} 
#------------------------------ 
#Hit "S" on the keyboard to hit the "Save" button on the download box 
$obj = new-object -com WScript.Shell 
$obj.AppActivate('Internet Explorer') 
$obj.SendKeys('s') 

#Hit "Enter" to save the file 
$obj.SendKeys('{Enter}') 

#Closes IE Downloads window 
$obj.SendKeys('{TAB}') 
$obj.SendKeys('{TAB}') 
$obj.SendKeys('{TAB}') 
$obj.SendKeys('{Enter}') 

Примечание вам нужно отключите любые просмотрщики PDF в браузере, чтобы он рассматривал его как стандартную загрузку, в IE11 это может быть сложно, поскольку оно управляется читателями PDF. Если вы используете Adobe Reader, вам нужно удалить функцию BrowserIntegration. В основном, когда вы вручную нажимаете на нее, вы хотите получить «Запуск или Сохранить?». вариант.

Смежные вопросы