(300分)--->用IdHttp下载文件如何使用IE保存下来的Cookie来进行身份验证?(300分)

小梅

Unregistered / Unconfirmed
GUEST, unregistred user!
就是和Net Transport一样,在设置中选中“Cookie”,就可以使用IE保存下来的Cookie进行身份验证。这样就可以下载文件,否则用IdHttp.Get只能得到登录页面。
 
cookie的内容保存在C:/Documents and Settings/用户名/Cookies/xxx.txt中。
但是xxx.txt名字好像无法自动根据网站URL算出来,他是这样的形式 用户名@域名[1].txt
IE在C:/Documents and Settings/用户名/Cookies 下有一个INDEX.DAT数据库文件,里面
保存了COOKIE名称及其对应的具体文件名,如果知道了COOKIE的名称就可以根据INDEX.DAT
中对应的文件名来取COOKIE内容了。
COOKIE的名字是这样的:Cookie:XXX@baidu.com/ 其中XXX为本地机器用户名 ,当我们访问一个网站时,本地机器用户名可以得到,BAIDU.COM这样的域名也可以知道,那我们就有可能根据访问的网站生成COOKIE的名称 COOKIE:XXX@BAIDU.COM/ 也就可以从INDEX.DAT中找到文件名来读取COOKIE内容了。
但是我觉得好想不是这么简单计算COOKIE名称的。在DELPHI7中的INDY9中有一个控件TIdCookieManager,他是配合TIdHTTP来使用的,看了半天源代码也没看明白他是怎么处理COOKIE的,只知道COOKIE有3种标准cvNetscape, cvRFC2109, cvRFC2965
Details of implementation
-------------------------
Mar-31-2001 Doychin Bondzhev
- Chages in the class heirarchy to implement Netscape specification[Netscape], RFC 2109[RFC2109] & 2965[RFC2965]
TIdNetscapeCookie - The base code used in all cookies. It implments cookies as proposed by Netscape
TIdCookieRFC2109 - The RFC 2109 implmentation. Not used too much.
TIdCookieRFC2965 - The RFC 2965 implmentation. Not used yet or at least I don't know any HTTP server that supports
this specification.
TIdServerCooke - Used in the HTTP server compoenent.

Feb-2001 Doychin Bondzhev
- Initial release

REFERENCES
-------------------
[Netscape] "Persistent Client State -- HTTP Cookies", available at
<http://www.netscape.com/newsref/std/cookie_spec.html>,
undated.

[RFC2109] Kristol, D. and L. Montulli, "HTTP State Management
Mechanism", RFC 2109, February 1997.

[RFC2965] Kristol, D. and L. Montulli, "HTTP State Management
Mechanism", RFC 2965, October 2000.


Implementation status
--------------------------

[Netscape] - 100%
[RFC2109] - 100% (there is still some code to write and debugging)
[RFC2965] - 70% (client and server cookie generation is not ready)

}
 
[brown]楼上兄弟,你的思路不错,但是你知道怎样将Cookie内容传入IdHttp中?[/brown]
 
怎么传没试过。
不过刚才我不停的找呀找,终于让我找到了如何取得URL的COOKIE了。[:D]
是用WINDOWS API实现的:

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.
 
你记录一下TCP/IP数据包,然后模拟登录那个网页看,它用什么来要Cookie,然后你就模拟给它啦。
 
TO 金卡绣球jk8.com

那样做不通用,每个网站需要单独分析。
 
呵呵,可以变通一下的啊。

记录一下TCP/IP数据包,监控 Net Transport 的连接对话,不就......

我们有的用“adsl 300呀 500呀 上网快车”来登录网络,它就有记录数据包的功能。

再续...
 
我的回答不是答案么?已经可以获取指定的URL的COOKIE了呀。
你如果要配合COOKIE来验证并下载文件的话,可以直接用API。
你去看WININET里面封装的API函数呀,有我上面用到的InternetGetCookie
还有很多其他函数,比如DOWNLOAD之类的,很简单很好用。
 

Similar threads

顶部