一个简单的curl函数:
/**
* 发送数据
* @param String $url 请求的地址
* @param Array $header 自定义的header数据
$header = array('x:y','language:zh','region:GZ');
* @param Array $content POST的数据
$content = array('name' => 'wumian');
* @param Array $backHeader 返回数据是否返回header
0不反回 1返回
* @param Array $cookie 携带的cookie
* @return String
*/
function tocurl($url, $header, $content=array(),$backHeader=0,$cookie=''){
$ch = curl_init();
if(substr($url,0,5)=='https'){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
}
if(!isset($header[0])){//将索引数组转为键值数组
foreach($header as $hk=>$hv){
unset($header[$hk]);
$header[]=$hk.':'.$hv;
}
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, true);
if(count($content)){
curl_setopt($ch, CURLOPT_POSTFIELDS,$content);
}
if(!empty($cookie)){
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
curl_setopt($ch, CURLOPT_HEADER,$backHeader); // 显示返回的Header区域内容
$response = curl_exec($ch);
if($error=curl_error($ch)){
die($error);
}
curl_close($ch);
return $response;
}
这里面重点说的有两点
获取COOKIE
方法有多种 只说我暂时使用的这种
CURLOPT_HEADER设置为true 这样 curl_exec执行后返回的内容里面就携带有header;我们知道cookie就是存在于header中的
我们通过正则匹配出返回的cookie
$r = tocurl('https://www.x.com/index.php?act=account&op=send_code','',$send,1);
$preg_cookie = '/Set-Cookie: (.*?);/m';
if(preg_match_all($preg_cookie,$r,$cookie)){
$cookie = implode(';', $cookie['1']);
}
//$cookie的结果最终是这样的形式: x=1;y=2; 其中x,y是cookie的键 数字1 数字2为值
将这个cookie存储起来 想什么时候用就直接用了
获取BODY
$r = tocurl('https://www.X.com/index.php?act=account&op=send_code','',$send,1);
$preg_json = '/{(.*?)}/m';
if(preg_match($preg_json,$r,$json)){
$json = $json['0'];
}
我这个获取比较有局限性 ;因为我知道请求的地址是返回json这个的;这个正则可以根据需求来写;
网上获取body的方法是这样的
list($header, $body) = explode("\r\n\r\n", $r, 2);
但是这个使用了没有效果 所以最终根据实际需求 写个正则匹配了;
使用COOKIE
使用cookie也很简单
curl_setopt($ch, CURLOPT_COOKIE, $cookie);//$cookie格式 x=1;y=2
这样对方就可以使用$_COOKIE['X']获取到值了