В этой статье я хотел бы рассказать о посылках (отправке) POST-запросов на сервер (сайт). Получение капчи мы прошли, а в некоторых случаях Вам значени капчи надо отправить на сервер например и зарегестироваться на сайте каком-нибудь программно. Вообще в этом случае невозможно узнать, что шлет браузер при регистрации на каком-нибудь сайта (какой заголовок, куки — если есть, кодировку и так далее). И соответсвенно без указания этих данных можно и вообще не зарегестироваться на сайте (я говорю сейчас про регистрацию из программы). Регистрацию (отправку запроса) предлагаю производить с помощью TidHTTP, который находится на вкладке Indy Clients. Да про этот компонент мы уже много говорили, но про отправку post-запросов ни разу. Так вот, многие сайты могут обработать (получить) запрос без указания — кук, заголовка, кодировки, версии браузера и так далее, это круто конечно, так как ничего ненадо узнавать, что шлет браузер, а сервер запрашивает, но в некоторых случаях это нужно будет сделать. Для этого есть много сервисов, программ, которые показывают данные которые посылаются на тот или иной запрос (например программа — HttpAnalyzerStdV5), эти все данные мы сможем и указать в нашем компоненте. Основные из них, которые можно заполнить это (открыть необходимо свойство Request):
  • Host
  • Referer
  • UserAgent
  • AcceptCharset
  • AcceptEncoding
Также нам потребуется компонент TidAntiFreeze.Теперь для отправки запроса, нам надо сформировать данные, которые мы будем отправлять на сервер, сайт или еще куда-то, в скрипт может. Для этого я буду использовать переменную типа TStringList. Для того, чтобы отправить точный post-запрос на сайт, нам необходимо просмотреть код исходной страницы сайта, на которую мы хотим отправлять запрос. И увидеть нашу форму (тег <form>), которая обрабатывает данные запроса. У этого тега должен быть параметр method равняться post. И обязательно action должен быть указан, то есть указан скрипт, который получает данные запроса. Если не  указан скрипт, то есть указаны просто пустые кавычки, то значит мы спокойно можем отправлять запрос на текущую страницы. Затем нам надо собрать все данные формы, точнее ее поля, которые заполняются при отправке этих данных. Нам нужно найти имена этих полей, они обычно помечаются в параметре name. Необходимо указывать все данные, в том числе и скрытые, если не укажем хоть один можно промахнуться и запрос не отправиться корректно. Так что повторюсь собираем все данные. (имена полей данных). Дальше когда мы собрали все имена полей данных, можно формировать наш запрос и посылать на сервер.
procedure TForm1.Button1Click(Sender: TObject);
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.site.ru',PostData);
PostData.Free;
except
on e:Exception do
PostData.Free;
end;
end;

Теперь можете залезть на сайт, куда вы посылали запрос и посмотреть есть ли там эти данные. Если Вам надо пропарсить страничку сразу после того, как мы отправили запрос, например авторитизировались на сайте и нам надо полчить какие-то данные, то просто наш запрос присваивается какой-то текстовой переменной и затем парсится как Вам удобном, как я показывал Вам или с помощью регулярных выражений, как я не показывал Вам ;)

Хочу заметить, что в настоящее время очень найти товар, который соответствует качество-цена. Одним из таких товаров является ben sherman сумки, которые отличаются небольшой ценой, а самое главное очень хорошим качеством. Кроме этого Вы сможете приобрести данные сумки через Интернет-магазин, тем самым сэкономив свое драгоценное время.
Автор статьи - Andrey53

Метки: , , ,




К записи “Отправка Post-запроса на сервер средствами Delphi. Часть 1” оставлено комментариев: 23.

  1. muljtik:

    Привет.
    Долго мучаюсь незнаю как сделать по твоему методу полу-авторегистрацию на этом сайте _http://www.dot.tk/ru/pageA00.html
    Если можешь дай свою аську.

  2. Andrey53:

    45107328четыре

  3. nixon:

    А как быть с POST запросами на русском языке?? насколько я знаю у INDY с этим проблемы.

  4. whiledo:

    у меня выдает ошибку

    [Error] Unit1.pas(63): There is no overloaded version of ‘Post’ that can be called with these arguments
    [Fatal Error] Project1.dpr(5): Could not compile used unit ‘Unit1.pas’

  5. whiledo:

    версия DELPHI 6

  6. whiledo:

    Спасиба за совет!
    В 7-й версии пост запрос отправляет, тока после отправки выбивает програму из режима компиляции.

  7. Аноним:

    а как кукис отправить?

  8. РОМАН:

    А как через куки расскажите попродробнее, пожалуйста.
    Я хочу авторизоваться через куки на файлообменники hotfile, тока не получается, не пойму как это, расскажите, пожалуйста.

    • Andrey53:

      сейчас нету к сожалению времени, что-то писать объяснять, но для начала обычным сниффером посмотрите что отправляется на сервер, затем попробуйте просто поставить TIdCoockieManager на форму (печенюшку)

  9. 000011:

    можно ли через данный метод работать с чекбоксами(или комбобоксами)?

  10. рор:

    при ошибке (404), программа вылетает…. как этого избежать??

    • Andrey:

      try
      except
      on e.Excepton do
      Showmessage(e.Error);
      end;
      Вылови ошибку, которая появляется при 404 и делай условие, избегай этой ошибки

  11. Dis:

    Подскажите, как дела у Indy с AJAX? на странице висит комбобокс, при выборе нужного пункта — запускается java скрипт onchange=javascript:setTimeout(‘__doPostBack(‘8′,»)’,0). Как это реализовать в indy?
    Нашел в инете что скрипты умеет TWebBrowser, но он, как я понял, не умеет ntlm авторизаию (а у меня имено такая).

    • Andrey:

      на сколько я знаю Indy скрипты не выполняет, поэтому Вам надо копать в сторону именно TWebBrowser

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*