程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 利用Php的CURL POST提交表單登錄實例詳解

利用Php的CURL POST提交表單登錄實例詳解

編輯:關於PHP編程

前面有講過很多關於php curl函數來實現post提交數據,下面我來給大家介紹一種提交xml一種提交表單數據了。


例1

CURL使用POST提交XML數據

 代碼如下 復制代碼

$url = "http://www.bKjia.c0m";
<!--?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語法在命令行方式下工作的文件傳輸工具。
php教程實例:

 代碼如下 復制代碼 <?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類。(中文名史盧比)

 代碼如下 復制代碼

//首先要引用這個類
include("/data/tools/pooy/Snoopy/Snoopy.class.php");
$snoopy = new Snoopy;
//$Parameters這個是要提交的數組
$Parameters["username"] = "user";
$Parameters["pass"] = "pass";
$file = "/test/test.jpg";
$serviceUrl = "http://www.你的地址/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://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存儲問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved