【问题标题】:Powershell Invoke-WebRequest Form PostPowershell Invoke-WebRequest 表单发布
【发布时间】:2015-04-13 03:58:08
【问题描述】:

我正在尝试自动提交 Web 表单(主要是作为更好地学习 Powershell 的练习)。

我做的第一件事是使用 Fiddler2 查看发送了哪些 EXACT 网络表单字段(以及相应的值)(使用常规网络浏览器提交数据)。

然后,我在下面的 Powershell 脚本中重新创建了在 Fiddler 的 WebForm 选项卡中看到的所有可能的字段和值;我包括了 __VIEWSTATE、__EVENTVALIDATION(以及我从网络会话开始时获取的它们的值)。我包含了没有值的字段(与我在提琴手中看到的相同)。我什至包括了提交按钮(因为我也在 Fiddler 中看到过)。

不幸的是,在我使用我的脚本发布所有字段之后;当我查看 $response.rawcontent(如下面的脚本所示)时,它仍然在我开始使用的同一网页上。如果我使用 Web 浏览器提交表单,它会使用新信息更新页面。我想知道我做错了什么或错过了什么。我最初尝试在没有任何以 __ 开头的字段的情况下发布表单但是,这不起作用。

PS:通过网络浏览器提交表单时,我还有两个灰显的字段(并填写了我的姓名和电子邮件地址)。但是,有趣的是,我在 Fiddler 中没有看到这两个字段。我猜它们可能是通过 __VIEWSTATE 或 __EVENTVALIDATION 编码数据提交的?

非常感谢你帮助我!

$UserAgent = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'
$r=Invoke-WebRequest -Uri 'http://website.com/RTR/xl/requestform.aspx' -UseDefaultCredentials -SessionVariable RequestForm

$fields = Invoke-WebRequest -Uri 'http://website.com/RTR/xl/requestform.aspx' -WebSession $RequestForm | select -ExpandProperty inputfields | select name, value

$viewstate = $fields | ?{$_.name -match "VIEWSTATE"} | select -ExpandProperty value
$eventvalidation = $fields | ?{$_.name -match "EVENTVALIDATION"} | select -ExpandProperty value

#Same exact fields and values seen in Fiddler; even in the same order:    
$form.Fields["__EVENTTARGET"] = ""
$form.Fields["__EVENTARGUMENT"] = ""
$form.Fields["__VIEWSTATE"] = $viewstate
$form.Fields["__EVENTVALIDATION"] = $eventvalidation
$form.Fields["xl$phone"] = "917-471-6784""
$form.Fields["xl$form$Submit"] = "Submit"

$response = Invoke-WebRequest -Uri 'http://website.com/RTR/xl/requestform.aspx' -WebSession $RequestForm -Method POST -Body $form.Fields -ContentType 'application/x-www-form-urlencoded'

$response.rawcontent | out-file $home\response.html

【问题讨论】:

  • 您应该考虑使用 Fiddler 的“Raw”选项卡来确保没有缺少标题。此外,如果 html 表单名称实际上是 xl$phone,那么请记住,在双引号字符串中,phone 将查找名为 $phone 的变量。它可能不存在,您的字段名称将只是“xl”。因此,请改用单引号字符串,例如'xl$phone'。最后,将 Fiddler 中用于 PowerShell 调用的“原始”选项卡内容与手动调用的“原始”内容进行比较。
  • 好的,我找到了问题所在。我需要在字段名称中使用文字 $ 符号;正是我在提琴手网络表单字段中看到它们的方式。现在可以了。谢谢。
  • 添加了这个问题的官方答案。

标签: asp.net forms powershell


【解决方案1】:

如果 html 表单名称的字面意思是 xl$phone,请记住,在双引号字符串中,phone 将查找名为 $phone 的变量。它可能不存在,您的字段名称将只是“xl”。因此,请改用单引号字符串,例如'xl$phone'.

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多