2016-08-10 14 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 문서를받을 수 있나요?

동일한 작업을 WebClientInvoke-WebRequest과 함께 시도했지만 인증 오류로 인해 계속 오류가 발생합니다. 나는 로그인 후 쿠키를 캡처하고 다음 요청과 함께 전달했지만 아무 것도 시도하지 못했습니다. 누군가 다른 수단을 사용하여 이것을 수행하는 실제 사례를 가지고 있다면, 나는 모두 귀입니다. 실제로 필자의 선호는 가능하다면 IE 자동화를 피하는 것이지만, 나는 어떤 해결책을 취할 것이다.

+1

이론적으로 'Invoke-WebRequest -Uri $ pdfuri -Credential $ cred -OutFile $ outpath'처럼 간단하지만이 방법을 항상 사용하지만 웹 사이트에서 이러한 방식으로 로깅을 허용하지 않을 수도 있습니다. –

+0

@ Deadly-Bagel 필자는 그것을 보았습니다 만, 어떻게'$ cred' 오브젝트를 만들 수 있습니까? 외부 웹 사이트에 로그인하고 있습니다. 이것은 AD 자격 증명을 사용하는 Active Directory 로그인 또는 원격 서버 로그인이 아닙니다. 나는 자격 증명을 얻을 수 있다면'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 

지옥, 모든 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 기능을 제거해야합니다. 기본적으로 수동으로 클릭하면 "실행 또는 저장 하시겠습니까?" 선택권.

관련 문제