2013-11-19 3 views
2

Я пытаюсь автоматизировать отправку веб-формы (в основном, как упражнение для обучения Powershell лучше).Powershell Invoke-WebRequest Form Post

Первое, что я сделал, это использовать Fiddler2, чтобы узнать, какие именно точные поля веб-формы (и соответствующие значения) отправляются (используя обычный веб-браузер для отправки данных).

Затем я воссоздал ВСЕ возможные поля и значения, которые я видел на вкладке WebForm Fiddler в моем сценарии Powershell ниже; Я включил __VIEWSTATE, __EVENTVALIDATION (и их значения, которые я захватил с самого начала веб-сайта). Я включил поля, которые не имеют значений (идентично тому, что я видел в скрипачке). Я даже включил кнопку отправки (так как я видел это в Fiddler тоже).

К сожалению, после того, как я ПОЧТАЮ все поля, используя мой скрипт; когда я смотрю на $ response.rawcontent (показано в сценарии ниже), он все еще находится на той же веб-странице, с которой я начинал. Если я отправлю форму с помощью своего веб-браузера, она обновит страницу с новой информацией. Я хотел бы знать, что я делаю не так или нет. Я изначально пробовал POSTing формы без каких-либо полей, начинающихся с __ Однако это не сработало.

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 
+0

Вы должны рассмотреть возможность использования вкладки «Сырье» Fiddler, чтобы убедиться, что нет заголовка, который вам не хватает. Кроме того, если имена html-форм буквально «xl $ phone», то имейте в виду, что в двойном кавычках телефон будет искать переменную с именем '$ phone'. Вероятно, этого не будет, и имя вашего поля будет просто «xl». Таким образом, используйте одиночные кавычки, вместо этого, например. ' 'XL $ phone''. Наконец, сравните содержимое «сырой» вкладки в Fiddler для вашего вызова PowerShell с «сырым» содержимым для ручного вызова. –

+1

Хорошо, я понял проблему. Мне нужно было использовать буквенный знак $ в именах полей; как я видел их в полях веб-форм fiddler. Он работает сейчас. Благодарю. – MKANET

+0

Добавлен официальный ответ на этот вопрос. –

ответ

1

Если имена HTML-форм буквально xl$phone то имейте в виду, что в двойных кавычках телефон будет искать переменной $ телефона. Вероятно, этого не будет, и имя вашего поля будет просто «xl». Таким образом, используйте одиночные кавычки, вместо этого, например. 'xl$phone'.