Delphi:使用IDHTTP连接到Yahoo Web Messenger

4
我使用Delphi XE2编写了一段简单的代码来连接Yahoo Web Messenger,但是我收到了这个消息:
如果您看到此页面,则表示您的浏览器设置防止自动重定向到新的URL。
procedure TForm2.Button1Click(Sender: TObject);
var
idVar:TStringList;
Cookies:string;
begin
 idVar:=TStringList.Create; idVar.Clear;
 idVar.Add('.tries=1');
 idVar.Add('.src=vsu');
 idVar.Add('.md5=');
 idVar.Add('.hash=');
 idVar.Add('.js=');
 idVar.Add('.last=');
 idVar.Add('promo=');
 idVar.Add('.intl=us');
 idVar.Add('.bypass=');
 idVar.Add('.partner=');
 idVar.Add('.u=3p9b5hh7aiqbl');
 idVar.Add('.v=0');
 idVar.Add('.challenge=J5TQOMzQ9Sr5hwnIHYMiVyI2i1_M');
 idVar.Add('.yplus=');
 idVar.Add('.emailCode=');
 idVar.Add('pkg=');
 idVar.Add('stepid=');
 idVar.Add('.ev=');
 idVar.Add('hasMsgr=0');
 idVar.Add('.chkP=Y');
 idVar.Add('.done=http://webmessenger.yahoo.com/');
 idVar.Add('.pd=wmsgr_ver=0&c=B_VH9oa42e68KuzJEhSlKbE-&ivt=&sg=');
 idVar.Add('login='+edt1.Text);
 idVar.Add('passwd='+edt2.Text);
 idVar.Add('.persistent=y');
  Memo1.Text:=idhtp1.Post('https://login.yahoo.com/config/login?',idVar);
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
idhtp1.CookieManager:=idckmngr1;
idhtp1.IOHandler:=idslhndlrscktpnsl1;
idhtp1.RedirectMaximum:=5000;
idhtp1.Request.BasicAuthentication:=False;
idhtp1.HandleRedirects := True;

idslhndlrscktpnsl1.SSLOptions.Method:=sslvSSLv23;
idhtp1.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)';
end;

procedure TForm2.idhtp1Redirect(Sender: TObject; var dest: string;
  var NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
begin
Handled:=True;
end;

你不需要在新创建的字符串列表上调用 Clear 方法。它们已经默认为空。 - Rob Kennedy
代码是否会到达 Handled := True 这一行? - mjn
2
@lord_viper:没有看到完整的HTTP请求和响应流量,这个问题很难诊断。请提供更多信息。你只展示了一条文本消息,这不足以提供足够的信息。很可能是当出现该文本消息时,服务器没有发送重定向响应,有几个因素可能导致这种情况发生。我猜测要么最初的请求本身就无效/格式错误,要么服务器确实发出了一个重定向,但TIdHTTP跟随的后续请求在某种程度上无效/格式错误,或者可能是某个必需的cookie没有被携带过来等等。 - Remy Lebeau
1个回答

1
如果您看到此页面,那是因为您的浏览器设置阻止了自动重定向到新网址。
这条消息作为 HTTP/1.1 200 OK 在 Fiddler 中显示,所以问题不在于重定向。
对我有用的方法是,在出现这个消息后,简单地重复整个 Button1Click,然后我就能成功登录了。与此同时收集的 cookies 是关键,因此您可以尝试只发送一个请求,但事先预设 cookies。如果这样没有帮助,只需使用已收集的 cookies 重复请求即可。TIdCookieManager 来拯救!

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