【问题标题】:How to get all cookie details with TEmbeddedWB?如何使用 TEmbeddedWB 获取所有 cookie 详细信息?
【发布时间】:2015-08-27 02:11:50
【问题描述】:

在 Delphi XE8 VCL 表单应用程序中,使用 TEmbeddedWB 我使用此方法获取 cookie:

CookieStr := EmbeddedWB1.Cookie;
CodeSite.Send('CookieStr', CookieStr);

这是结果(例如):

名称1=值1;名称2=值2;名称3=值3

但是,如您所见,这仅获取 cookie 的 名称 和 值。

那么我怎样才能获得其他cookie字段,例如path、到期日期等?

【问题讨论】:

  • 这也适用于TWebBrowser 控件。您得到的字符串来自 IHTMLDocument2::cookie 属性。 EWB 不会进行额外处理,并且此属性不会返回超过其设置的值。所以答案是它应该返回那些字段,但它们可能没有设置。
  • 我已经签入C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Cookies:例如c.bing.com/网页设置了这个ANONCHKcookie:i.imgur.com/StfkAz1.png。您可以看到它具有所有字段。但是,EmbeddedWB1.Cookie 只会让我得到 'ANONCHK=1;'。另外,当我从我的网站设置一个明确设置到期日期的 cookie 时,我没有通过EmbeddedWB1.Cookie 获得这个日期。
  • 恐怕您在这里无能为力。 cookie 属性应该为您提供那里描述的所有内容(其中还应该包括其他详细信息)。也许有一些安全限制。
  • 这是一个简单的问题,没有简单的答案。我在TWebBrowser 之后获得了this tutorial 的成功(我认为你需要做同样的事情,因为我认为 EWB 不会让你的生活更轻松地完成这项任务)。
  • 谢谢,这看起来很有趣。将对此进行调查。

标签: delphi cookies delphi-xe8 tembeddedwb


【解决方案1】:

解决办法如下:

首先,我们需要让我们熟悉WinapiFILETIME structure。

然后从这里获取 IE cookie 文件:

C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Cookies\

现在查找与您从 TEmbeddedWB.Cookie 获得的相同 name=value 对的 cookie 文件。

这是一个 IE cookie 文件内容的示例,我们从中获取数据:

(与活着的人或其他权威的相似之处纯属偶然,并非故意!)

我们可以从红色的 cmets 中看到各种数字的含义。

这里是破译这些数字的源代码:

uses Winapi.Windows;

function ConvertWinapiFileTimeLoHiValuesToDateTimeStr(const AFTLoValue, AFTHiValue: Cardinal): string;
const
  InvalidDate = '01/01/80 12:00:00 AM';
var
  lCookieFileTime: TFileTime;
  lDosDT: Integer;
  lLocalFileTime: TFileTime;
begin
  lCookieFileTime.dwLowDateTime  := AFTLoValue;
  lCookieFileTime.dwHighDateTime := AFTHiValue;

  FileTimeToLocalFiletime(lCookieFileTime, lLocalFileTime);
  if FileTimeToDosDateTime(lLocalFileTime, Longrec(lDosDT).Hi, Longrec(lDosDT).Lo) then
  begin
    try
      Result := DateTimeToStr(FiledateToDatetime(lDosDT));
    except
      Result := InvalidDate;
    end;
  end
  else
    Result := InvalidDate;
end;

现在我们可以将这个函数与上述 cookie 文件中的数字一起使用,例如:

CodeSite.Send('Expiration Date', ConvertWinapiFileTimeLoHiValuesToDateTimeStr(2496134912, 30471078));
CodeSite.Send('Modified Date', ConvertWinapiFileTimeLoHiValuesToDateTimeStr(2624224682, 30465043));

这会给我们这个结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2021-12-27
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多