zoukankan      html  css  js  c++  java
  • idHTTP最简洁的修改和取得Cookie例子

    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.
    

      

  • 相关阅读:
    Redhat 8 nfs网络共享
    Cisco ASA NAT (1) 静态配置和端口映射
    DISM命令行工具修复Windows 10映像
    開啟windows 7 ,10 的熱點功能(無線熱點)
    symantec SMG 抓包
    在 MacBook 上安装 Ubuntu
    springboot整合的MongoDB(一){博主新人入坑,不对的地方还望大哥指出}
    feign接口无法传递参数 (初学者)
    low cache rba恢复到on disk rba
    控制文件被删除的测试
  • 原文地址:https://www.cnblogs.com/94YY/p/3482642.html
Copyright © 2011-2022 走看看