使用CURL发送cookie以及获得返回的cookie

一个简单的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;
}

这里面重点说的有两点

  1. 获取返回的cookie
  2. 获取返回的body

获取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']获取到值了

猜你喜欢

转载自blog.csdn.net/slyjit/article/details/81812172