Метод Delphi HTTP POST — проблема с файлами 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

Дас0071


Спасибо


person MeRo    schedule 20.04.2011    source источник
comment
этот код С# отлично работает, возможно, это поможет вам найти мою проблему в коде Delphi stackoverflow.com/questions/2151576/   -  person MeRo    schedule 20.04.2011


Ответы (3)


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


Отредактируйте, чтобы помочь анонимному даунвотеру понять, почему этот ответ на самом деле очевиден. OP получает это сообщение об ошибке:

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

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

person Cosmin Prund    schedule 20.04.2011
comment
Спасибо за ваш комментарий, я добавил эту строку HTTP.Get('wwww.hotfile.com') ; но ничего не произошло такая же проблема - person MeRo; 20.04.2011

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

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

person Darkerstar    schedule 20.04.2011
comment
@Dorin, ты забыл проголосовать! В любом случае, для такой простой проблемы использование большого инструмента, такого как wireshark (и любого другого анализатора HTTP), на мой взгляд, просто скрыло бы проблему за стеной не относящейся к делу информации. Вы когда-нибудь видели, сколько HTTP-заголовков отправляет браузер с любым запросом? Выяснить, что важно, а что нет, будет намного сложнее, чем выяснить, что означает "You don't seem to accept cookies.". - person Cosmin Prund; 20.04.2011
comment
спасибо за ваш комментарий, я пробовал этот HTTP-анализатор, я не вижу никакой разницы, мой запрос в порядке - person MeRo; 20.04.2011

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

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

person Remy Lebeau    schedule 20.04.2011