Delphi HTTP POST方法 - Cookies问题

时间:2011-04-20 02:16:53

标签: delphi http-post idhttp

我正在尝试登录网站,但此网站始终以

响应

“您似乎不接受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 个答案:

答案 0 :(得分:4)

在您执行此操作时,它无法一步完成,需要分两步完成。首先请求登录页面(GET),然后发送您的登录凭据(POST)。确保对两个操作使用相同的CookieManager。


编辑以帮助匿名downvoter理解为什么这个答案实际上是显而易见的。 OP收到此错误消息:

  

“您似乎不接受Cookie。需要Cookie才能登录。”

所以服务器希望从客户端看到一些cookie。由于OP只执行一个POST请求,因此它的CookieManager不包含cookie,所以它不发送任何cookie。然而,服务器期望看到一些cookie。这些cookie来自普通的基于浏览器的会话?好吧,填写登录表单是非常非常困难的,而不是先实际导航到表单(GET请求)。

答案 1 :(得分:1)

我建议您安装HTTP请求监控工具,将您的请求与标准浏览器进行比较。

HTTP Analyzer是一个良好的开端。

答案 2 :(得分:1)

确保您使用的是Indy 10的最新版本.Indy 10的cookie支持已经被打破了很长时间,但几个月前终于修复了。即使您启用了Cookie,Indy也可能会拒绝接收的Cookie,或者不会将Cookie发送回服务器。

注意:使用Request.CustomHeaders属性而不是Request.RawHeaders属性,并且不对传递给Post()的TStringList数据进行URL编码。 Post将在内部为您编码数据(如果在hoForceEncodeParams属性中启用了TIdHTTP.HTTPOptions标志,默认情况下是这样。)