前面有講過很多關於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存儲問題。