Метод 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
Yese0071
Спасибо
3 ответа
Это не работает в один шаг, как вы делаете это, нужно сделать это в два шага. Сначала запросите страницу входа (GET), затем отправьте свои учетные данные (POST). Убедитесь, что вы используете один и тот же CookieManager для обеих операций.
Изменить, чтобы помочь анонимному downvoter понять, почему этот ответ на самом деле очевиден. ОП получает это сообщение об ошибке:
"Похоже, вы не принимаете файлы cookie. Файлы cookie необходимы для входа в систему".
поэтому сервер ожидает увидеть некоторые куки от клиента. Поскольку OP выполняет только ОДИН запрос POST, его CookieManager не содержит куки, поэтому он не отправляет куки. Тем не менее сервер ожидает увидеть некоторые файлы cookie. Откуда эти куки приходят в обычном браузерном сеансе? Что ж, заполнение формы входа в систему очень и очень сложно без фактического перехода к форме (запрос GET).
Я бы предложил вам установить инструмент мониторинга HTTP-запросов, сравнить ваш запрос со стандартным браузером.
HTTP Analyzer - хорошее начало.
Убедитесь, что вы используете последнюю версию Indy 10. Поддержка файлов cookie в Indy 10 была нарушена в течение долгого времени, но была окончательно исправлена несколько месяцев назад. Даже если у вас включены файлы cookie, возможно, Indy либо отклонил полученные файлы cookie, либо не отправил файлы cookie на сервер.
На заметку: используйте Request.CustomHeaders
собственность вместо Request.RawHeaders
свойство, и не кодируйте URL-адрес данных TStringList, передаваемых в Post(). Post закодирует данные для вас (если hoForceEncodeParams
флаг включен в TIdHTTP.HTTPOptions
свойство, которым оно является по умолчанию).