1

Web ブラウザーから HTTP 要求用の Indy CookieManager に Cookie を配置する方法を教えてください。

このようなWebサイトにログインした後、Cookieを取得します..

テスト プロジェクト = 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;

プロパティには複数の Cookie が含まれているdocument.cookie可能性があるため、Cookie を に渡す前に手動で分割する必要があることに注意してTIdCookieManagerください。また、document.cookieプロパティは;文字を使用して Cookie を区切りますが、「;」も使用します。name=value単一の Cookie のとの値を分離するparametersため、データを分割するときに少し解析を行う必要がありdocument.cookieます。

于 2012-11-05T19:37:08.553 に答える