TidCookieManager&重定向

时间:2012-11-07 11:14:55

标签: delphi authentication delphi-xe2 indy indy10

我在DownloadComplete WebBrwoser上从InternetGetCookieEx获取cookie。当尝试登录到hotmail时,它会通过,但随后会被重定向。即使Gmail有效。 我试图找出一个通用的解决方案,将Authenication从WebBrowser转移到IdCookieManager进行Web解析。

测试项目= http://www.megafileupload.com/en/file/373536/Cookie-Tester-rar.html

在IdHTPP上启用Cookie以及重定向。

  

必须允许Cookie您的浏览器目前已设置为阻止   饼干。您的浏览器必须先允许使用Cookie才能使用Windows   直播ID。

    function GetCookie(host: string): string;
    const
      INTERNET_COOKIE_HTTPONLY = 8192;
    var
      hModule: THandle;
      lp: Pointer;
      InternetGetCookieEx: function(lpszUrl, lpszCookieName, lpszCookieData
        : PAnsiChar; var lpdwSize: DWORD; dwFlags: DWORD; lpReserved: pointer)
        : BOOL; stdCall;
      CookieSize: DWORD;
      CookieData: PAnsiChar;
    begin
      LoadLibrary('wininet.dll');
      hModule := GetModuleHandle('wininet.dll');
      if hModule <> 0 then
      begin
        @InternetGetCookieEx := GetProcAddress(hModule, 'InternetGetCookieExA');
        if @InternetGetCookieEx <> nil then
        begin
          CookieSize := 1024;
          Cookiedata := AllocMem(CookieSize);
          if InternetGetCookieEx(PAnsiChar(AnsiString(host)), nil, Cookiedata, CookieSize, INTERNET_COOKIE_HTTPONLY, nil) then
          result:=cookiedata;
          FreeMem(Cookiedata);
        end;
      end;
    end;

procedure EmbeddedWB1DocumentComplete(ASender: TObject; const pDisp: IDispatch;
  var URL: OleVariant);
var
  document: IHTMLDocument2;
  cookies: TStringList;
  uri: TIdURI;
begin
  document := EmbeddedWB1.Document as IHTMLDocument2;
  cookies := TStringList.Create;
  try 
    cookies.Delimiter:=';';
    //cookies.DelimitedText:=GetCookie(document.url);
    cookies.DelimitedText:=document.cookie;
    uri := TIdURI.Create(document.url);
    try
      IdCookieManager1.AddServerCookies(cookies,uri);
      EmbeddedWB1.LoadFromString(http.Get(document.url));
    finally
      uri.Free;
    end;
  finally
    cookies.Free;
  end;

1 个答案:

答案 0 :(得分:1)

正如我在other question中提到的,您需要预先解析从网络浏览器中提取的Cookie。仅仅在;字符上按原样拆分cookie字符串是不够的,因为该分隔符既用于分隔彼此的单个cookie,也用于从name=value分隔parameter数据。单个cookie中的数据。如果您只是将整个字符串拆分而不考虑这一点,那么您的TStringList最终不会得到正确的Cookie数据,因此您最终会将错误数据传递给TIdCookieManager

您可能还会考虑使用NavigateComplete/2事件,因为在涉及重定向时,DocumentComplete事件可能为时已晚。