2017-06-06 5 views
0

私はしばらくの間、サイトにログインし、条件を満たしながらファイルをダウンロードしてダウンロードしています。私はPhantomJsで試しましたが、悲惨に失敗しました。Powershellを使用してWebFormにログインします。

私はPowershellのアプローチを試しています。最初のステップをどのように取得して、次のページに行くためにフォームにログインしているかを見てきました。中

私はヒントに従ってきた最後のサイトには、「Webサイトへのログイン」PowerShell Getting Started非常に最後のトピックだった

私がログインしようとしているサイト:ACSMAMGA

それだと、非常に思えます「失敗したログイン」

#Input User and Password - Set UserAgent - Store the WebRequest 

$credential = Get-Credential 
$uaString = [Microsoft.PowerShell.Commands.PSUserAgent]::FireFox 
$webRequest = Invoke-WebRequest -Uri 'http://portal.reti.acsm-agam.it/Portal/Index.aspx?m=200G&area=B2B' -SessionVariable webSession -UserAgent $uaString 

#Store the form with id 'form1' into variable - Set fields of the form with the credential inputted before 

$loginForm= $webRequest.Forms | Where-Object {$_.Id -eq 'form1'} 
$loginForm.Fields.twsTemplate_Content1_twsModule_txtUser = $credential.UserName 
$loginForm.Fields.twsTemplate_Content1_twsModule_txtPSW = $credential.GetNetworkCredential().Password 

#Set New Request with new data, I change the -uri $loginform.action to the actual site because it actually set it to Index.aspx?m=200G&area=B2B which is just the last part of the actual site "http://portal.reti.acsm-agam.it/Portal/Index.aspx?m=200G&area=B2B" and it will raise an error 

$webRequest = Invoke-WebRequest -Uri $loginForm.Action -Method $loginForm.Method -Body $loginForm.Fields -WebSession $webSession -UserAgent $uaString 

#Check if login has been successfuf,changed the Where-Object statment to an actual element that can be found in page that get showed after loggin in. 

if ($webRequest.Links | Where-Object {$_.id -like ('*' + "twsTemplate_Header1_LogOff1_LnkLOF" + '*')}) { 

    Write-Host "Login verified!" 

} else { 

    Write-Host 'Login unsuccessful!' -ForegroundColor Red -BackgroundColor DarkBlue 

} 

Ifステートメントの戻り勿論:簡単なログインフォームは、ので、私はこのようなPowerShellのコードをSETP。

リクエストを送信した後にログインページに何か問題が発生している可能性があります。 私はいくつかの入力フィールドが隠されていると指摘しています(それらはいくつかのトークンであると思われます).3つのjavascriptがバックグラウンドで実行されていますが、それらは何も知らず、関数などのラッパーです。

これを誰かが取り除くことができれば素晴らしいだろう。私はこれらのタイプのサイトへのアクセスを自動化しようとしています。 ありがとうございます

編集:08.06.2017 私はもう少しテストをしています。 ログイン後に次のページに移動するのがブロックされているという問題は、入力フィールドがどのように渡されるかということです。 は実際にusgin:

$loginForm.Fields.twsTemplate_Content1_twsModule_txtUser = $credential.UserName 
$loginForm.Fields.twsTemplate_Content1_twsModule_txtPSW = $credential.GetNetworkCredential().Password 

いけないの仕事を、代わりに同じ値を渡すことが、のような仕事は

$loginForm.Fields['twsTemplate$Content1$twsModule$txtUser']= $credential.UserName 
    $loginForm.Fields['twsTemplate$Content1$twsModule$txtPSW'] = $credential.GetNetworkCredential().Password 

