利用Php的CURL POST提交表单登录实例详解_PHP教程
例1
CURL使用POST提交XML数据
代码如下 | 复制代码 |
$url = "http://www.bKjia.c0m"; |
在PHP中CURL使用POST提交XML数据时,一定要定义content-type为xml,要不然默认是text/html!
例2,post表单数据
curl是利用URL语法在命令行方式下工作的文件传输工具。
php教程实例:
代码如下 | 复制代码 |
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($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类。(中文名史卢比)
代码如下 | 复制代码 |
//首先要引用这个类 |
//$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://www.你的地址"; $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.com/creategroup"; //格式化要推送的数据 $data = $this->getGidArr($groupname,$channel,$lanmu); $ch = curl_init(); $Ref_url = "http://www.你的地址"; 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://www.你的地址"; 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://www.你的地址"; 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存储问题。
上一篇: 如何在smarty模板中执行php代码
下一篇: 地图reduce 与mysql 交互