2016-08-10 6 views
0

PowerShellを使用して、WebサイトへのログインとPDFファイルのダウンロードを自動化します。インターネットでは、これを行う方法(例:Invoke-WebRequestWebClientHttpWebRequest、またはInternetExplorer.Applicationを使用)が多数ありますが、ほとんどの場合、最初にログインする必要はありません。いくつかはログイン時に表示されますが、動作させることはできません。私はInternetExplorer.Applicationを使用してとの緊密なんだ:PowerShellを使用してWebサイトのログインとファイルダウンロードを自動化する

$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'と同じくらい簡単ですが、私はこれを常時使用していますが、Webサイトではこのようなログインが許可されていない可能性があります。 –

+0

@ Deadly-Bagel私はそれを見ましたが、 '$ cred'オブジェクトを作成するにはどうすればいいですか?私は外部のウェブサイトにログインしていることに注意してください。これは、AD資格情報を使用したActive Directoryログインまたはリモートサーバーログインではありません。資格情報を取得できるのであれば、 'Invoke-WebRequest'を使ってやりたいと思います。 – neizan

+0

@neizan最初に実行すると、サンプルサイトで動作することをテストできます。変数$ 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機能をアンインストールする必要があるようです。基本的に手動でクリックすると、「実行するか保存する?オプション。

関連する問題