利用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高级的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did30147