簡體   English   中英

Powershell Invoke-WebRequest ... | select -ExpandProperty inputfields(並非顯示所有“inputfields”)

[英]Powershell Invoke-WebRequest …| select -ExpandProperty inputfields (Not all “inputfields” revealed)

如果使用下面的命令行來查詢簡單的Web表單,以識別進行后續表單POST所需的所有輸入字段。 但是,我剛剛遇到一個相對簡單的Web表單,它有兩個輸入字段,這些字段不能通過以下命令識別:

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

在下面的HTML源代碼示例中,上面的命令將標識具有“輸入名稱”的所有內容(如下面的html所示) ; 但是,不是其他輸入類型; 例如,“選擇”,“textarea”。 我想知道“the”命令行,它可以識別下面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。 有人可以確認我可以簡單地發布我在第一次開始使用websession時收到的相同VIEWSTATE和EVENTVALIDATION值嗎? 當websession開始時,它們很容易存儲在變量中。 所以,當我去POST時,希望值可以保持原樣。

編輯:對於那些暗示提琴手的人。 我已經使用該工具獲取POST的字段名稱。 我想通過命令行通過類似下面的解決方案來獲取這些信息(不幸的是,正則表達式不正確,但對於那些知道正則表達式的人會知道我正在嘗試做什么:

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

selecttext區域不是根據規范的輸入字段。

對於你正在做的事情,我建議你獲取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"}

只需將字段附加到此哈希表即可。 如果字段名稱包含$ ,則必須在名稱周圍加上單引號,否則不需要引號,例如-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)"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM