Несмотря на то, что все мои заготовки статей канули в Лету
вместе с другими данными (в том числе исходниками), которые были на флешке, я не
пала духом и попытаюсь написать что-нибудь полезное заново.
Сегодня расскажу, как использовать idHTTP.Post для авторизации на сайте.
Я возьму для примера сайт LiveJournal.com.
Немного теории для начинающих. Итак, вызов метода Post компонента idHTTP
отличается от вызова Get-а только тем, что помимо URL-а необходимо передать
параметры. Параметры можно передавать в виде StringList-а, или каких-нибудь
Stream-ов, или чего-нибудь еще подходящего.)
Пример Post-процедуры (параметры передаются в виде StringList-а):
procedure TForm1.Button1Click(Sender: TObject);
var
LoginInfo: TStringList;
Response: TStringStream;
begin
try
LoginInfo := TStringList.Create;
Response := TStringStream.Create('');
LoginInfo.Add('username=MyName');
LoginInfo.Add('password=MyPass');
IdHTTP1.Post('http://mywebsite.xxx/login.php',LoginInfo,Response);
Showmessage(Response.DataString);
finally
begin
Response.Free;
LoginInfo.Free;
end;
end;
end;
Пример Post-функции (параметры передаются в виде
IdMultiPartFormDataStream-а):
uses IdMultipartFormData;
{ .... }
procedure TForm1.Button1Click(Sender: TObject);
var
data: TIdMultiPartFormDataStream;
begin
data := TIdMultiPartFormDataStream.Create;
try
// добавляем нужные параметры
data.AddFormField('param1', 'value1');
data.AddFormField('param2', 'value2');
// для примера выводим в мемо все, что вернулось
Memo1.Lines.Text := IdHTTP1.Post('http://localhost/script.php', data);
finally
data.Free;
end;
end;
Сейчас попробуем применить полученные знания. Идем на
LiveJournal.com, включаем сниффер, логинимся на сайте и смотрим, какие параметры
надо передавать ('mode=login', 'user=логин', 'password=пароль'). Авторизация не
произойдет, если на стороне клиента не будут сохранены кукисы. Для сохранения
кукисов среди компонентов Indy существует TidCookieManager. IdCookieManager
подключается к idHTTP через свойство CookieManager.
idHttp.CookieManager := IdCookieManager;
В этом случае при запросах в заголовок добавляются кукисы,
автоматически сохраненные в IdCookieManager. IdCookieManager можно найти на
закладке Indy Misc или создать динамически.
![](/images/internet/indy.jpg)
Поместим на форму 2 TEdit-а, TMemo и кнопку, на которую
повесим следующий работающий код авторизации:
procedure TForm1.Button1Click(Sender: TObject);
var
Http : TidHttp;
CM : TidCookieManager;
Data : TStringList;
StrPage, UserID, UserName : String;
i : integer;
begin
try
Http := TIdHTTP.Create(Self);
Data := TStringList.Create;
CM := TidCookieManager.Create(Http);
Http.AllowCookies := true;
Http.CookieManager := CM;
Http.HandleRedirects := true;
Http.Request.Host:='livejournal.com';
Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
Http.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
Http.Request.Referer:='http://www.livejournal.com/';
Data.Add('mode=login');
Data.Add('user=' + Edit1.Text);
Data.Add('password=' + Edit2.Text);
StrPage := Http.Post('http://www.livejournal.com/login.bml?ret=1', Data);
finally
Data.Free;
CM.Free;
Http.Free;
end;
if Pos('<input class="logoutlj_hidden" id="user" name="user" type="hidden" value="'+Edit1.Text,StrPage) <> 0 then
ShowMessage('Авторизация прошла успешно')
else
ShowMessage('Авторизация провалилась');
Memo1.Lines.Text := StrPage;
end;
Возвращенные заголовки (после ответа сервера) можно
посмотреть так:
idHttp.Response.RawHeaders.GetText;
Сохраненные в CookieManager-е кукисы можно посмотреть так:
for i := 0 to Http.CookieManager.CookieCollection.Count - 1 do
StrPage := StrPage + CM.CookieCollection.Items[i].CookieText + #13#10;
|