Метод HTTP POST Delphi - проблема с файлами cookie - PullRequest
3 голосов
/ 20 апреля 2011

Я пытаюсь зайти на сайт, но этот сайт всегда отвечает

"Вы, похоже, не принимаете файлы cookie. Для входа в систему требуются файлы cookie."

почему моя программа не разрешает файлы cookie?

function HF_Login(): boolean;
var
 HTTP : TIDHTTP;
 Cookie : TidCookieManager;
 Data, Page : TStringList;
begin
 HTTP := TIDHTTP.Create(NIL);
 Cookie := TidCookieManager.Create(NIL);

 HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1';
 HTTP.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
 HTTP.Request.AcceptLanguage := 'en-us;q=0.7,en;q=0.3';
 HTTP.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7';
 HTTP.Request.Pragma := 'no-cache';
 HTTP.Request.CacheControl := 'no-cache';
 HTTP.Request.RawHeaders.Add('X-Requested-With: XMLHttpRequest');
 HTTP.AllowCookies := True;
 HTTP.HandleRedirects := True;
 HTTP.ProtocolVersion := pv1_1;
 HTTP.Request.Connection := 'Keep-Alive';
 HTTP.CookieManager  := Cookie;

 Data := TStringList.Create;
 Page := TStringList.Create;

        //  returnto=%2F&user=[user]&pass=[pass]
 Data.Add('returnto=%2F&user=csz0021&pass=Yese0071');

 page.Text := HTTP.Post('http://hotfile.com/login.php', Data);
 //form1.RichEdit1.Text := HTTP.Post('http://hotfile.com/login.php', Data);

 If Pos('Bad username/password combination.', Page.Text) <> 0 Then Result := False
 else Result := True;

 Page.Free;
 Data.Free;
end;

Это бесплатный аккаунт для тестирования веб-сайта.

csz0021

Yese0071


Спасибо

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Это не работает за один шаг, так как вы делаете это, нужно сделать это за два шага. Сначала запросите страницу входа (GET), затем отправьте свои учетные данные (POST). Убедитесь, что вы используете один и тот же CookieManager для обеих операций.


Изменить, чтобы помочь анонимному downvoter понять, почему этот ответ на самом деле очевиден. ОП получает это сообщение об ошибке:

"Кажется, вы не принимаете файлы cookie. Для входа в систему необходимы файлы cookie."

так что сервер ожидает увидеть некоторые куки от клиента. Поскольку OP выполняет только ОДИН запрос POST, его CookieManager не содержит куки, поэтому он не отправляет куки. Тем не менее сервер ожидает увидеть некоторые файлы cookie. Откуда эти куки приходят в обычном браузерном сеансе? Что ж, заполнение формы входа в систему очень и очень сложно без фактического перехода к форме (запрос GET).

1 голос
/ 20 апреля 2011

Убедитесь, что вы используете актуальную версию Indy 10. Поддержка cookie в Indy 10 давно была прервана, но окончательно исправлена ​​несколько месяцев назад. Даже если у вас включены файлы cookie, возможно, Indy либо отклонил полученные файлы cookie, либо не отправил файлы cookie на сервер.

Примечание: используйте свойство Request.CustomHeaders вместо свойства Request.RawHeaders и не кодируйте URL-адрес данных TStringList, передаваемых в Post (). Post будет внутренне кодировать данные для вас (если в свойстве TIdHTTP.HTTPOptions включен флаг hoForceEncodeParams, что по умолчанию).

1 голос
/ 20 апреля 2011

Я бы предложил вам установить инструмент мониторинга HTTP-запросов, сравнить ваш запрос со стандартными браузерными.

HTTP Analyzer - хорошее начало.

...