XE8
我试了下,XE8上是点不出CookieManager.CookieCollection.Items[0].CookieText
但是点出了 IdHTTP1.CookieManager.CookieCollection.Cookies[0].CookieText
不知道是不是一样的,没测试
(一)http://www.delphitop.com/html/kongjian/3307.html
procedure TForm1.btn1Click(Sender: TObject);
var
IdHTTP: TIdHTTP;
mstrCookie: string;
Cookies : TIdCookieManager;
i: Integer;
begin
IdHTTP := TIdHTTP.Create(nil);
IdHTTP.Request.UserAgent := '';
mstrCookie := 'aaa=5555&bb=12345';
IdHTTP.Request.AcceptEncoding := '';
if mstrCookie <> '' then
begin
IdHTTP.Request.SetHeaders; //说要加这一句。
IdHTTP.Request.CustomHeaders.Add('Cookie: ' + mstrCookie);
end;
IdHTTP.AllowCookies := True;
Cookies := TIdCookieManager.Create(nil);
IdHTTP.HandleRedirects := True;
IdHTTP.CookieManager := Cookies;
IdHTTP.ReadTimeout := 25000; //设置读取超时
Memo1.text := IdHTTP.Get('http://www.baidu.com/');
mstrCookie:='';
//Memo1.Lines.Add (Cookies.CookieCollection.Items[0].CookieText);
for i := 0 to Cookies.CookieCollection.Count - 1 do
begin
Memo1.Lines.Add(Cookies.CookieCollection.Items[i].CookieName + 'Value:' + Cookies.CookieCollection.Items[i].Value);
mstrCookie:=mstrCookie+ Cookies.CookieCollection.Items[i].CookieName+'='+ Cookies.CookieCollection.Items[i].Value +'&';
end;
Memo1.Lines.Add ( mstrCookie);
IdHTTP.free;
end;
(二)http://www.delphitop.com/html/kongjian/3308.html
procedure
TForm1
.
Button1Click(Sender: TObject);
var
HTTP: TidHTTP;
html, s:
string
;
i:
integer
;
begin
HTTP := TidHTTP
.
Create(
nil
);
try
HTTP
.
HandleRedirects :=
True
;
HTTP
.
AllowCookies :=
True
;
HTTP.Request.UserAgent := '';//这名原来没有,一定要加
HTTP
.
Request
.
CustomHeaders
.
Values[
'Cookie'
] :=
'abcd'
;
//修改Cookie 抓包可见
{ 发COOKIE改为
HTTP.Request.UserAgent := '';
mstrCookie := 'aaa=5555&bb=12345';
HTTP.Request.AcceptEncoding := '';
if mstrCookie <> '' then
begin
//IdHTTP.Request.SetHeaders;; //说要加这一句,在INDY10中找不到这个属性。
HTTP.Request.CustomHeaders.Add('Cookie: ' + mstrCookie);
end;}
html := HTTP
.
Get(
'http://www.baidu.com/'
);
s :=
'Cookies: '
;
if
HTTP
.
CookieManager
.
CookieCollection
.
Count >
0
then
for
i :=
0
to
HTTP
.
CookieManager
.
CookieCollection
.
Count -
1
do
s := s + HTTP
.
CookieManager
.
CookieCollection
.
Items[i].CookieText;
Memo1
.
Lines
.
Add(s);
//取得Cookie
finally
FreeAndNil(HTTP);
end
;
end
;
//------------------------------------
unit
Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdCookieManager, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP;
type
TForm1 =
class
(TForm)
IdHTTP1: TIdHTTP;
IdCookieManager1: TIdCookieManager;
procedure
FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end
;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure
TForm1
.
FormCreate(Sender: TObject);
var
Params: TStringList;
HTML, loginurl, myuser:
String
;
count,i:
integer
;
_cookies, cookies:tstringlist;
ll:
boolean
;
name,value:
String
;
procedure
setcookies;
var
j:
integer
; s:
string
;
begin
count:=cookies
.
count;
s:=
''
;
for
j:=
1
to
count
do
begin
IdCookieManager1
.
AddCookie(cookies[j-
1
],IdHTTP1
.
url
.
Host);
s:=s+
'; '
+cookies[j-
1
];
end
;
if
s<>
''
then
begin
delete(s,
1
,
2
);
s:=s+
';'
;
IdHTTP1
.
Request
.
CustomHeaders
.
Values[
'Cookie'
]:=s;
IdHTTP1
.
Request
.
RawHeaders
.
Values[
'Cookie'
]:=s;
//('Cookie'+IdHTTP1.Request.RawHeaders.NameValueSeparator+s);
end
;
{}
end
;
procedure
extractcookie(cookie:
string
;
var
name,value:
string
);
var
i,k:
integer
;
begin
i:=pos(
'='
,cookie);
k:=pos(
';'
,cookie);
if
k=
0
then
k:=length(cookie);
if
i>
0
then
begin
name:=copy(cookie,
1
,i-
1
);
value:=copy(cookie,i+
1
,k-i-
1
);
end
else
begin
name:=
''
;
value:=
''
;
end
;
end
;
procedure
savecookies;
var
j:
integer
;
begin
count:=IdCookieManager1
.
CookieCollection
.
count;
for
j:=
1
to
count
do
begin
extractcookie(IdCookieManager1
.
CookieCollection
.
Items[j-
1
].CookieText,name,value);
cookies
.
Values[name]:=value;
end
;
// IdCookieManager1.CookieCollection.Clear;
end
;
procedure
saveit(name:
string
);
begin
with
tfilestream
.
create(name,fmcreate)
do
try
write
(
pansichar
(html)^,length(html));
finally
free;
end
;
end
;
begin
ll:=
false
;
loginurl:=
'http://feedmelinks.com/login'
;
Params := TStringList
.
Create;
try
cookies:=tstringlist
.
Create;
// cookies.Duplicates:=dupIgnore;
// cookies.Sorted:=true;
idhttp1
.
Host:=
'feedmelinks.com'
;
html:=idhttp1
.
Get(
'http://feedmelinks.com/'
);// first get; get first cookie(s)
savecookies;
setcookies;
html:=idhttp1
.
Get(loginUrl);
// next get; this is clean: used for retrieving the viewstate
savecookies;
myuser:=
'crystyignat'
;
Params
.
Values[
'userId'
] := myuser;
Params
.
Values[
'password'
] :=
'mypassword'
;
Params
.
Values[
'op'
] :=
'login'
;
IdHTTP1
.
HandleRedirects:=
false
;
// now this made the buzz, because the cookies were not set when following the redirect
try
setcookies;
HTML := IdHTTP1
.
Post(loginurl, Params);
// now do the log in
_Cookies := TStringList
.
Create;
IdHTTP1
.
Response
.
RawHeaders
.
Extract(
'Set-cookie'
, _Cookies);
for
i :=
0
to
_Cookies
.
Count -
1
do
begin
// IdCookieManager1.AddCookie(_Cookies[i], IdHTTP1.URL.Host);
extractcookie(_Cookies[i],name,value);
cookies
.
Values[name]:=value;
end
;
_cookies
.
free;
// savecookies;
if
pos(
'<div class="welcome">Welcome, <b>'
+myuser+
'</b>'
,html)>
0
then
begin
setCookies;
html:=idhttp1
.
Get(
'http://feedmelinks.com/'
); // software redirect
savecookies;
saveit(
'hhh.html'
);
// setCookies;
// html:=idhttp1.Get('http://feedmelinks.com/portal'); // another software redirect
//savecookies;
ll:=pos(
'<a class="tn" href="logout">log out'
,html)>
0
;
end
;
except
on
e: EIdHTTPProtocolException
do
begin
if
e
.
ReplyErrorCode<>
302
then
raise
e;
// now this is the redirect
count:=IdCookieManager1
.
CookieCollection
.
count;
// get the next cookie (this will be the userid)
for
i:=
1
to
count
do
cookies
.
Add(IdCookieManager1
.
CookieCollection
.
Items[i-
1
].CookieText);
setcookies;
html:=idhttp1
.
Get(IdHTTP1
.
Response
.
Location);
// follow redirect
end
;
end
;
cookies
.
free;
except
on
e: EIdHTTPProtocolException
do
begin
showmessage(idHTTP1
.
response
.
ResponseText);
end
;
end
;
Params
.
Free;
showmessage(
'logged in? : '
+booltostr(ll,
true
));
end
;
end
.
procedure
TForm1
.
Button1Click(Sender: TObject);
var
HTTP: TidHTTP;
html, s:
string
;
i:
integer
;
begin
HTTP := TidHTTP
.
Create(
nil
);
try
HTTP
.
HandleRedirects :=
True
;
HTTP
.
AllowCookies :=
True
;
HTTP
.
Request
.
CustomHeaders
.
Values[
'Cookie'
] :=
'abcd'
;
//修改Cookie 抓包可见
html := HTTP
.
Get(
'http://www.baidu.com/'
);
s :=
'Cookies: '
;
if
HTTP
.
CookieManager
.
CookieCollection
.
Count >
0
then
for
i :=
0
to
HTTP
.
CookieManager
.
CookieCollection
.
Count -
1
do
s := s + HTTP
.
CookieManager
.
CookieCollection
.
Items[i].CookieText;
Memo1
.
Lines
.
Add(s);
//取得Cookie
finally
FreeAndNil(HTTP);
end
;
end
;
//------------------------------------
unit
Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdCookieManager, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP;
type
TForm1 =
class
(TForm)
IdHTTP1: TIdHTTP;
IdCookieManager1: TIdCookieManager;
procedure
FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end
;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure
TForm1
.
FormCreate(Sender: TObject);
var
Params: TStringList;
HTML, loginurl, myuser:
String
;
count,i:
integer
;
_cookies, cookies:tstringlist;
ll:
boolean
;
name,value:
String
;
procedure
setcookies;
var
j:
integer
; s:
string
;
begin
count:=cookies
.
count;
s:=
''
;
for
j:=
1
to
count
do
begin
IdCookieManager1
.
AddCookie(cookies[j-
1
],IdHTTP1
.
url
.
Host);
s:=s+
'; '
+cookies[j-
1
];
end
;
if
s<>
''
then
begin
delete(s,
1
,
2
);
s:=s+
';'
;
IdHTTP1
.
Request
.
CustomHeaders
.
Values[
'Cookie'
]:=s;
IdHTTP1
.
Request
.
RawHeaders
.
Values[
'Cookie'
]:=s;
//('Cookie'+IdHTTP1.Request.RawHeaders.NameValueSeparator+s);
end
;
{}
end
;
procedure
extractcookie(cookie:
string
;
var
name,value:
string
);
var
i,k:
integer
;
begin
i:=pos(
'='
,cookie);
k:=pos(
';'
,cookie);
if
k=
0
then
k:=length(cookie);
if
i>
0
then
begin
name:=copy(cookie,
1
,i-
1
);
value:=copy(cookie,i+
1
,k-i-
1
);
end
else
begin
name:=
''
;
value:=
''
;
end
;
end
;
procedure
savecookies;
var
j:
integer
;
begin
count:=IdCookieManager1
.
CookieCollection
.
count;
for
j:=
1
to
count
do
begin
extractcookie(IdCookieManager1
.
CookieCollection
.
Items[j-
1
].CookieText,name,value);
cookies
.
Values[name]:=value;
end
;
// IdCookieManager1.CookieCollection.Clear;
end
;
procedure
saveit(name:
string
);
begin
with
tfilestream
.
create(name,fmcreate)
do
try
write
(
pansichar
(html)^,length(html));
finally
free;
end
;
end
;
begin
ll:=
false
;
loginurl:=
'http://feedmelinks.com/login'
;
Params := TStringList
.
Create;
try
cookies:=tstringlist
.
Create;
// cookies.Duplicates:=dupIgnore;
// cookies.Sorted:=true;
idhttp1
.
Host:=
'feedmelinks.com'
;
html:=idhttp1
.
Get(
'http://feedmelinks.com/'
);// first get; get first cookie(s)
savecookies;
setcookies;
html:=idhttp1
.
Get(loginUrl);
// next get; this is clean: used for retrieving the viewstate
savecookies;
myuser:=
'crystyignat'
;
Params
.
Values[
'userId'
] := myuser;
Params
.
Values[
'password'
] :=
'mypassword'
;
Params
.
Values[
'op'
] :=
'login'
;
IdHTTP1
.
HandleRedirects:=
false
;
// now this made the buzz, because the cookies were not set when following the redirect
try
setcookies;
HTML := IdHTTP1
.
Post(loginurl, Params);
// now do the log in
_Cookies := TStringList
.
Create;
IdHTTP1
.
Response
.
RawHeaders
.
Extract(
'Set-cookie'
, _Cookies);
for
i :=
0
to
_Cookies
.
Count -
1
do
begin
// IdCookieManager1.AddCookie(_Cookies[i], IdHTTP1.URL.Host);
extractcookie(_Cookies[i],name,value);
cookies
.
Values[name]:=value;
end
;
_cookies
.
free;
// savecookies;
if
pos(
'<div class="welcome">Welcome, <b>'
+myuser+
'</b>'
,html)>
0
then
begin
setCookies;
html:=idhttp1
.
Get(
'http://feedmelinks.com/'
); // software redirect
savecookies;
saveit(
'hhh.html'
);
// setCookies;
// html:=idhttp1.Get('http://feedmelinks.com/portal'); // another software redirect
//savecookies;
ll:=pos(
'<a class="tn" href="logout">log out'
,html)>
0
;
end
;
except
on
e: EIdHTTPProtocolException
do
begin
if
e
.
ReplyErrorCode<>
302
then
raise
e;
// now this is the redirect
count:=IdCookieManager1
.
CookieCollection
.
count;
// get the next cookie (this will be the userid)
for
i:=
1
to
count
do
cookies
.
Add(IdCookieManager1
.
CookieCollection
.
Items[i-
1
].CookieText);
setcookies;
html:=idhttp1
.
Get(IdHTTP1
.
Response
.
Location);
// follow redirect
end
;
end
;
cookies
.
free;
except
on
e: EIdHTTPProtocolException
do
begin
showmessage(idHTTP1
.
response
.
ResponseText);
end
;
end
;
Params
.
Free;
showmessage(
'logged in? : '
+booltostr(ll,
true
));
end
;
end
.