idHTTP最简洁的修改和取得Cookie例子
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;interfaceuses 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;interfaceuses 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.
浙公网安备 33010602011771号