这几天在网上无意间看到很多人转载或部分截取了本文的部分内容
在此声明,转载请注明出处,谢谢
前几天写了个工具 CookieAdmin 来查看 IE 的 Cookie
有人问到实现原理,就写了这篇文章
我不善于写文档或文章,所以还是代码说话吧
IE 的 Cookie 文件保存在 ?:\Documents and Settings\<user>\Cookies 目录,后缀为.txt
可以直接使用 API SHGetFolderPath 取得 Cookie 文件的保存目录
不过我没发现 Delphi2007 有这个 API 的声明,所以自己声明了一下
代码如下(发现代码高亮支持 Pascal 了,呵呵)

GetCookieFolder
1
function SHGetFolderPath(hwndOwner: HWND; nFolder: Integer; hToken: HWND;
2
dwFlags: Word; pszPath: PChar): Boolean; stdcall; external shell32 name 'SHGetFolderPathA';
3
4
function GetCookieFolder: string;
5
var
6
P: array[0..MAX_PATH] of Char;
7
begin
8
SHGetFolderPath(0, CSIDL_COOKIES, 0, 0, @P[0]);
9
Result := IncludeTrailingBackslash(P);
10
end; 注意 shell32 常量定义在 ShellAPI.pas 里,CSIDL_COOKIES 定义在 ShlObj.pas 里,记得引用
枚举 Cookie 文件

GetCookieFiles
1
procedure GetCookieFiles(APath: string; AList:TStrings);
2
var
3
Sr: TSearchRec;
4
begin
5
if FindFirst(APath + '*.txt', faArchive, Sr) = 0 then
6
begin
7
repeat
8
if Sr.Name[1] = '.' then Continue;
9
10
AList.Add(Sr.Name);
11
until FindNext(Sr) <> 0;
12
13
FindClose(Sr);
14
end;
15
end; 下面才是重点,Cookie 文件的格式,呵呵
Cookie 文件只是个纯粹的文本文件,以换行符(ASCII=10)为分隔符
可以使用 TStringList 读取,会自动分行的
格式如下
a_cookie
0.123
my.demo.site
1600
1589052800
30634450
672816768
29899592
*
其中
第1行为 Cookie 名称
第2行是 Cookie 的值
第3行是 Cookie 所属站点的地址
第4行是个标记值(注:准确来说应该是表示该Cookie是否被加密)
第5行为超时时间的低位(Cardinal/DWORD)
第6行为超时时间的高位
第7行为创建时间的低位
第8行为创建时间的高位
第9行固定为 * ,表示一节的结束
需要注意的是这里使用的时间并非 Delphi 的 TDateTime,而是 FILETIME(D里为对应的TFileTime)
一个文件可能包含有多个节,按上面的格式循环即可
下面的代码将上述时间转换为 D 里的 TDateTime

ConvertToDateTime
1
function FileTimeToDateTime(FT: TFileTime): TDateTime; inline;
2
var
3
ST: TSystemTime;
4
begin
5
FileTimeToLocalFileTime(FT, FT);
6
FileTimeToSystemTime(FT, ST);
7
Result := SystemTimeToDateTime(ST);
8
end;
9
10
function ConvertToDateTime(L, H: Cardinal): TDateTime;
11
var
12
FT: TFileTime;
13
begin
14
FT.dwLowDateTime := L;
15
FT.dwHighDateTime := H;
16
Result := FileTimeToDateTime(FT);
17
end;
怎么样,确实很简单吧?呵呵
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述