zoukankan      html  css  js  c++  java
  • IDHTTP

    Delphi IDHTTP用法详解

    一、IDHTTP的基本用法
    
    IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快、更节约资源,缺点是需要手动维护cook,连接等
    
    IDHttp的创建,需要引入IDHttp
    
    procedure InitHttp();
    begin
        http := TIdHTTP.Create(nil);
        http.ReadTimeout := 30000;
        http.OnRedirect := OnRedirect;
        http.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*';
        http.Request.AcceptLanguage := 'zh-cn';
        http.Request.ContentType := 'application/x-www-form-urlencoded';
        http.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)';
    
        http.ProxyParams.ProxyServer := '代理服务器地址';
        http.ProxyParams.ProxyPort := '代理服务器端口';
    end;
    
    
    二、如何取得服务端返回的cookie信息,并添加到http的request对象中
    
    
    procedure Setcookie;
    var
       i: Integer;
       tmp, cookie: String;
    begin
       cookie := '';
       for i := 0 to http.Response.RawHeaders.Count - 1 do
       begin
           tmp := http.Response.RawHeaders[i];
          if pos('set-cookie: ', LowerCase(tmp)) = 0 then Continue;
        tmp := Trim(Copy(tmp, Pos('Set-cookie: ', tmp) + Length('Set-cookie: '), Length(tmp)));
        tmp := Trim(Copy(tmp, 0, Pos(';', tmp) - 1));
          if cookie = '' then cookie := tmp else cookie := cookie + '; ' + tmp;
    end;
    if cookie <> '' then
    begin
        for i := 0 to http.Request.RawHeaders.Count - 1 do
        begin
          tmp := http.Request.RawHeaders[i];
          if Pos('cookie', LowerCase(tmp)) = 0 then Continue;
          http.Request.RawHeaders.Delete(i);
          Break;
        end;
        http.Request.RawHeaders.Add('cookie: ' + cookie);
    end;
    end;
    
    
    三、如何取得网页中的所有连接,对代码做修改你也可以实现查找所有图片等等
    
    
    function GetURLList(Data: String): TStringList;
    var
    i: Integer;
    List: TStringList;
    tmp: String;
    
    
    function Split(Data, Node: String): TStringList;
       var
        Count, i, j: Integer;
    
    
           function GetFieldCount(Data, Node: String): Integer;
          var
             i: Integer;
          begin
              Result := -1;
              i := Pos(Node, Data);
             if i = 0 then Exit;
                 Result := 0;
              while i <> 0 do
              begin
                Inc(Result);
                 Delete(Data, 1, i + Length(Node) - 1);
                i := Pos(Node, Data);
              end;
        end;
       begin
          Result := TStringList.Create;
      Count := GetFieldCount(Data, Node);
      for i := 0 to Count - 1 do
      begin
          j := Pos(Node, Data);
          Result.Add(Copy(Data, 1, j - 1));
          Delete(Data, 1, j + Length(Node) - 1);
      end;
      Result.Add(Data);
     end;
    begin
     Result := TStringList.Create;
     try
        List := split(Data, 'href=');
         for i := 1 to List.Count - 1 do
         begin
          tmp := List[i];
           tmp := Copy(tmp, 0, Pos('</a>', tmp) - 1);
           tmp := Copy(tmp, 0, Pos('>', tmp) - 1);
           if Pos(' ', tmp) <> 0 then
    
              tmp := Copy(tmp, 0, Pos(' ', tmp) - 1);
           tmp := Q_ReplaceStr(tmp, Char(34), '');
         tmp := Q_ReplaceStr(tmp, Char(39), '');
           if not Compare(CI.Key, tmp) then Continue;
           if Copy(tmp, 1, 7) <> 'http://' then
         begin
             if Copy(tmp, 1, 1) = '.' then tmp := StringReplace(tmp, '.', '', []);
           if Copy(tmp, 1, 1) = '.' then tmp := StringReplace(tmp, '.', '', []);
            try
             tmp := 'http://' + http.URL.Host + ':' + http.URL.Port + http.URL.Path + tmp;
            except
             end;
           end;
           if Result.IndexOf(tmp) <> -1 then Continue;
              Result.Add(tmp);
         end;
       FreeAndNil(List);
    except
    
    end;
    end;
    
    
    四、如何模拟http的get方法打开一个网页
    
    
    function GetMethod(http: TIDhttp; URL: String; Max: Integer): String;
    var
    RespData: TStringStream;
    begin
    RespData := TStringStream.Create('');
    try
        try
          Http.Get(URL, RespData);
          Http.Request.Referer := URL;
          Result := RespData.DataString;
        except
          Dec(Max);
          if Max = 0 then
          begin
            Result := '';
            Exit;
          end;
          Result := GetMethod(http, URL, Max);
        end;
    finally
        FreeAndNil(RespData);
    end;
    end;
    
    
    五、如何模拟http的post方法提交一个网页
    
    
    function PostMethod(URL, Data: String; max: Integer): String;
    var
    PostData, RespData: TStringStream;
    begin
    RespData := TStringStream.Create('');
    PostData := TStringStream.Create(Data);
    try
        try
          if http = nil then Exit;
          Http.Post(URL, PostData, RespData);
          Result := RespData.DataString;
          http.Request.Referer := URL;
        except
          Dec(Max);
          if Max = 0 then
          begin
            Result := '';
            Exit;
          end;
          Result := PostMethod(URL, Data, Max);
        end;
    finally
        http.Disconnect;
        FreeAndNil(RespData);
        FreeAndNil(PostData);
    end;
    end;
    
    
    六、伪造session
    
    var
    My_Cookie,tmpcookie:string;
    
    begin
    aIdHttp.Get('http://www.huochepiao.net/');
    tmpcookie:=aIdHttp.Request.CustomHeaders.Values['Set-Cookie'];
       if Pos(';',tmpcookie)>0 then
         My_Cookie:=LeftBStr(tmpcookie,Pos(';',tmpcookie)-1)
    else
         My_Cookie:= tmpcookie;
    //
    aIdHTTP.Request.CustomHeaders.Clear;
    aIdHTTP.Request.CustomHeaders.Add('Cookie:'+My_COOKIE);
    
    end;
    

      idhttp的get 和 post的使用

    function Tform1.IdHttpInit;
    begin
      idhtp1.AllowCookies:=True;
      idhtp1.HTTPOptions:=[hoForceEncodeParams];
      idhtp1.ProtocolVersion:=pv1_1;
      idhtp1.Request.ContentType:='Content-Type=application/x-www-form-urlencoded; charset=UTF-8';
      idhtp1.Request.CacheControl:='no-cache';   
      idhtp1.Request.UserAgent:='User-Agent=Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)';
      idhtp1.Request.Accept:='Accept=*/*';
      idhtp1.Request.AcceptEncoding:='Accept-Encoding=gzip,deflate';
      idhtp1.Request.AcceptCharSet:='Accept-Charset=gb2312,utf-8;q=0.7,*;q=0.7';
      idhtp1.Request.Connection:='Connection=keep-alive';
      idhtp1.Request.Host:='Host=kyfw.12306.cn';
      idhtp1.Request.Referer:='https://kyfw.12306.cn/otn/login/init';
      idhtp1.Request.AcceptLanguage:='Accept-Language=zh-cn';
      Result:='';
    end;
    
    function Tform1.GetCodeImg;
    var url:string;
    response:TMemoryStream;
    jpg:TJPEGImage;
    begin
      response:=TMemoryStream.Create;
       url:='https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.3110086616057921';
       idhtp1.Get(url,response);
       jpg:=TJPEGImage.Create;
       jpg.LoadFromStream(response);
       Result:='';
    end;
    
    function Tform1.Login;
    var
      url : string;
      Params:TStrings;
    begin
      Params:=TStringList.Create;
      Params.Add('loginUserDTO.user_name=xxxxxx@qq.com');//用户名
      Params.Add('userDTO.password=xxxxxxx');//密码
      Params.Add('randCode=ku6a');//验证码
      Params.Add('randCode_validate=');
      Params.Add('OTcyNTU4=ZjIzYzc3MWJmMDk4OTk5YQ==');
      Params.Add('myversion=undefined');
    end;
    View Code
  • 相关阅读:
    软件测试系列--集成测试
    软件测试系列--系统测试
    软件测试系列-软件质量
    Java初认识--函数和数组
    Java初认识--Java中的语法结构
    Java初认识--Java语言的书写规范及基本的运算符
    Java初认识--环境搭建及基本数据类型
    软件测试系列--软件缺陷管理
    ASP.NET MVC 路由系统类
    由浅入深了解Retrofit(一)
  • 原文地址:https://www.cnblogs.com/blogpro/p/11453322.html
Copyright © 2011-2022 走看看