終ら(代わりに 『_』の 『$』と注意していることを「「を」 既にページに設定されている "twsTemplate_Content1_twsModule_btnLogin Login"を追加する必要がありましたが、それでも "$"で "_"を変換して上記の値を設定する必要があります。

私はこの作品がなぜ得られないのですか?実際に働いた...

編集17.07.2017 私は前に知っていたはずですが、私は仕事ではないので空き時間だけprogramminの対象になります。 postメソッドのような "$"を持つフィールドは、フィールドのname属性を渡す必要があります。私の場合は$を持つものです。

+0

'$ webRequest'の代わりに' $ webResponse'がより良い変数名かもしれません。レスポンスの内容は何ですか? – gms0ulman

+0

変数名についてのアドバイスをありがとう。実際、Webリクエストの内容はログインページと同じです。同様のページにリダイレクトされたようなものはありませんでした。 – Mohican1989

答えて

0

これは投稿情報を使用し、正しいログイン情報があればログインします。 それはまた、あなたがサイトとやりとりを続けることができるようにセッションを戻します。

function Login([string]$Address,[pscredential]$credential){ 
    if(!$credential){ 
     $credential = Get-Credential 
    } 
    $post = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUJNzY0OTc5NDQ5D2QWAgIDD2QWBAIBDw8WAh4HVmlzaWJsZWhkFgICAQ9kFgICAQ8PZBYCHgdvbmNsaWNrBZIBamF2YXNjcmlwdDp3aW5kb3cub3BlbignaW5mb0Nvb2tpZS5hc3B4JywnR3VpZGEnLCAnd2lkdGg9ODAwLGhlaWdodD02MDAsbGVmdD02MDAsdG9wPTEwMCwgc2Nyb2xsYmFycz15ZXMsIG1lbnViYXI9bm8sIHRvb2xiYXI9bm8sIHJlc2l6YWJsZT15ZXMnKTtkAgUPZBYCZg9kFgYCAQ9kFgJmD2QWAmYPFgIfAGhkAgMPZBYCZg9kFgRmD2QWAmYPZBYCAgEPFgIfAGhkAgEPZBYCAgEPDxYCHgRUZXh0BTVWZXJpZmljYSBkaSBhdmVyZSBpbnNlcml0byBjb3JyZXR0YW1lbnRlIGkgdHVvaSBkYXRpLmRkAgUPZBYCZg9kFgICAQ8PFgIfAgUQUmVsLiAyLjAuMDk0KDAzKWRkZP4%2BMa9cyFCJx8l%2BEYykopVYA0gwPUz3FbFyI0NAU1WC&__VIEWSTATEGENERATOR=DF200D8E&__EVENTVALIDATION=%2FwEWBAK8z%2BQMAsaPwpsGAqnL470LAq%2F5qKcIp5vlm7cytSxOzkYL2ESDraZWLoQRji0OxUOW9t%2FXBRI%3D&smRetiWeb=&twsTemplate%24Content1%24twsModule%24txtUser=$($credential.GetNetworkCredential().UserName)&twsTemplate%24Content1%24twsModule%24txtPSW=$($credential.GetNetworkCredential().Password)&twsTemplate%24Content1%24twsModule%24btnLogin=Login" 
    $Information = Invoke-WebRequest -Uri $Address -Method POST -Body $Post -SessionVariable WebSession 
    return $WebSession 
} 

login -Address "http://portal.reti.acsm-agam.it/Portal/Index.aspx?idn=0005&area=B2B" 
+0

これは実際にこれを返します: ヘッダー:{} Cookies:System.Net。CookieContainer UseDefaultCredentials:偽 資格情報: 証明書: のUserAgent:Mozillaの/ 5.0(Windows NTの、Windows NTの10.0;それ-IT)WindowsPowerShell/5.1.14393.1198 プロキシ: MaximumRedirection:-1 私は「場合知ってどのようにログインに成功しましたか?そして、あなたが入力したviewstateパラメータがどこにありますか?私はちょうどネットワークのトラフィックを確認するためにフィドラーをダウンロードし、そこからそれを取ると思うが、私はそれが動的に10のログインサイトのようなものがあると知っている必要があり、私はviewstateの変更を推測する。 – Mohican1989

+0

はい、websessionはWebレスポンスではありません。 ウェブセッションでは、ウェブサイトへの接続を維持し、-Websessionオプションを使用して、そのユーザーとしてより多くのWebリクエストを行います。 レスポンスビューを表示する場合は、$ Information Varableを表示します。 また、ChromeやIEの開発ツールから取得しています。ちょうどF12を押して見てください。 – ArcSet

+0

私はこの関数を実行しますが、私は何をやるべきかわからない...変数に応答を格納するときに-Websession $ websessionオプション(関数からの戻り値)を使用して、同じアドレス/メソッド/ポストで別のWebRequestを設定すると$ respone.contentを実行すると、ログインページのhtmlが表示されます。 $情報変数は、関数の終了後に消滅するので再利用することはできません。 – Mohican1989

関連する問題