我正在尝试登录网站,但此网站始终以
响应“您似乎不接受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
由于
答案 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
标志,默认情况下是这样。)