3

以下のコマンドラインを使用して単純な Web フォームを照会し、後続のフォーム POST を作成するために必要なすべての入力フィールドを特定した場合。ただし、以下のコマンドでは識別されない 2 つの入力フィールドを持つ比較的単純な Web フォームに遭遇しました。

Invoke-WebRequest 'http://URI.com/index.aspx' -WebSession $Save | 
select -ExpandProperty inputfields | select name, value

. .

以下の HTML ソースの例では、上記のコマンドは「入力名」(下の html に表示)を持つすべてのものを識別します。ただし、他の入力タイプではありません。「選択」、「テキストエリア」など。以下の HTML ソースの例に示されているすべての入力フィールド タイプを識別できる「その」コマンド ラインを知りたいです。また、Powershell Invoke-WebRequest を介してフォームを POST するために必要なその他の予期しない入力タイプ。

HTML ソース:

..align="right" style="white-space:nowrap;"><input name="MainPage$LastName"..
..align="right" style="white-space:nowrap;"><input name="MainPage$email"..
..align="right" style="white-space:nowrap;"><input name="MainPage$phone"..
..align="right" style="white-space:nowrap;"><select name="MainPage$CountryDropDownList"..
..align="right" style="white-space:nowrap;"><input name="MainPage$Description"..
..align="right" style="white-space:nowrap;"><textarea name="MainPage$DescribeHere"..

. .

PS: POST を実行するときに、上記の Invoke-WebRequest コマンドラインで返される名前を使用する必要がありますか?それとも、以下のコマンドラインで返される名前を使用する必要がありますか? として、それらは異なります。

$r.Forms[0] | $form.fields

編集: 上記の Invoke-WebRequest の結果は (以下) です。ご覧のとおり、 * MainPage_CountryDropDownList**MainPage_DescribeHere*が以下にありません。

Key                                                                            Value
---                                                                            -----
__VIEWSTATE                                                                    /wEPDwULLTE5OT      
__EVENTVALIDATION                                                             /wEWEALtsrvJAgLkmtI29k...     
MainPage__FirstName                                                            Craig
MainPage__LastName                                                             Smith
MainPage__email                                                                 CraigSMith@gmail.com
MainPage__phone
MainPage__Project
MainPage__Submit                                                               Submit

編集: 私はこれまで VIEWSTATE と EVENTVALIDATION を処理したことがありません。Web セッションを最初に開始したときに受け取ったのと同じ VIEWSTATE 値と EVENTVALIDATION 値を単純に POST できることを確認してもらえますか? Web セッションの開始時に変数に簡単に格納できます。したがって、POST に移動したときに値がそのまま維持されることを願っています。

編集:Fiddlerを提案する人向け。私はすでにそのツールを使用して、POST のフィールド名を取得しています。 以下のソリューションのようなコマンドラインを介してこの情報を取得したかったのです(残念ながら、正規表現は正しくありませんが、正規表現をよく知っている人にとっては、私が何をしようとしているのかがわかります:

$r.RawContent| sls -Pattern "(\<(input|select|textarea) name\=[""'])(?:(?=(\\?))\2.)*?\1" -allmatches | %{$_.matches} | %{$_.value}
4

1 に答える 1

0

selectおよびarea は仕様によるとtext入力フィールドではありません。

あなたがしていることについては、Fiddlerを入手して起動し、ブラウザで手動で行う POST を監視することをお勧めします。フォームを送信したら、Fiddler に移動してセッションを見つけ、生のリクエストを確認します。投稿の場合は、次のような本文になります。

usrname=keith&comment=some+pig.

その情報を Invoke-WebRequest -Body パラメータに渡す本文にします。例:

$wr = Invoke-WebRequest http://URI.com/index.aspx -WebSession $Save -Method Post `
         -Body @{'MainPage$CountryDropDownList'="United States";'MainPage$DescribeHere'="some text"}

このハッシュテーブルにフィールドを追加し続けるだけです。フィールド名に a が含まれている$場合は、名前を一重引用符で囲む必要があります。それ以外の場合は、引用符は必要ありません-Body @{username="john";age="42"}

これは、bodyポートを有効/無効にするために NetGear スイッチに送信するために提供する文字列です。

$portStateBody = "unit_no=1&java_port=&inputBox_interface1=&portDesc=&adminMode=${PortState}&physicalMode=Auto&auto_power_down=Disable&short_cable=Disable&linkTrap=Enable&frameSize=1518&CBox_1=checkbox&inputBox_interface2=&submt=16&cncel=&err_flag=0&err_msg=&selectedPorts=g${PortNumber}%3B&multiple_ports=1"

PowerShell 変数${PortState}${PortNumber}. このテキストは、Fiddler の生の要求タブから文字通りコピー アンド ペーストされたものであり、必要に応じて前述の PowerShell に置き換えました。

これらの要素の生の HTML を本当に正規表現したい場合は、これを試してください。

sls -inp $wr.RawContent -pattern '(?is)<(input|select|textarea)\s+.*?(?:id|name)\s*=\s*"([^"]+)"' -AllMatches | Foreach {$_.Matches} | Foreach {"Element: $($_.Groups[1].value) key: $($_.Groups[2].value)"}
于 2013-11-14T05:23:40.607 に答える