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