Пример авторизации на сайте с помощью idHTTP.Post

Несмотря на то, что все мои заготовки статей канули в Лету вместе с другими данными (в том числе исходниками), которые были на флешке, я не пала духом и попытаюсь написать что-нибудь полезное заново.

Сегодня расскажу, как использовать 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 или создать динамически.



Поместим на форму 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;  
Теги:
Авторизация, POST, curl
Добавлено: 07 Августа 2018 21:34:31 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...