1

您如何将 cookie 从 Webbrowser 放入 Indy CookieManager 以进行 Http 请求。

我登录到这样的网站后得到cookies..

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

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
var
document: IHTMLDocument2;
cookies:tstringlist;
begin
cookies:=tstringlist.Create;
document := WebBrowser1.Document as IHTMLDocument2;
cookies.Add(document.cookie);
cookies.savetofile('test.txt');
end;

HttpOnly Cookie 方法。

function GetCookie(host: PAnsiChar): PAnsiChar;
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(host, nil, Cookiedata, CookieSize, INTERNET_COOKIE_HTTPONLY, nil) then
      result:=cookiedata;
      FreeMem(Cookiedata);
    end;
  end;
end;
4

1 回答 1

3

由于您使用多个 Delphi 版本标签标记了您的问题,我假设您在每个 Delphi 版本中使用不同版本的 Indy,对吗?Indy 的 cookie 处理逻辑多年来发生了一些变化,并在 2011 年初进行了重大改写,以考虑RFC 6265(已淘汰所有以前的 cookie RFC)。

在当前的 Indy 10 版本中,手动添加 cookie 是使用TIdCookieManager.AddServerCookie()orTIdCookieManager.AddServerCookies()方法完成的:

procedure AddServerCookie(const ACookie: String; AURL: TIdURI);
procedure AddServerCookies(const ACookies: TStrings; AURL: TIdURI);

这两个参数都是必需的,其中ACookiename=value; parameters单个 cookie 的字符串,并且AURL是 cookie 来自的 URL(用于验证 cookie 数据并在需要时初始化任何默认值),例如:

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
var
  document: IHTMLDocument2;
  cookies: TStringList;
  uri: TIdURI;
begin
  document := WebBrowser1.Document as IHTMLDocument2;
  cookies := TStringList.Create;
  try
    // fill cookies as needed, one cookie per line
    uri := TIdURI.Create(document.URL);
    try
      IdCookieManager1.AddServerCookies(cookies, uri);
    finally
      uri.Free;
    end;
  finally
    cookies.Free;
  end;
end;

请记住,该document.cookie属性可以包含多个 cookie,因此您必须手动拆分 cookie,然后才能将它们传递给TIdCookieManager. 此外,该document.cookie属性使用;字符来分隔 cookie,但它也使用 ';' 用于分隔单个 cookie 的name=value和值,因此在拆分数据parameters时您将不得不进行一些解析。document.cookie

于 2012-11-05T19:37:08.553 回答