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;
|