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

是的0071


谢谢

4

3 回答 3

4

它不是一步完成的,因为你正在这样做,需要分两步完成。首先请求登录页面 (GET),然后发送您的登录凭据 (POST)。确保对这两个操作使用相同的 CookieManager。


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

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

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

于 2011-04-20T04:40:48.467 回答
1

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

HTTP Analyzer 是一个好的开始。

于 2011-04-20T06:49:39.620 回答
1

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

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

于 2011-04-20T17:57:22.147 回答