На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> WebBrowser , как узнать POST запрос и передать его?
    Всем Привет!

    На сайте множество выборов (<SELECT>) и кнопка.
    При установке значений в выборах и нажатии кнопки передается POST запрос, так вот:
    1. как посмотреть какой именно запрос, какие переменные передаются и их значение?
    2. Как в WebBrowser'е передать этот запрос, точнее мне нужно "зграбить" содержимое странички поле POST запроса

    Возможно есть ссылки на похожие примеры или литературу

    Помогите реализовать данную задачу

    Пробовал простенький пример
    ExpandedWrap disabled
      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;
    но в ответ получил ошибку сокета 10054...
    Я так понимаю результат запроса должен храниться в "PostData"?
    Сообщение отредактировано: Spirit -
      Цитата Spirit @
      1. как посмотреть какой именно запрос, какие переменные передаются и их значение?

      Либо сниффером, либо инструментами разработчика (есть во всех актуальных браузерах)
        Цитата Fr0sT @
        либо инструментами разработчика

        как в Opera посмотреть?
          http://www.nirsoft.net/utils/smsniff.html
          https://addons.opera.com/ru/extensions/details/http-header/
          Сообщение отредактировано: Filka -
            Цитата Spirit @
            как в Opera посмотреть?

            Ctrl-Shift-I (Dragonfly)
              вот форма с сайта
              ExpandedWrap disabled
                <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 запрос
              ExpandedWrap disabled
                 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... если
              ExpandedWrap disabled
                str := idhttp1.Post(idhttp1.Host + '?q=user&destination=node', postdata);
              изменить на
              ExpandedWrap disabled
                str := idhttp1.Post(idhttp1.Host, postdata);
              авторизация не происходит

              Я так понимаю что либо адрес неправильный либо что-то нужно ловить в исключениях, но понятия не имею что и как, помогите :wall:
              Сообщение отредактировано: Spirit -
                Цитата Spirit @
                idhttp1.Host := 'http://bla-bla-bla.ru/';
                { ... }
                str := idhttp1.Post(idhttp1.Host + '?q=user&destination=node', postdata);

                Я с Indy не работал, но как-то бредово это выглядит: сначала задать хост, а потом этот же параметр передать в метод класса.
                Может как-то так:
                ExpandedWrap disabled
                  idhttp1.Host := 'http://bla-bla-bla.ru?q=user&destination=node';
                  { ... }
                  str := idhttp1.Post(idhttp1.Host, postdata);

                Или так:
                ExpandedWrap disabled
                  idhttp1.Host := 'http://bla-bla-bla.ru';
                  { ... }
                  str := idhttp1.Post('?q=user&destination=node', postdata);

                Что вообще принимает метод Post() в качестве первого параметра? И правильно ли вы задаёте хост? Ничего не потеряли?
                  Заполнить форму можно средствами самого компонента TWebBrowser.
                  Для наглядности посмотрите код функции для автоматической авторизации с моего проекта:
                  ExpandedWrap disabled
                    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;
                  Сообщение отредактировано: Protector -
                    Цитата 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() в качестве первого параметра? И правильно ли вы задаёте хост? Ничего не потеряли?

                    ExpandedWrap disabled
                      <form action="?q=user&destination=node"  accept-charset="UTF-8" method="post" id="user-login-form">
                    хост задаю правильно, ничего не потерял

                    Добавлено
                    Цитата Protector @
                    Заполнить форму можно средствами самого компонента TWebBrowser.

                    это понятно, можно авторизироваться через WebBrowser но, потом нужно будет делать выборы после авторизации (дату, день, месяц, год и еще два выбора + жать кнопку) после чего извлекать контент, не совсем удобно каждый раз заполнять форму в браузере...
                    Я думал что будет проще авторизироваться через idhttp пост запросом и потом, опять же таки, пост запросом вытягивать контент.

                    Хотя если через idhttp не получается то выход WebBrowser, но почему не работает выше преведенный вариант?
                    Сообщение отредактировано: Spirit -
                      Выловил сниффером что 'form_build_id' каждый раз передается разный, это может влиять на авторизацию, если да то как его выловить? Послать простой GET запрос и распарсить результат? ели так тогда вопрос в том не поменяется ли этот 'form_build_id' когда я отошлю другой POST запрос на авторизацию после того как распарсю и получу значению 'form_build_id' после первого запроса?
                      Сообщение отредактировано: Spirit -
                        Цитата Spirit @
                        Выловил сниффером что 'form_build_id' каждый раз передается разный, это может влиять на авторизацию, если да то как его выловить?

                        Влиять может, как выловить - запросить страницу с формой с сервера, выцепить id из текста.
                        Цитата Spirit @
                        вопрос в том не поменяется ли этот 'form_build_id' когда я отошлю другой POST запрос на авторизацию после того как распарсю и получу значению 'form_build_id' после первого запроса?

                        По идее не должен (иначе нафиг он тогда нужен?).
                          Цитата Fr0sT @
                          Влиять может, как выловить - запросить страницу с формой с сервера, выцепить id из текста.

                          1. послал GET запрос через idhttp и выловил 'form_build_id'
                          2. подставил этот ИД и отправил POST запрос - результат тот же, авторизация не прошла

                          Все делаю в разных событиях, тоесть, первый запрос отсылаю кликом по одной кнопке, второй запрос - клик по второй кнопке в одном и томже компоненте idhttp, или это нужно делать все в одном событии, одной кнопкой, хотя я думаю что разницы нету...

                          Может быть еще чтото в куки пишется, я уже не знаю в какую сторону смотреть...
                            Вполне возможно, что куки также принимаются во внимание.
                            Я бы посоветовал достичь максимально полного сходства содержимого запроса, выполненного из браузера, в idhttp, а потом уже, когда запрос пройдет, можно будет убирать не имеющие значения поля.
                              Цитата Fr0sT @
                              Вполне возможно, что куки также принимаются во внимание.
                              Я бы посоветовал достичь максимально полного сходства содержимого запроса, выполненного из браузера, в idhttp, а потом уже, когда запрос пройдет, можно будет убирать не имеющие значения поля.

                              да вроде запрос идентичен тому что отсылаю... смотрел через "smsniff", может посоветуете чем другим посмотреть, чтоб не сильно сложный был и показал все максимально, а то не уверен что в "smsniff" я все вижу и все правильно смотрю
                                SmSniff вполне подходит, никогда не подводил. Приведи полные дампы запросов из браузера и idhttp, посмотрим
                                  Цитата Spirit @
                                  но почему не работает выше преведенный вариант?

                                  Название итемов меняли?
                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0.1020 ]   [ 15 queries used ]   [ Generated: 24.10.26, 03:04 GMT ]