2017-04-11 3 views
0

のページから情報を取得する:だから私はPowerShellを使用して、この簡単な操作を行う自動化したいのPowerShell

  • ゴー「MYNAME」と私のウェブサイトへ
  • 塗りつぶし「USERNAME」
  • チェック「PERSONNEL_NBR "チェックボックス
  • はPERSONNEL_NBRを取得し、変数
に保管し
  • を送信します

    注:すべてのソリューションは、ME

    の罰金です、私はそれが動作するように適切なIEのセッションを起動していないのでを呼び出し、WebRequestクラスを使用したいと思います。これは非常に高く評価されるでしょう!

    このコード:

    $ie = $null 
    $ie = new-object -com internetexplorer.application 
    $ie.navigate('http://example.com/') 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "myname" 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click() 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click() 
    sleep 2 
    $personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<") -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0) 
    $ie.quit() 
    

    作品が、私はPowerShellを開き、そこからコマンドを起動した場合にのみ。スクリプトとして保存して起動しても動作しません。

    PS:IEのセキュリティを低下させることはできません。とにかく問題を解決しません。

    PPS:上記のバージョンは、私が使用しているコードの簡略化されたバージョンです。完全なバージョンはブラウザを待っていますが、まだ動作しません(おそらくクッキーの問題のために、誰かがそれを行う方法を提案できれば喜んで解決します。私のスクリプトでこの情報をどのように使用するのかわかりません)

    PPPS:問題が対話モードにリンクされている場合、これらのコマンドを別のpowershellで実行することはできません。インタラクティブなセッションをシミュレートしますか?それはうまくいくでしょう。誰でも知っている?


    セカンドバージョン


    これは別の試みです。エラーはありませんが、ページの内容を返します。私は要求が通過するかどうかも分かりません。

    $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession 
    $cookie = New-Object System.Net.Cookie 
    $cookie.Name = "mycookiename" 
    $cookie.Value = "mycookievalue" 
    $cookie.Path = "/" 
    $cookie.Domain = "example.com" 
    $session.Cookies.Add($cookie) 
    $uri = "http://example.com" 
    $body = @{username="myname";fields="PERSONNEL_NBR"} 
    #THESE ARE UNSUCCESSFUL ATTEMPTS 
    #$r = Invoke-WebRequest -Uri $uri -WebSession $session 
    #$r.InputFields[34].innerHTML = "true" 
    #$r.InputFields[34].innerText = "true" 
    #$r.Forms[0].Fields["fields"] = "PERSONNEL_NBR" 
    #$r.Forms[0].Fields["PERSONNEL_NBR"] = "true" 
    #$r.InputFields[0].innerText="myname" 
    #$r.Forms[0].Fields["username"] = "myname" 
    #$r = Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $r 
    $r = Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $body 
    $r.RawContent 
    
  • +0

    アプリケーションとしてIEなしでこれを行うには、おそらく本物のPOSTリクエストをサイトに作成する必要があります。その場合は、必要に応じて認証クッキーを含める必要があります。また、「PERSONNEL_NBR」リンクをクリックすると、クライアント側で収集されたフォームデータ(この名前はフォームの一部のフィールド、あなたのスクリプトがインタラクティブなPowershellセッションの外で働くのを妨げる可能性があるのは、クッキーの存在です。 – Vesper

    +0

    申し訳ありませんが、私はそのサイトにアクセスすることができません...アクセス可能であれば、Fiddlerトレースを記録し、このサイトがPOSTリクエストのペイロードをどのように構築し、それをPowerShellに変換するかを確認してください。 – FoxDeploy

    +0

    @Vesper投稿したコードを使ってpowershellからクッキーをリクエストする方法はありますか? –

    答えて

    0

    Ok .. soスクリプトの動作を妨げる問題は、対話モードでもクッキーでもありませんでした。問題は管理者権限にありました。

    ので、このコードは完璧に動作します:

    $ie = $null 
    $ie = new-object -com internetexplorer.application 
    $ie.navigate('http://example.com') 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "myname" 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click() 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click() 
    while ($ie.Busy -eq $true -and $timer -lt 10) { 
        sleep 1 
        $timer++ 
        echo "Waiting for example.com..." 
    } 
    if ($timer -gt 10) { 
        while ($confirmation -ne "y" -and $confirmation -ne "n") { 
         $confirmation = Read-Host "`nConnection timed out. Do you want to try to grab it manually? (y/n)" 
         if ($confirmation -eq 'y') { 
          echo "`nPlease go to this page:`nhttp://example.com and put `"$username`" in the `"USERNAME`" field, then check the `"PERSONNEL_NBR`" checkbox and then submit." 
          Read-Host "`nPERSONNEL_NBR" 
         } 
         elseif ($confirmation -eq 'y') { 
          echo "`nRemember to add the PERSONNEL_NBR later!" 
         } 
         else { 
          echo "`nInvalid option." 
         } 
        } 
        $confirmation=$null 
    } 
    $personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<") -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0) 
    echo "The PERSONNEL_NBR is $personnel_nbr" 
    $ie.quit() 
    

    は、あなただけの管理者としてそれを実行する必要があります。みんなのおかげで、私はあなたの助けと時間を感謝しました。

    0

    は、IEのCOMMオブジェクトを使用して、いくつかの厄介な問題がありますが、彼らはほとんど終わってIEのウィンドウを非表示になります.visible = $falseを使用して、インスタンスのために、来ることができます。 .Busyをチェックして、ページが実際にロードされた時刻を確認します。スクリプトが実行されていなかった理由は、すぐに実行されたスタンドアロンスクリプトとして実行されている可能性があります。

    $ie = New-Object -com internetexplorer.application; 
    $ie.visible = $false; 
    $ie.navigate('http://mypioneer.phibred.com/ews/'); 
    
    while ($ie.Busy -eq $true) 
    { 
        Start-Sleep -Seconds 2; 
    } 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "medada" 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click() 
    $link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click() 
    
    while ($ie.Busy -eq $true) 
    { 
        Start-Sleep -Seconds 2; 
    } 
    
    $personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<") -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0) 
    Write-Host $personnel_nbr 
    
    $ie.Quit() 
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie) 
    Remove-Variable ie 
    

    代替は試してみて、フォーム送信のPOSTデータをキャプチャし、あなたのPOSTリクエストでクッキーを使用する必要がある場合は、ニート、here

    +0

    こんにちはニック、答えに感謝します。いいえ、スクリプトは実際にブラウザを待っています。 '呼び出されたオブジェクトがクライアントから切断されました。 ' おそらくクッキーの不足のため –

    +0

    こんにちは@Lafaguette Thats奇妙なことに、私は長い間、そのエラーはおなじみです。私はそのクッキーに関連付けられているとは思わない、IEのCOMオブジェクトは通常、クッキーで正常に動作します。私はcomオブジェクトがIEエンジンとの同期を失ったときにそのエラーを見たと思います。おそらくページ上で何か起きている奇妙なjavascriptのリダイレクトや何かがありますか? – Nick

    0

    を記載されているツールの一つでPOST送信を再作成することです、Cookieオブジェクトを作成WebRequestSessionオブジェクトに追加し、呼び出し、WebRequestクラスのWebSessionパラメータとしてそれを使用するには:

    $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession 
    
    $cookie = New-Object System.Net.Cookie 
    
    $cookie.Name = "cookieName" 
    $cookie.Value = "cookieValue" 
    $cookie.Domain = "cookieDomain" 
    
    $session.Cookies.Add($cookie) 
    
    Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $body 
    

    $body変数は、POSTリクエストの内容ですので、あなたは私を使用する必要がありますあなたがそれを作成する投稿要求について収集した情報。

    $body = @{ 
    username = "medada" 
    input name = value 
    ... 
    } 
    
    +0

    私はそれを動作させることができれば、それは最良の場合のシナリオでしょう!私はこの場合に使用しているコードをオリジナルの投稿に追加しました。エラーはありませんが、何もしません。私が紛失しているものを理解できません。 –

    +0

    @Lafaguetteクッキー(おそらくphibred.com)にドメイン値が必要です。 chrome:chrome:// settings/cookiesは、必要な元のCookieのすべてのデータを新しいCookieオブジェクトにコピーします。 'fields =" PERSONNEL_NBR "'についても、これはあなたが必要とする正しい名前と値ではないと思います。 Chrome Dev Toolsで記録したPOST情報を共有できますか? –

    +0

    はい、あなたの要求に応じて投稿を更新しました –

    関連する問題