好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

利用Php的CURL POST提交表单登录实例详解 - php高级

利用Php的CURL POST提交表单登录实例详解

例1,CURL使用POST提交XML数据,代码如下:

$url  =  "http://HdhCmsTestphpfensi测试数据" ;   <!--?xml version= "1.0" ?-->      $ch  = curl_init();   $header [] =  "Content-type: text/xml" ; //定义content-type为xml    curl_setopt( $ch , CURLOPT_URL,  $url );  //定义表单提交地址    curl_setopt( $ch , CURLOPT_POST, 1);    //定义提交类型 1:POST ;0:GET    curl_setopt( $ch , CURLOPT_HEADER, 1);  //定义是否显示状态头 1:显示 ; 0:不显示    curl_setopt( $ch , CURLOPT_HTTPHEADER,  $header ); //定义请求类型    curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 0); //定义是否直接输出返回流    curl_setopt( $ch , CURLOPT_POSTFIELDS,  $data );  //定义提交的数据,这里是XML文件     curl_close( $ch ); //关闭  

在PHP中CURL使用POST提交XML数据时,一定要定义content-type为xml,要不然默认是text/html.

例2,post表单数据,curl是利用URL语法在命令行方式下工作的文件传输工具,代码如下:

set_time_limit(0);  @date_default_timezone_set( 'Asia/Shanghai' );  function  curlrequest( $url , $postfield , $proxy = "" ){  $proxy =trim( $proxy );  $user_agent  = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" ;  $ch  = curl_init();     // 初始化CURL句柄   if (! empty empty ( $proxy )){  curl_setopt ( $ch , CURLOPT_PROXY,  $proxy ); //设置代理服务器   }  curl_setopt( $ch , CURLOPT_URL,  $url );  //设置请求的URL   //curl_setopt($ch, CURLOPT_FAILONERROR, 1); // 启用时显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息   //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);//启用时会将服务器服务器返回的[Location:]放在header中递归的返回给服务器   curl_setopt( $ch , CURLOPT_RETURNTRANSFER,1); // 设为TRUE把curl_exec()结果转化为字串,而不是直接输出   curl_setopt( $ch , CURLOPT_POST, 1); //启用POST提交   curl_setopt( $ch , CURLOPT_POSTFIELDS,  $postfield );  //设置POST提交的字符串   //curl_setopt($ch, CURLOPT_PORT, 80); //设置端口   curl_setopt( $ch , CURLOPT_TIMEOUT, 25);  // 超时时间   curl_setopt( $ch , CURLOPT_USERAGENT,  $user_agent ); //HTTP请求User-Agent:头   //curl_setopt($ch,CURLOPT_HEADER,1);//设为TRUE在输出中包含头信息   //$fp = fopen("example_homepage.txt", "w");//输出文件   //curl_setopt($ch, CURLOPT_FILE, $fp);//设置输出文件的位置,值是一个资源类型,默认为STDOUT (浏览器)。   curl_setopt( $ch ,CURLOPT_HTTPHEADER, array (  'Accept-Language: zh-cn' ,  'Connection: Keep-Alive' ,  'Cache-Control: no-cache'   )); //设置HTTP头信息   $document  = curl_exec( $ch );  //执行预定义的CURL   $info =curl_getinfo( $ch );  //得到返回信息的特性   //print_r($info);   if ( $info [http_code]== "405" ){  echo   "bad proxy {$proxy}n" ;   //代理出错   exit ;  }  //curl_close($ch);   return   $document ;  }  //请求URL   $url = "http://example.cn/getInfo.php" ;  //POST提交数据,可用HTTPWATCH查看   $postfield = "userName=test&year=2008&passWord=123456&Submit=%CC%E1%BD%BB" ;  //代理服务器   $proxy  =  '' ;  //请求   $str =curlrequest( $url , $postfield , $proxy );  //输出结果   echo   $str ;  

例3,一个简单利用curl post登录实例.

模拟post登陆提交表单问题

SOOPY类:之前写过一个程序是模拟post来推送一些资源,起初跟大家一样,各种百度谷歌,首先想到的就是用PHP自带的库CURL这个来模拟,自己想偷偷懒看有没有更简单的类来实现呢?还是被我发现了,他就是snoopy类.(中文名史卢比),代码如下:

//首先要引用这个类    include ( "/data/tools/pooy/Snoopy/Snoopy.class.php" );   $snoopy  =  new  Snoopy;   //$Parameters这个是要提交的数组    $Parameters [ "username" ] =  "user" ;   $Parameters [ "pass" ] =  "pass" ;   $file  =  "/test/test.jpg" ;   $serviceUrl  =  "http://HdhCmsTest你的地址/fileProcess.php" ;   $postfiles [ "image" ] =  $file ;  //$filename上传文件相对路径 例如"upload/taoav.jpg";image/jpg    $snoopy ->_submit_type =  "multipart/form-data" ;  //设定submit类型    $snoopy ->submit( $serviceUrl , $Parameters , $postfiles );  //$postforms,$postfiles为2中类型的值,其中$postfiles为上传文件数组  

上面这个例子就是实现了一个POST表单提交的案例,由于需求比较复杂,这个snoopy的功能不能满足于我的需求,于是又开始去进攻CURL.

CURL扩展库:这个库是比较成熟的一个扩展库,功能很强大,强大到可以模拟浏览器的任何一个动作,需求是这样子的,第一登陆一个网站后台,第二接口页面,然后开始推送大量资源,这里面的具体逻辑就缩略了,为了操作方便,我把我需要模拟的几个函数封装到了一个类里面,简短代码如下:

/*         模拟资源推送类         2012-09-14 by POOY    */   class  TuisongPost{             //用构造登陆认证          function  TuisongPost(){                  //存放COOKIE的文件               global   $cookie_jar ;              $this ->cookie_jar = tempnam( './tmp' , 'cookie' );              $url  =  "http://HdhCmsTest你的地址" ;                  $post_data  =  array (  "username"  =>  "admin" , "password"  =>  "admin"  );                  $ch  = curl_init();                 curl_setopt( $ch , CURLOPT_URL,  $url );                 curl_setopt( $ch , CURLOPT_POST, 1);                 curl_setopt( $ch , CURLOPT_HEADER, 1);                 curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 0);                 curl_setopt( $ch , CURLOPT_POSTFIELDS,  $post_data );                   curl_setopt( $ch , CURLOPT_COOKIEJAR,  $this ->cookie_jar);   //保存cookie信息                   $output1  = curl_exec( $ch );                 curl_close( $ch );                  //echo $this->cookie_jar."n";         }         /*得到组ID*/              function  getGid( $groupname , $channel , $lanmu ){                  $url  =  "http://XXXX测试数据/creategroup" ;                  //格式化要推送的数据               $data  =  $this ->getGidArr( $groupname , $channel , $lanmu );                  $ch  = curl_init();                  $Ref_url  =  "http://HdhCmsTest你的地址" ;                 curl_setopt( $ch , CURLOPT_URL,  $url );                 curl_setopt( $ch , CURLOPT_REFERER,  $Ref_url );        //伪装REFERER                  curl_setopt( $ch , CURLOPT_POST, 1);    //post方式提交数据                  curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);    //返回数据,而不是直接输出                  curl_setopt( $ch , CURLOPT_HEADER, 0);    // 设置是否显示header信息 0是不显示,1是显示  默认为0                  curl_setopt( $ch , CURLOPT_COOKIEFILE,  $this ->cookie_jar);   //发送cookie文件                  curl_setopt( $ch , CURLOPT_POSTFIELDS,  $data );    //发送POST数据                   $output2  = curl_exec( $ch );     //发送HTTP请求                   //这个返回值是用作判断的依据               return   $output2 ;             curl_close( $ch );              //$this->unlink($this->cookie_jar);         }                  //推送数据          function  sendPic( $note , $groupid , $groupindex , $img ){                  $url  =  "http://XXXX/addimage" ;                  $groupid  =  intval ( $groupid );              $data  =  $this ->sendPicArr( $note , $groupid , $groupindex , $img );                  $ch  = curl_init();                  $Ref_url  =  "http://HdhCmsTest你的地址" ;                 curl_setopt( $ch , CURLOPT_URL,  $url );                 curl_setopt( $ch , CURLOPT_REFERER,  $Ref_url );        //伪装REFERER                  curl_setopt( $ch , CURLOPT_POST, 1);    //post方式提交数据                  curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);    //返回数据,而不是直接输出                  curl_setopt( $ch , CURLOPT_HEADER, 0);    // 设置是否显示header信息 0是不显示,1是显示  默认为0                  curl_setopt( $ch , CURLOPT_COOKIEFILE,  $this ->cookie_jar);   //发送cookie文件                  curl_setopt( $ch , CURLOPT_POSTFIELDS,  $data );    //发送POST数据                   $output2  = curl_exec( $ch );     //发送HTTP请求               return   $output2  ;             curl_close( $ch );              //$this->unlink($this->cookie_jar);         }                  /*推送数据操作*/              function  sendMes( $url , $img , $imgdesc , $groupid , $groupname , $channel , $lanmu )        {              //var_dump($this->cookie_jar);               //exit();               $url  =  "http://XXXX/add" ;                  $data  =  $this ->getArr( $img , $imgdesc , $groupid , $groupname , $channel , $lanmu );                  $ch  = curl_init();                  $Ref_url  =  "http://HdhCmsTest你的地址" ;                 curl_setopt( $ch , CURLOPT_URL,  $url );                 curl_setopt( $ch , CURLOPT_REFERER,  $Ref_url );        //伪装REFERER                  curl_setopt( $ch , CURLOPT_POST, 1);    //post方式提交数据                  curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);    //返回数据,而不是直接输出                  curl_setopt( $ch , CURLOPT_HEADER, 0);    // 设置是否显示header信息 0是不显示,1是显示  默认为0                  curl_setopt( $ch , CURLOPT_COOKIEFILE,  $this ->cookie_jar);   //发送cookie文件                  curl_setopt( $ch , CURLOPT_POSTFIELDS,  $data );    //发送POST数据                   $output2  = curl_exec( $ch );     //发送HTTP请求                  curl_close( $ch );              //$this->unlink($this->cookie_jar);         }                  function  getArr( $img , $imgdesc , $groupid , $groupname , $channel , $lanmu )        {              $post_data  =  array (                                       //windows使用如下写法,linux不适用                                        //"img"=>"@".$img.";type=image/jpeg",                                        "img" => "@" . $img ,                                       "imgdesc" => $imgdesc ,                                       "groupid" => $groupid ,                                       "groupname" => $groupname ,                                       "channel" => $channel ,                                       "lanmu" => $lanmu ,                                       "cdate" => date ( 'Y-m-d' )                            );              return   $post_data ;        }              //格式化getGidArr          function  getGidArr( $groupname , $channel , $lanmu )        {                        $post_data  =  array (                                       "groupname" => $groupname ,                                       "channel" => $channel ,                                       "lanmu" => $lanmu ,                                       "cdate" => date ( 'Y-m-d' )                            );              return   $post_data ;        }              //格式化sendPicArr          function  sendPicArr( $note , $groupid , $groupindex , $img )        {              $post_data  =  array (                                       "notes" => $note ,                                       "id" => $groupid ,                                       "index" => $groupindex ,                                       "cdate" => date ( 'Y-m-d' ),                                       //windows使用如下写法,linux不适用                                        //"img"=>"@".$img.";type=image/jpeg",                                        "img" => "@" . $img                       );              return   $post_data ;        }             //清理cookie文件          function  unlink( $cookie_jar ){          unlink( $cookie_jar );         }   }  

以上就是用CURL来完美解决了这个问题,他能有效的解决cookie存储问题.

查看更多关于利用Php的CURL POST提交表单登录实例详解 - php高级的详细内容...

  阅读:52次