用indy如何实现http下载中自动使用Cookie?(200分)

  • 主题发起人 盘古*伙计
  • 开始时间

盘古*伙计

Unregistered / Unconfirmed
GUEST, unregistred user!
在很多bbs中需要登陆才能看到里面的内容。如果在ie中使用cookie可以一次登陆
很久都自动使用这个cookie。

在flashget中也是这样,它会自动寻找cookie然后加到http的header中提交出去。
比如这个下载的url是:http://www.5460.net/cgi-bin/viewProfile.cgi?ID=55667
跟踪flashget可以看到:
.....
Sun Dec 22 23:15:54 2002 GET /cgi-bin/viewProfile.cgi?a=4&page=10 HTTP/1.1
Sun Dec 22 23:15:54 2002 Host: www.s8s8.net
Sun Dec 22 23:15:54 2002 Accept: */*
Sun Dec 22 23:15:54 2002 Referer: http://www.5460.net/cgi-bin
Sun Dec 22 23:15:54 2002 Cookie: onlineview=0; union=1; catlog; amembernamecookie=markey; apasswordcookie=ccffgssde; templastvisit=40-1038857461--; lastvisit=40-1038857545--42-1038858487--; treeview=no
Sun Dec 22 23:15:54 2002 User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)
Sun Dec 22 23:15:54 2002 Pragma: no-cache
.......

我想问我的程序想实现这个功能该怎么做?不用用户自己去找,程序自动找到合适的cookie然后使用

这个不难吧?
 
这个问题是比较难,我看还没有人回答,在这个论坛中还没有相关的答案,希望知道的朋友能提供。
 
我刚才分析了一下IE的COOKIE的原理,
1。他作为一个客户端,发现SERVER端需要支持COOKIE,那么他会在一个目录里建立一个相应的COOKIE文件。目录一般是X:/Documents and Settings/XXX/Cookies ,X为系统安装盘符,XXX为用户名。
2。那么COOKIE的文件名是什么呢?IE使用了缓存名称,比如XXX@BAIDU[1].TXT,所以
你只需要从这个文件中读出数据提交HEADER就可以了,但是怎么知道要找这个文件呢?
3。在X:/Documents and Settings/XXX/Cookies下有一个INDEX.DAT数据库,里面记录着某个COOKIE,对应哪个缓冲文件。
4。COOKIE的名字是这样的:Cookie:XXX@baidu.com/,XXX等于你的系统当前用户名,BAIDU.COM 是IE第一次访问SERVER,SERVER告诉IE的域名称 /等于路径名称
5。知道了Cookie:XXX@baidu.com/,就可以通过INDEX.DAT找到XXX@BAIDU[1].TXT,从里面读数据了。
6。但是怎么判断一个网站的COOKIE名,我还没搞清,比如我们访问WWW.BAIDU.COM,COOKIE名称就是COOKIE:XXX@BAIDU.COM,但我们访问WWW.5460.NET时可能就是COOKIE:XXX@WWW.5460.NET了。所以不能根据访问的域名来算COOKIE名(虽然有一定关系)
7。我想IE可能在第一次访问SERVER后就将URL与COOKIE名称的对应关系保存到了INDEX.DAT(也可能是其他文件)中,当以后访问时,从其中根据URL的域名,找到COOKIE名,然后根据COOKIE名找到对应的文件名,并从文件中读取COOKIE信息。
8。可惜INDEX.DAT好像是个特别的数据库,我看了好像有URL,但是是乱码,只有COOKIE名和对应的文件名是ASCII码,可以直接看到。所以要从INDEX.DAT中找到COOKIE的文件名就不方便了。
9。当然可以用个笨办法,比如我们访问WWW.BAIDU.COM时,先根据WWW.BAIDU.COM来生成COOKIE名称COOKIE:XXX@WWW.BAIDU.COM/ ,然后用这个COOKIE名称在INDEX.DAT中找对应的文件名,如果找到最好,如果找不到,就换成根据BAIDU.COM生成COOKIE名称COOKIE:XXX@BAIDU.COM/ 然后再根据这个名称找,一般就可以了。
10。当然还有一个办法,对于你固定要提交的网站,你先搞清他的COOKIE名称是什么,然后再你的程序中作个输入部分可以指定COOKIE名称,然后根据你指定的COOKIE名称到INDEX.DAT中去找具体的文件名。如果你想偷懒,就直接配置指定的文件名也行呀。哈哈,不过兼容行就不强咯。
 
不明白楼上的意思,我想明白下载工具为什么可以使用IE保存的Cookie.
 
不明白楼上的意思,我想明白下载工具为什么可以使用IE保存的Cookie.
 
帮你提一下。
 
to:小梅
该问题的答案我已回答到你的 提问中,没看到么?


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,WinInet, ExtCtrls, StdCtrls, Buttons;

type
TForm1 = class(TForm)
Memo1: TMemo;
Panel1: TPanel;
url: TLabeledEdit;
GetCookIes: TBitBtn;
procedure GetCookIesClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.GetCookIesClick(Sender: TObject);
var
CookieData:string;
CookieSize:cardinal;
begin
try

CookieSize:=256;
Setlength(CookIeData,cookieSize);
if InternetGetCookie(PAnsiChar(url.Text),nil,PAnsiChar(CookieData),CookieSize) then begin
memo1.Lines.Add('URL >'+URL.Text);
memo1.Lines.Add('Data >'+CookIedata);
memo1.Lines.Add('Size >'+inttostr(cookiesize));
end;
except
end;

end;

end.

 
顶部