WebBrowser
, как узнать POST запрос и передать его?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
WebBrowser
, как узнать POST запрос и передать его?
|
Сообщ.
#1
,
|
|
|
|
Всем Привет!
На сайте множество выборов (<SELECT>) и кнопка. При установке значений в выборах и нажатии кнопки передается POST запрос, так вот: 1. как посмотреть какой именно запрос, какие переменные передаются и их значение? 2. Как в WebBrowser'е передать этот запрос, точнее мне нужно "зграбить" содержимое странички поле POST запроса Возможно есть ссылки на похожие примеры или литературу Помогите реализовать данную задачу Пробовал простенький пример ![]() ![]() var PostData:TStringList; html:WideString; begin try PostData:=TStringList.Create; PostData.Clear; PostData.Add('name=123'); PostData.Add('pass=333'); PostData.Add('cap=444'); html:=IdHTTP1.Post('www.bla-bla-bla.ru',PostData); PostData.Free; except on e:Exception do PostData.Free; end; end; Я так понимаю результат запроса должен храниться в "PostData"? |
|
Сообщ.
#2
,
|
|
|
|
Цитата Spirit @ 1. как посмотреть какой именно запрос, какие переменные передаются и их значение? Либо сниффером, либо инструментами разработчика (есть во всех актуальных браузерах) |
|
Сообщ.
#3
,
|
|
|
|
Цитата Fr0sT @ либо инструментами разработчика как в Opera посмотреть? |
|
Сообщ.
#4
,
|
|
|
|
|
Сообщ.
#5
,
|
|
|
|
Цитата Spirit @ как в Opera посмотреть? Ctrl-Shift-I (Dragonfly) |
|
Сообщ.
#6
,
|
|
|
|
вот форма с сайта
![]() ![]() <div class="inner"> <form action="?q=user&destination=node" accept-charset="UTF-8" method="post" id="user-login-form"> <div><div class="form-item" id="edit-name-wrapper"> <input type="text" maxlength="60" name="name" id="edit-name" size="15" value="" class="form-text required" /> </div> <div class="form-item" id="edit-pass-wrapper"> <input type="password" name="pass" id="edit-pass" maxlength="60" size="15" class="form-text required" /> </div> <div id="edit-submit-wrapper" class="form-sbmt"> <input type="submit" name="op" id="edit-submit" value="ВОЙТИ" class="form-submit" /><ul class='userboxl'><li><a href="/user/register">Регистрация</a></li><li><a href="/user/password">Забыли пароль?</a></li></ul></div><div class="item-list"></div><input type="hidden" name="form_build_id" id="form-21245ee60c7f65b9082c0f0d2a04fdeb" value="form-21245ee60c7f65b9082c0f0d2a04fdeb" /> <input type="hidden" name="form_id" id="edit-form-id" value="user_login" /> </div></form> так отправляю POST запрос ![]() ![]() var postdata : TstringList; str : string; begin sMemo1.Clear; idhttp1.HandleRedirects := True; idhttp1.Host := 'http://bla-bla-bla.ru/'; try postdata := TStringList.Create; postdata.Clear; postdata.Add('name=' + sEdit_Name.Text); postdata.Add('pass=' + sEdit_Pass.Text); postdata.Add('op=ВОЙТИ'); postdata.Add('form_id=user_login'); str := idhttp1.Post(idhttp1.Host + '?q=user&destination=node', postdata); sMemo1.Lines.Add(str); postdata.Free; except on e:Exception do PostData.Free; end; end; Вываливает ошибку 403... если ![]() ![]() str := idhttp1.Post(idhttp1.Host + '?q=user&destination=node', postdata); ![]() ![]() str := idhttp1.Post(idhttp1.Host, postdata); Я так понимаю что либо адрес неправильный либо что-то нужно ловить в исключениях, но понятия не имею что и как, помогите |
|
Сообщ.
#7
,
|
|
|
|
Цитата Spirit @ idhttp1.Host := 'http://bla-bla-bla.ru/'; { ... } str := idhttp1.Post(idhttp1.Host + '?q=user&destination=node', postdata); Я с Indy не работал, но как-то бредово это выглядит: сначала задать хост, а потом этот же параметр передать в метод класса. Может как-то так: ![]() ![]() idhttp1.Host := 'http://bla-bla-bla.ru?q=user&destination=node'; { ... } str := idhttp1.Post(idhttp1.Host, postdata); Или так: ![]() ![]() idhttp1.Host := 'http://bla-bla-bla.ru'; { ... } str := idhttp1.Post('?q=user&destination=node', postdata); Что вообще принимает метод Post() в качестве первого параметра? И правильно ли вы задаёте хост? Ничего не потеряли? |
|
Сообщ.
#8
,
|
|
|
|
Заполнить форму можно средствами самого компонента TWebBrowser.
Для наглядности посмотрите код функции для автоматической авторизации с моего проекта: ![]() ![]() procedure Login; var I: Integer; ovElements: OleVariant; begin ovElements := Form1.WebBrowser1.OleObject.Document.forms.Item.elements; for I := 0 to ovElements.Length - 1 do begin if ovElements.item(i).Name = 'login' then begin ovElements.item(i).Value := Form1.Edit1.Text; end; if ovElements.item(i).Name = 'password' then begin ovElements.item(i).Value := Form1.Edit2.Text; end; if ovElements.item(i).Value = 'Enter' then begin ovElements.item(i).Click; end; end; end; |
|
Сообщ.
#9
,
|
|
|
|
Цитата artsb @ idhttp1.Host := 'http://bla-bla-bla.ru?q=user&destination=node'; { ... } str := idhttp1.Post(idhttp1.Host, postdata); Цитата artsb @ idhttp1.Host := 'http://bla-bla-bla.ru'; { ... } str := idhttp1.Post('?q=user&destination=node', postdata); я и сам пробовал эти варианты, не проходит ни первый ни второй Цитата artsb @ Что вообще принимает метод Post() в качестве первого параметра? И правильно ли вы задаёте хост? Ничего не потеряли? ![]() ![]() <form action="?q=user&destination=node" accept-charset="UTF-8" method="post" id="user-login-form"> Добавлено Цитата Protector @ Заполнить форму можно средствами самого компонента TWebBrowser. это понятно, можно авторизироваться через WebBrowser но, потом нужно будет делать выборы после авторизации (дату, день, месяц, год и еще два выбора + жать кнопку) после чего извлекать контент, не совсем удобно каждый раз заполнять форму в браузере... Я думал что будет проще авторизироваться через idhttp пост запросом и потом, опять же таки, пост запросом вытягивать контент. Хотя если через idhttp не получается то выход WebBrowser, но почему не работает выше преведенный вариант? |
|
Сообщ.
#10
,
|
|
|
|
Выловил сниффером что 'form_build_id' каждый раз передается разный, это может влиять на авторизацию, если да то как его выловить? Послать простой GET запрос и распарсить результат? ели так тогда вопрос в том не поменяется ли этот 'form_build_id' когда я отошлю другой POST запрос на авторизацию после того как распарсю и получу значению 'form_build_id' после первого запроса?
|
|
Сообщ.
#11
,
|
|
|
|
Цитата Spirit @ Выловил сниффером что 'form_build_id' каждый раз передается разный, это может влиять на авторизацию, если да то как его выловить? Влиять может, как выловить - запросить страницу с формой с сервера, выцепить id из текста. Цитата Spirit @ вопрос в том не поменяется ли этот 'form_build_id' когда я отошлю другой POST запрос на авторизацию после того как распарсю и получу значению 'form_build_id' после первого запроса? По идее не должен (иначе нафиг он тогда нужен?). |
|
Сообщ.
#12
,
|
|
|
|
Цитата Fr0sT @ Влиять может, как выловить - запросить страницу с формой с сервера, выцепить id из текста. 1. послал GET запрос через idhttp и выловил 'form_build_id' 2. подставил этот ИД и отправил POST запрос - результат тот же, авторизация не прошла Все делаю в разных событиях, тоесть, первый запрос отсылаю кликом по одной кнопке, второй запрос - клик по второй кнопке в одном и томже компоненте idhttp, или это нужно делать все в одном событии, одной кнопкой, хотя я думаю что разницы нету... Может быть еще чтото в куки пишется, я уже не знаю в какую сторону смотреть... |
|
Сообщ.
#13
,
|
|
|
|
Вполне возможно, что куки также принимаются во внимание.
Я бы посоветовал достичь максимально полного сходства содержимого запроса, выполненного из браузера, в idhttp, а потом уже, когда запрос пройдет, можно будет убирать не имеющие значения поля. |
|
Сообщ.
#14
,
|
|
|
|
Цитата Fr0sT @ Вполне возможно, что куки также принимаются во внимание. Я бы посоветовал достичь максимально полного сходства содержимого запроса, выполненного из браузера, в idhttp, а потом уже, когда запрос пройдет, можно будет убирать не имеющие значения поля. да вроде запрос идентичен тому что отсылаю... смотрел через "smsniff", может посоветуете чем другим посмотреть, чтоб не сильно сложный был и показал все максимально, а то не уверен что в "smsniff" я все вижу и все правильно смотрю |
|
Сообщ.
#15
,
|
|
|
|
SmSniff вполне подходит, никогда не подводил. Приведи полные дампы запросов из браузера и idhttp, посмотрим
|
|
Сообщ.
#16
,
|
|
|
|
Цитата Spirit @ но почему не работает выше преведенный вариант? Название итемов меняли? |