Delphi HTTP POST 方法 - Cookies 问题

3

我正在尝试登录一个网站,但是该网站总是回复:

“您似乎不接受 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


谢谢。


这段C#代码完美运行,也许可以帮助你找到我在Delphi代码中的问题。https://dev59.com/kkvSa4cB1Zd3GeqPfpvD - MeRo
3个回答

4
在您目前的操作方式下,无法一步完成,需要分两步进行。首先请求登录页面(GET),然后发送您的登录凭据(POST)。确保两个操作都使用相同的CookieManager。
编辑以帮助匿名投票者了解为什么这个答案实际上是显而易见的。OP收到了以下错误消息:

"You don't seem to accept cookies. Cookies are required in order to log in."

因此,服务器期望从客户端看到一些cookie。由于OP只执行了一个POST请求,所以它的CookieManager不包含任何cookie,因此不会发送任何cookie。尽管如此,服务器仍然期望看到一些cookie。在常规基于浏览器的会话中,这些cookie将从何处得到?嗯,在没有实际导航到表单(GET请求)的情况下填写登录表单非常困难。

谢谢您的评论,我已经添加了这一行HTTP.Get('http://wwww.hotfile.com');但是什么也没有发生,同样的问题出现了。 - MeRo

1
我建议您安装一个HTTP请求监控工具,将您的请求与标准浏览器请求进行比较。
HTTP分析器是一个不错的起点。

@Dorin,你忘记点赞了!无论如何,对于这样一个简单的问题,使用像Wireshark(和任何其他HTTP分析器)这样的大型工具,我认为只会在一堵无关信息的墙后面掩盖问题。你见过浏览器发送的任何请求中的HTTP头的数量吗?弄清楚什么是相关的,什么是不相关的,比弄清楚“您似乎不接受cookie”意味着什么要困难得多。 - Cosmin Prund
谢谢您的评论,我已经尝试了HTTP分析器,但是我没有看到任何区别,我的请求是正常的。 - MeRo

1

请确保您正在使用最新版本的Indy 10。 Indy 10的cookie支持曾经出现过一段时间的故障,但几个月前终于修复了。即使您启用了Cookies,Indy也有可能会拒绝接收到的cookie或不将cookie发送回服务器。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接